【PICO-8入門(5)】クラスを作って障害物をいっぱい作る

この記事はPICO-8を使ってゲームを作りに挑戦する初心者向けの記事です。連載になっているので初回から見たい方はこちらからどうぞ。

▷ レトロ風ゲームエンジンPICO-8でゲーム作ってみよう

 

さて、今回は簡単な障害物を作ってよりゲームっぽくしていこうかと思います。

ゲームっぽくなってくる分、開発難易度も上がってくるので頑張っておくれ(‘ω’)ノ

テーブルを使ってみよう

PICO-8には複数の値を入れられるテーブルというものがあります。

このテーブルはなんでも詰め込める便利な入れ物で変数も関数も入れられます。

で、このまとめて入れられるテーブルをどう使うかというと、例えば「プレイヤーキャラ」関係のものだけまとめたり、敵キャラだけのものをまとめたりして分けて管理してプログラムをわかりやすく作ることができます。

まぁ説明だけではわかりづらいと思うので前回の記事のプログラムをちょっと変更してみます。

player = {}
player.init = function()
  player.x = 60
  player.y = 60
  player.num = 1
end
player.update = function()
  if fcount % 5 == 0 then 
    player.num += 1 
    if player.num > 4 then 
      player.num = 1 
    end
  end
  if btn(0) then
    player.x -= 0.3
  end
  if btn(1) then 
    player.x += 0.3
  end
  if btn(4) then 
    player.y -= 0.3
  end
  if btn(5) then 
    player.y += 0.3
  end
end
player.draw = function()
  spr(player.num, player.x, player.y)
end

function _init()
  fcount = 0
  player.init()
end
function _update()
  fcount += 1
  if fcount > 32767 then 
    fcount = 0 
  end
  player.update()
end
function _draw()
  cls()
  player.draw()
end

さっくり説明するとまず「player = {}」でplayerというテーブルを作っています。

で、「player.init = function()」というところでinitという名前の関数を作って_uinit()にあったプレイヤーキャラに関係するものこっちに移しています。update、drawも同様です。で、作っただけでは実行されないので下の_init()、_update()、_draw()内に記述して実行しています。

プレイヤーキャラに関する変数にはすべて「player」をつけてplayerテーブルに入れます。「.」は「の」みたいな感じで「player.x」だったら「playerのx」みたいなもんだととりあえず思ってください。

fcountはプレイヤーキャラと直接は関係ないので_update()に残しています。

と、まぁこんな感じでまとめて整理して見やすくするわけです。

障害物のテーブルを作る

プレイヤーキャラと同じような感じで障害物を作りましょう。

ただテーブル名は面倒なのでenemyにしました(^^;)

enemy = {}
enemy.init = function()
  enemy.r = 10
  enemy.x = enemy.r + rnd(128 - enemy.r*2)
  enemy.y = -enemy.r
end
enemy.update = function()
  enemy.y += 5
  if enemy.y > 128 + enemy.r then
    enemy.y = -enemy.r
    enemy.x = enemy.r + rnd(128 - enemy.r*2)
  end
end
enemy.draw = function()
  circ(enemy.x, enemy.y, enemy.r, 7)
end

こんな感じになります↓

ランダムに出現

スプライトを作るのが面倒だったので障害物は円にしました。

ここまでちゃんとやってきていれば内容はわかると思います。ここで新しいのはrnd()くらいです。rnd()は0から引数で渡した数までの間でランダムで数字を返してくれる関数です。前後にenemy.rが入っているのは円の座標は中心の座標なので半径分ずらしておかないと画面外にはみ出るからです。

あと、上のプログラムでは省略してるけどinit()などの関数は_init()にちゃんと記述してね。

クラスを作って障害物を増やそう

障害物一個じゃゲームになんねぇぜ!!ってことで増やしましょう。こっからけっこうややこしくなってくるぞ!!

enemy_class = function(r, i)
  local obj = {}
  obj.init = function()
    obj.x = r + rnd(128 - r*2)
    obj.y = -(r * i * 2 + r)
    obj.r = r
  end
  obj.update = function()
    obj.y += 1
    if obj.y > 127 + obj.r then
      obj.y = -obj.r
      obj.x = obj.r + rnd(128 - obj.r*2)
    end
  end
  obj.draw = function()
    circ(obj.x, obj.y, obj.r, 7)
  end
  return obj
end

enemies = {}
for i = 1, 9, 1 do
  enemies[i] = enemy_class(8, i) 
end

function _init()
  fcount = 0
  player.init()
  for i = 1, #enemies, 1 do
    enemies[i].init()
  end
end
function _update()
  fcount += 1
  if fcount > 32767 then 
    fcount = 0 
  end
  player.update()
  for i = 1, #enemies, 1 do
    enemies[i].update()
  end
end
function _draw()
  cls()
  player.draw()
  for i = 1, #enemies, 1 do
    enemies[i].draw()
  end
end

がんばって入力するとこんな感じに動きます。

障害物いっぱい

ではさっくり解説していきます。

まず今回はクラスというものを作ります(正確にはプロトタイプというらしくてクラスとはちょっと違うみたい)。enemy_classの中身を見ると一つ前に作ったenemyテーブルとほぼ同じものがあります。ただobjという名前のテーブルになっています。

で、このobjテーブルには最初に「local」とついてます。これは「ここでしか使えない変数」の時に付けます。そして「ここ」はこの変数が入っている関数の中です。この関数の外に出ると消えます。だから関数の外から中身を見ることができません。逆にこのlocalがついていないものはグローバル変数と言ってどこからでも中身が見えます。

なのでこのenemy_class()の中で作られたobjはここから出たら消えます。ただ消える前にこの内容をreturnで送っています。送る先がenemies[i]になります。そして次の時はまた新しいobjが作られます。

もしobjにlocalがついていないとenemiesの中身が全部同じになっておかしくなります(試してみてね)。「毎回objの中身は新しくなってるはずなのになんで?」という疑問が湧くと思いますがこれはobjがグローバルでずっと存在していてenemiesの各要素と繋がっているからです。詳しく知りたい方は「アドレス渡し」とかで調べてください(‘ω’)ノ

ここで新しくfor文というものが出てきます。これは繰り返しを行う特殊な命令です。でこのfor文は「for 初期値, 終了値, 加算値 do」となっています。初期値から毎回加算値を足して終了値になるまで繰り返します。つまりここではenemies[1]からenemies[9]まで9個enemy_classを作っています。※注:PICO-8で使われているLua言語のテーブルの要素は[0]からではなく[1]からなんだそうです。

後半のfor文に出てくる「#enemies」はenemiesテーブルの要素数を意味します。つまり9になるわけです。

なんとなくでOK

今回は新しいことが多くてたぶん初心者にはかなりハードルの高い内容だと思います。

なので意味がわからなくてもとりあえず「こんな風に作ればいいんだな」くらいの感覚でいいです。

あとはいじくり倒して遊んで覚えてくれ(‘ω’)ノ

次回 ▷ 当たり判定とパーティクルでやられた感を出してみよう

 

BOOTHでサンプルプログラム無料ダウンロードできます

BOOTHでこのPICO-8入門講座で紹介したサンプルプログラムをダウンロードできます。

今回の記事の最後のプログラムが「sample5.p8」という名前で入っています。

同カテゴリー記事

記事の感想・コメント

※コメントはまだありません※

コメントを残す

メールアドレスが公開されることはありません。

最近作ったゲーム