Difference between revisions of "Tutorial:Fire Toward Mouse (日本語)"

m
m
 
(One intermediate revision by the same user not shown)
Line 30: Line 30:
 
</source>
 
</source>
  
まず draw 関数で配色を白に設定します。その後に、時機となる長方形を描画します。
+
まず、 draw 関数で配色を白に設定します。その後に、自機となる長方形を描画します。
  
 
次の部分では弾丸用に灰色を設定します。 for 文では bullets テーブルの各値を通過します。 i は現在の弾丸に対する索引であり v はその値です。各弾丸に対しては画面上では円として描画します。
 
次の部分では弾丸用に灰色を設定します。 for 文では bullets テーブルの各値を通過します。 i は現在の弾丸に対する索引であり v はその値です。各弾丸に対しては画面上では円として描画します。
Line 74: Line 74:
  
 
== 最後に ==
 
== 最後に ==
全てが一緒に置かれた時にトップダウン・シューターゲームが始動します。自機を移動可能にして弾丸が画面外へと消えるようにしてましょう。
+
全てが一緒に置かれた時にトップダウン・シューター型のゲームが始動します。自機を移動可能にして弾丸が画面外へと消えるようにしてみましょう。
  
 
--[[User:Somethingmoreunique|Somethingmoreunique]]  2011年12月25日 03時22分 (世界標準時刻)
 
--[[User:Somethingmoreunique|Somethingmoreunique]]  2011年12月25日 03時22分 (世界標準時刻)

Latest revision as of 02:15, 9 December 2019

このチュートリアルでは利用者がクリックした時にマウスの方向へ弾丸を発射する方法について解説しています。読者は LOVE および Lua の基本を知っていると想定しています。全てのコードは main.lua 内へ配置してください。

初期化

function love.load()
	love.graphics.setBackgroundColor(0.21, 0.67, 0.97)
	
	bulletSpeed = 250
	
	bullets = {}
	player = {x=250, y=250, width=15, height=15}
end

一行目は綺麗な青色を背景色として設定します。 bulletSpeed は変数であり弾丸が毎秒ピクセル単位でどのくらいの速度で移動するか定義します。 bullets テーブルは全ての弾丸の一覧を保持しており player テーブルは自機に関する全ての情報を保持しています。

bullets テーブルの内側に各弾丸のテーブルがあります。それはプロパティとして x, y, dx, および dy を内包します。変数 dx および dy は、 X および Y 軸上において毎秒ピクセル端で弾丸をどれくらい移動させる必要があるかを定義します。

全て描画

function love.draw()
	love.graphics.setColor(1, 1, 1)
	love.graphics.rectangle("fill",  player.x, player.y, player.width, player.height)
	
	love.graphics.setColor(0.5, 0.5, 0.5)
	for i,v in ipairs(bullets) do
		love.graphics.circle("fill", v.x, v.y, 3)
	end
end

まず、 draw 関数で配色を白に設定します。その後に、自機となる長方形を描画します。

次の部分では弾丸用に灰色を設定します。 for 文では bullets テーブルの各値を通過します。 i は現在の弾丸に対する索引であり v はその値です。各弾丸に対しては画面上では円として描画します。

弾丸の新規位置決定

function love.update(dt)
	for i,v in ipairs(bullets) do
		v.x = v.x + (v.dx * dt)
		v.y = v.y + (v.dy * dt)
	end
end

もう一度 bullets の一覧を通過します。各々に対しては X および Y の位置を更新します。現在位置を取得してデルタ・タイムに対して乗算を行い変更を加えることで、これを行います。

弾丸の発射

function love.mousepressed(x, y, button)
	if button == 1 then
		local startX = player.x + player.width / 2
		local startY = player.y + player.height / 2
		local mouseX = x
		local mouseY = y
		
		local angle = math.atan2((mouseY - startY), (mouseX - startX))
		
		local bulletDx = bulletSpeed * math.cos(angle)
		local bulletDy = bulletSpeed * math.sin(angle)
		
		table.insert(bullets, {x = startX, y = startY, dx = bulletDx, dy = bulletDy})
	end
end

この最初の if 文は利用者が左クリックした場合のみ弾丸を発射を行います。startX および startY 変数は弾丸の原点を定義します。自機の中心から弾丸を発射したい場合は player.x + player.width / 2 を使用することで行うことができます。

角度を得るには math.atan2 を使用して Y の差および X の差を渡します。この関数は任意の二つのオブジェクト間の角度を検出するのに非常に役立ちます。

さらにいくつかの三角法を使用することにより bulletDx および bulletDy を検出します。これらの変数は X および Y 面により、どのくらいの速度で弾丸を速く移動させるかを定義します。

最終行へ弾丸の一覧へこちらの新しい弾丸を挿入してください。

最後に

全てが一緒に置かれた時にトップダウン・シューター型のゲームが始動します。自機を移動可能にして弾丸が画面外へと消えるようにしてみましょう。

--Somethingmoreunique 2011年12月25日 03時22分 (世界標準時刻)


そのほかの言語