A011.シューティング基本

シューティングの基本である自機がショットを撃つプログラムです。

http://dxlib.o.oo7.jp/dxprogram.html#N5

DXライブラリを参考にしました!

 

-- conf.lua

function love.conf(t)
	t.window.width = 640
	t.window.height = 480
end

640x480で設計していますので、コンフィグファイルを設定しておきましょう。

 

-- main.lua

local	MAX_SHOT = 4
local	SHOT_INTERVAL = 0.2

local	player_x, player_y
local	shot_valid = {}
local	shot_x = {}
local	shot_y = {}
local	shot_dt = 0

local	keystate = {}

function love.load()
	-- プレイヤーの初期位置をセット
	player_x = 320
	player_y = 400
	-- ショットの存在を初期化する
	for i = 1, MAX_SHOT do
		shot_valid[i] = false
	end
end

function love.keypressed(key, irepeat)
	keystate[key] = true
end

function love.keyreleased(key)
	keystate[key] = false
	if key == "escape" then
		love.event.quit()
	end
end


function draw_box(
	-- DXライブラリ風
	left,
	top,
	right,
	bottom,
	color,
	fill_flag
	)
	-- なければ、初期セット
	color = color or {}
	fill_flag = fill_flag or true
	
	-- fillを生成
	local	fill = "line"
	if fill_flag then fill = "fill" end
	
	-- 色をセット
	local	get_color = { love.graphics.getColor() }
	love.graphics.setColor(color[1] or 0, color[2] or 0, color[3] or 0, color[4] or 255)
	
	-- 描画!
	love.graphics.polygon(
		fill,
		left,
		top,
		right,
		top,
		right,
		bottom,
		left,
		bottom
	)
	
	-- 色を復帰
	love.graphics.setColor(unpack(get_color))
end

function love.update(dt)
	local	player_move = dt * 300
	local	shot_move = dt * 500
	
	-- プレイヤー移動
	if keystate.right then
		player_x = player_x + player_move
	end
	if keystate.left then
		player_x = player_x - player_move
	end
	
	-- ショット移動
	for i = 1, MAX_SHOT do
		-- ショットが有効だったら、位置をずらす
		if shot_valid[i] == true then
			shot_y[i] = shot_y[i] - shot_move
			-- 画面外に出ていたら、ショットを無効に
			if shot_y[i] < -32 then shot_valid[i] = false end
		end
	end
	
	if keystate.z and shot_dt >= SHOT_INTERVAL then
		for i = 1, MAX_SHOT do
			-- 使われていないショットデータを発見
			if shot_valid[i] == false then
				
				shot_x[i] = player_x + 16
				shot_y[i] = player_y
				
				shot_valid[i] = true
				break
			end
		end
		shot_dt = 0
	end
	shot_dt = shot_dt + dt
end


function love.draw()
	-- プレイヤーを描画する
	draw_box(player_x, player_y, player_x + 48, player_y + 48, {255, 0, 0}, true)
	-- ショットを描画する
	for i = 1, MAX_SHOT do
		-- ショットデータが有効な時のみ描画
		if shot_valid[i] == true then
			draw_box(shot_x[i], shot_y[i], shot_x[i] + 16, shot_y[i] + 16, {255, 255, 255}, true)
		end
	end
end

カーソルで移動、キーボードのZでショットを放ちます!

移動には、デルタタイムを考慮しています。

ショットの格納の仕方は、ちょっとしたタスクシステムですね!

 

http://www.google.co.jp/#q=%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%20%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0