【プチコン4講座】敵のスプライトを用意して動かそう

プチコン4

プチコン4 ミニゲーム スプライト

こんにちは。なおキーヌです。

ブログ毎日更新は257日目になります。

前回はスプライトの使い方の基礎を学びました。

今回は復習も兼ねてスプライトの使い方をさらに学んでみましょう。

スプライトを使えば見た目が面白いゲームを作ることができるので、
ミニゲームを作りつつしっかりと覚えてください。

それではプチコンミニゲーム講座第6回目を始めようと思います。

  1. 敵のスプライトの準備をしよう
  2. 簡単なステージを作ってみよう
  3. 敵を動かしてみよう
  4. 衝突判定がないとゲームとして成立しない件

敵のスプライトの準備をしよう

復習ということで再びSPSETを使って敵のスプライトを作りましょう。

プレイヤーはスプライトIDが0を指定したので、敵は1〜99までを使うようにルール決めします。

なぜ99まで使うのかというと、後から増えてもいいように多めに予備スペースを取っておきます。

RPGツクールとかを経験した人ならわかってくれると思うのですが、
例えばアイテムを作っている時に消耗アイテム・武器・防具などの順番で作ったとします。

とりあえず考えつくアイテムから順番につくって、次の番号に次のカテゴリを当てはめると
後からこの武器も追加したいとかになった場合スペースがないためアイテムの一番後ろに追加しなきゃいけませんよね。

そうなると管理がとても大変になり、あの武器はどこで設定したっけ?

ってなってしまいます。

実はこれはバグの大元でもあります。

なので基本的に連番で作るようなものは最初に使う範囲を決めておくといいでしょう。

それでは敵のスプライトを用意しましょう。

SPSET 1, 1000
SPOFS 1, 128, 96

ついでに位置をプレイヤーの横らへんにおいておきます。

プチコン4 出力結果その1

簡単なステージを作ってみよう

画面が真っ黒ではなんかゲームっぽくないですよね。

プチコン4ではマップはスプライトという概念では作らずに、
テキストスクリーンという仕組みを使います。

テキストスクリーンはちょっと特殊な作りなので今回は使用しません。

なので一旦スプライトでやっていこうと思います。

こちらも他のスプライトと被らないようにステージ用スプライトは200~399の範囲と決めておきましょう。

しかし1つ1つ定義していては日が暮れてしまいますし、
修正する時があったら1つ1つ修正しなければいけません。

とてもめんどうくさいので、ループ処理を使ってスプライトを定義する方法を覚えましょう!

まずは簡単にプレイヤーと敵の下に地面を作る感じで作りましょうか。

VAR G_I = 0

for G_I=0 to 24
    SPSET 200+G_I 1244
    SPOFS 200+G_I 0+(16*G_I),116
next

スプライトの大きさは特にいじらなければ16x16の正方形サイズです。

なので1つ隣のマスにおきたい場合は、X座標をループと後に+16していくと敷き詰めることができます。

画面の横幅は400ピクセルなので、16ピクセルのスプライトは25個置けることになります。

なのでループの回数が0~24に指定します。

ちなみに縦は240なので15個置けますね。

とりあえず横一列敷き詰めたいので今回はY座標はプレイヤー達の1つしたになる116固定にしました。

これで平坦な道にプレイヤーと敵がいる感じになりました。

いや、丸太かこれは……

プチコン4 出力結果その2

敵を動かしてみよう

敵は基本的に自動で動きます。

動かすにしても、特定のルートだけを動く敵や動かない敵など様々な敵が想像できますね。

とりあえず今回は左右に動く敵を作りましょう。

一番左まで行ったら右に移動して、右端まで行ったら左に移動するを繰り返します。

使うのは、もちろんSPOFSと条件式・座標変数と向き状態変数ですね。

とりあえず書いてみましょう。

VAR EX=128, EY=96
VAR E_DIRECT = 0


LOOP

    ' 敵の座標を調べて端っこに行ってたら向きを変える
    IF EX <= 0 THEN
        E_DIRECT = 1
    ELSEIF EX > 400-16 THEN
        E_DIRECT = 0
    ENDIF

    ' 敵の向きの方向へ進ませる
    IF E_DIRECT == 0 THEN
        DEC EX,1
    ELSE
        INC EX,1
    ENDIF

    ' 敵を指定座標へ動かす
    SPOFS 1, EX,EY

    ' 垂直同期
    VSYNC

ENDLOOP

最後の垂直同期は入れないとすさまじい速さになるので最大60FPSに固定するためです。

やっていることは常に敵の位置をチェックして、端っこに行ったら方向転換をしています。

スプライトの座標は左上が起点なので、一番端っこにいる状態はX座標が0の時です。

一番右にいる時は画面最大ピクセルが400なのでそこから-16引いた数値ですね。

座標が0未満、もしくは384以上の位置になった時に方向を変更して
その後方向に応じた座標加減算をしています。

そして計算が終わった後に座標を変更。と行った形です。

これで敵が横に移動を繰り返してシンプルな敵を作ることができました。

しかしプレイヤーにぶつかってもなにもならないのでゲームとは言えません。

プチコン4 出力結果その3

衝突判定がないとゲームとして成立しない件

この動く敵とプレイヤーに衝突判定と、ぶつかった時の処理を加えなければいけませんね。

マリオで例えるとクリボーにぶつかった時、マリオが飛び上がって1ミスしたことになります。

あんな感じでぶつかった判定・ぶつかった時の処理

という感じで作ります。

少しずつゲームに機能を追加していきましょう。

この積み上げていく感覚を覚えると快感になりますよ。

それでは次回、簡単な衝突判定をスプライトにつけていきます。

今回はここまでです。