読者です 読者をやめる 読者になる 読者になる

はじめてのしゅーてぃんぐ

ちょっと昔に、C++Luaで作ってみたものです。えらいガクガクするダメプログラムですが、ふと思い出したので置いてみます。

http://members.jcom.home.ne.jp/wtetsu/hajishu.zip

つくってみた経緯

シューティングとLuaの勉強がしたかったです。

  • C++オンリーだと、修正→再プレイを繰り返すのにいちいちビルドする必要があって大変
  • 敵とか弾の動きみたいに幾度もいじくる部分はスクリプトにしておくといいよ

という話はよく聞くけど具体的にどうするか不明だったのでとりあえず作りはじめみたものです。

これもっと作ってみるとしたら、D言語LuaD言語オンリーかに作り直したいなあ。

スクリプトの雰囲気

泥臭いです。Lua関数1つに、1つの弾の動きが対応する感じなんですが、絶対もっとスマートなやり方あります。

まあ雰囲気なので細かいところははしょります。


弾の動作定義はこんなんです。これは素朴に等速直線運動する弾Bullet00です。

--========================
-- ごく普通の弾
--========================
function Bullet00()
  self.set_graph("Rball01.png") -- グラフィック設定
  self.set_simple(true)
end

自機狙いなBullet00を撃つEnemy00はこんな感じ。

--========================
-- 自機狙い弾撃つザコ
--========================
function Enemy00()
  if self.callnum == 0 then -- 初回呼ばれたときの初期化
    self.set_graph("Enemy00.png")
    self.sleep(40)
  else
    local r = LuaGetAimRadian() -- 自機を狙う角度を取得
    LuaPlaySound("a.mp3") -- 撃つ音
    -- self.x、, self.xの位置から、初速度4.0でrの方向に撃つよ
    LuaCreateBullet("Bullet00", self.x, self.y, 4.0, r)
    self.sleep(40) -- 40フレーム待つよ
  end
end

Enemy00を右から左から出現させるステージスクリプトはこんな感じ。

while (true) do
  local i = 0
  -- 左から自機狙い弾ザコ
  for i=0, 2, 1 do
    LuaCreateEnemy("Enemy00", 0, 30, 2.0, -0.5)
    LuaSleep(80)
  end
  
  LuaSleep(100)
  
  -- 右から自機狙い弾ザコ
  for i=0, 3, 1 do
    LuaCreateEnemy("Enemy00", 320, 30, 2.0, 3.64)
    LuaSleep(60)
  end
  
  LuaSleep(130)
end -- 一生ループ

基本的に速度、加速度で動いていますが、動きに関数を設定することもできるので、三角関数使って単振動とか円運動みたいなこともできます。

-- 振幅80の単振動
function Enemy06_x()
  return (cos(PI/120*self.age))*80
end

-- 敵定義からはこんな感じにセットしておくとか
.
.
self.set_exp_x("Enemy06_x")
.
.
.

基本は1関数=1つの敵/1つの弾という感じなので、直感的でわかりやすいと思うんですけど、泥臭ーく作らなければならないです。

BulletMLみたいにかっこいい物をデザインできればかっこいいんですけどね。


前からちょっとずついじくってたんですが、もう完全に放置状態です。供養の意味も込めてここに。