山水堂
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でショットを放ちます!
移動には、デルタタイムを考慮しています。
ショットの格納の仕方は、ちょっとしたタスクシステムですね!