投稿記事

講座の記事 (15)

Master.typeX 2023/08/04 11:22

GM:ステートマシン備忘録

どうもMaster.typeXです。

今回は趣向を変えて「ステートマシン」
という概念についてちょっと
忘れないように書いてみる。

ステートマシンとはなんぞや?

知らんがな。

それでいいのか第一声。
とりあえず今回の例として
この動画を見て欲しい。

プレイヤーキャラがいて、黄色いのがはしご、
緑のちっちゃいのがはしごの頂点である。

左右移動とはしごは
別々の処理を作らねばならぬのだが・・・


ステップイベント内:はしご開始処理


ステップイベント内:はしご中の移動処理

同じステップイベント内に書こうとすると
なかなか大変なことになる。
下手するとバグの温床にもなりかねない。

そこでステートマシンの出番である。

先程の2つの画像は同じステップイベント内で
書かれていたのだが、コレをクリエイトイベントに
書いておいて、実行させる方法がある。

//例 Createイベント内
statefree = function(){

//左右移動やはしご開始処理など

}

stateladder = function(){

//はしごの昇降などの処理

}

//初期ステートの設定
//ステップイベント内で state() と記述すれば
//stateに代入した処理を行ってくれる。
state = statefree;

こんな感じである。
実例がこちらなんだぜ。


クリエイトイベント内:左右移動などができる処理


クリエイトイベント内:はしご専門の処理

自分でもよくわかっていないが
ステート名=function()で
一部の動作を切り分けておけば
バグの可能性も減るし、仮に起きてもどっちのイベントか
判別しやすくなる

・・・と、思うんだよな。

とにかく。
プレイヤーの動作はこうやって
切り分けて作ると管理も楽なので
GM使いは試してみてはいかがだろうか。

まあ、ぶっちゃけた話
下記動画を見たほうがわかりやすいんですけどね!!!
英語だけど。

https://www.youtube.com/watch?v=yfFzz9mZkU4&t=121s

ということで今回はこの辺で!
また次回!

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

Master.typeX 2021/05/21 13:32

CF2.5講座第10回:簡単なシューティングゲームを組んでみよう!(後編)

どうも、Master.typeXです。
今回は続きとなってます。

前回記事はこちらから

前回はプレイヤーの生成やコントロールまでは
解説したものの、やたらと長くなりそうなので
敵や敵の出現処理、そして難易度UPの処理の前で
終わってましたのでそこからです。

敵の生成処理

敵の生成の前に重要なオブジェクトを一つ。
それはO_制御用変数です。
コレは本来ならば一部グローバル変数として
取り扱う変数やここで使う生成処理など
ゲーム全体で使う変数を取り扱うだけのオブジェクトです。

残機やスコアはホントはグローバル変数の方が
取り回しはいいんですが、今回は講座用と言うことで
このようなオブジェクトを用意しました。

で、話を戻して敵を生成するには
このO_制御用変数の中にある「V_タイマー」を
1加算していき、一定値以上になったら敵を生成する
高速ループを一回回すという感じです。

敵出現時間ですが先程のオブジェクトの中にある「V_レベル」
を参照して出現時間が変わるようになってます。
レベルの処理についてはまた後述。

高速ループの内容は
敵を左上よりちょっと上に一旦作ってから
X座標をRRandom(2つの範囲内の乱数)で
変更しています。
そして、敵もバウンスボールで作ってあるので
その速度をRRandomで30~60までの
速度になるようにしています。

敵の処理

グループ分けとしては
「弾に当たったら破壊」
「プレイヤーが当たったらプレイヤーを破壊」
「画面外に行ったら破壊」「各ループ」
「各レベルの処理」
とちょっと多いですが中身は「弾に当たったら破壊」
以外はそんなに複雑怪奇じゃないと思います。

■弾に当たったら破壊
オブジェクト同士の衝突条件で
「プレイヤーの弾と敵が当たった時」に
発生するイベントです。
レベルが3より下ならスコアを獲得し
敵の撃破数を1加算します。

しかしレベルが3以上ならば
それに加えて高速ループで
8方向に弾を発射するようにしています。
いわゆる撃ち返し弾ですね。
撃ち返し弾のループ回数は8回で
方向は「ループ回数x4」となります。
ちなみに16方向にする場合は回数を16にして
方向を「ループ回数x2」にするとうまく出来ます。

なお、今回忘れてますが
プレイヤーの弾が敵に当たった時の処理は
破壊するかどうかはゲームデザインによります。
「通常弾は貫通しないがレーザーは貫通」なんて
処理を考えるようになったらちょっと頭を捻りましょう。
例えば弾に「F_貫通」というフラグを作って
レーザー弾ならコレをデフォルトでオンにして
先程の条件分岐がちょっと増えるが
非貫通時の処理と貫通時の処理で変えれば
なんとかなるはずです。

CF2.5+なら子イベントでもっと簡単に出来ます。

■プレイヤーが当たったらプレイヤーを破壊
そのまんまですね。
こちらも衝突条件で
「プレイヤーの当たり判定と敵」が衝突した時に
当たり判定とアイテム判定と外側のグラフィックを
すべて破壊してO_制御用変数の中の残機を1引きます。
そしてプレイヤーのスタート位置である
O_プレイヤー生成位置の「V_生成時間」を90に
設定します。敵弾も同じ処理です。

■画面外に行ったら破壊
コレ割と重要な処理です。
敵はY座標480以上になったら破壊し
敵弾は表示領域から-16離れたら破壊するという
単純な処理なのですが、コレを忘れると
オブジェクトが永遠に残り続け
すぐにフレームのオブジェクト制限に引っかかり
動作がおかしなことになります。
それに処理落ちを引き起こす原因となるので
「不要になったオブジェクトはちゃんと破壊する」
というのは多分どのツールでも同じなので
覚えておきましょう。

■各ループ
以前の講座で行ったオブジェクトごとに行われる
特殊な高速ループです。
ぶっちゃけ今回あんまり意味ないが一応念の為。

■「各レベルの処理」
ここは攻撃処理のイベントとなってます。
レベル1からプレヤーに向けて
弾を発射するようになっていて
レベル2以上は弾が3WAYになっています。

3WAY弾は弾生成の高速ループで
一旦プレイヤーのいる方向に合わせた後
ループインデックスが1なら現在方向から-2
2なら現在方向から+2すると3WAYになります。
・・・ぶっちゃけもっといい作り方があると思う。

レベルアップ処理

ここではO_制御用変数を使います。
敵撃破のイベントでこのオブジェクトの
「V_敵撃破数」を増加させていましたが
コレが一定位置以上になったら
「V_レベル」を増加させていきます。

レベルについてなんですが
そのまま敵を倒し続けても面白みもないので
「敵を倒せば倒すほど難易度が上がる」
というゲームシステムにしたくて導入しました。


とまあ、解説はこれで以上となります。
本当はここにゲームオーバーの処理を書くべきだったんですが
忘れてしまったのでしょうがない。

まあ、単純に残機が0より下になったら
文字列で「ゲームオーバー」とでも書かせて
スペースキーなりなんなりで
フレームをリセットさせれば完成なんですが。


応用するなら?

応用案とすればグレイズ・・・
いわゆるカスリ判定ですね。
コレはアイテム判定と同じく矩形の判定を作って
敵弾が判定と衝突した時に
スコアを伸ばすなり、なんなりすればいいと思います。
何に使うかは製作者のアイデア次第ですね。

敵の動きは今回はまっすぐ移動ですが
動作用のカウンターを作り
一定値になったら向きを変えて見たり
サインコサイン使ってゆらゆら動かしたりなど
色々作るといいかもしれません。
自分は数学弱いのであんまり使えないけどな!

後はボムを作ってみたり
自機のスピードを調整できるようにしたり
得点や前述のボムや1UP作ったりなど・・・
色々とアイデアが浮かぶはず。
自機のスピードを変えるときは
高速ループ式はちょっと不向きかもしれないが。


とまあ、これにてシューティング編は以上となります。
近いうちにちゃんとゲームオーバーを入れた
サンプル動作プログラムを
アツマールやPLiCyに公開したりします。
一緒に変なのも上げそうだが

ではまた次回!

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

Master.typeX 2021/05/18 21:23

CF2.5講座第10回:簡単なシューティングゲームを組んでみよう!(前編)

どうも、Master.typeXです。
今回は久しぶりにCF2.5講座です。

今回は一気にステップアップして
単純なシューティングゲームを
組んでみよう!

・・・と、言ってみたものの
処理が全然初心者向けじゃねぇ・・・

今回の講座プログラム(要CF2.5本体)

CF25_kouza_v1000.zip (149.88kB)

ダウンロード

今回の完成動作

ゲームオーバーは入れてませんと言うか
完全に入れ忘れてます。スマソ。

と、とりあえず一つ一つ解説。

プレイヤーの生成

プレイヤー生成イベントは
「初回」「復活」「プレイヤー生成イベント」の
3つのグループで構成されています。

「初回」は文字通りフレームが開始された時。
ここで「プレイヤー生成」という高速ループを
3回回しております。

なぜ3回なのかと言うと
以前の講座で一度にいっぺんに
オブジェクトを生成すると
固定値取得がうまく行かなかったりするのと
それによる同期がうまく取れなくなるのを防ぐため。
そして、わかりやすくするためである。
ぶっちゃけループは1回でもよかったりするが
3回分回したほうがわかりやすいと思ったので。

で、プレイヤーは
「当たり判定」「アイテム判定」「自機外側」
これら3つのパーツで構成されてます。

で、当たり判定がやけに小さいが
シューティングゲームの自機当たり判定は
めちゃくちゃ小さいのが当たり前
・・・と
誰かが言っていた気がするのでこのサイズ。
ちなみにGWは横2x縦1ドットです。ちっさ。

アイテム判定は今回使ってませんが
後でアイテム追加したいとか考えた時に。

自機外側はホントガワだけなので
好きなように変えてください。

あ、本番のときは
「当たり判定」と「アイテム判定」の
開始時に表示のチェックを外すのをお忘れなく。

「復活」は敵や敵弾に当たった時の処理で
どちらかに「当たり判定」が当たった時
生成ポイントの変数
「V_生成時間」を90にするようになっており
これをカウントダウンし、0になったら
「初回」同様「プレイヤー生成」を3回回す
というものです。

「プレイヤー生成イベント」は
高速ループ「プレイヤー生成」を行うところです。

プレイヤー操作

移動は第二回講座で行った高速ループ式移動を採用。
当たり判定をより確実にするためです。
組み方は第二回講座及び今回のフレームを参照。

弾の発射は
スペースキーかボタン1を押している時に
「V_弾発射間隔」が0になった時に弾を生成する
高速ループ「弾発射」を5回回しています。
弾発射はそれぞれ別の位置、方向から弾を
発射するため5回回しています。
ちなみに弾の動作は「バウンスボール」です。
方向は上方向で。
間違っても「オブジェクトを発射」を使わないように。
どうやっても止まらんぞ。
※こちらも過去回参照

で、弾発射の間隔は先程の5回生成後に
「V_弾発射間隔」を5に変更してます。
そしてスペースキーまたは、ボタン1を押している時
「V_弾発射間隔」が0より上なら
「V_弾発射間隔」を1引くという処理になってます。

無敵時間は文字通り
敵や弾に当たっても大丈夫な時間で
0より上なら1引いてく処理です。
数式エディタのmodと
オブジェクトの表示、非表示を駆使すれば
疑似点滅なんてことも可能ですが今回はやってません。
めんどくさいもん。

画面外移動制御は
プレイヤーが画面の外に出ないように
制限をかける処理です。
今回のプレイエリアは横320x縦448くらいです。
これより上回ったり下回ったりしたら
ちょっと回りくどいが
横は320(フレームサイズの半分)+160(右移動時。左移動時は-になる。)
縦は240(同上)+224(下移動時。上移動時は-になる。)
という具合にプレイヤー位置を変更してやろう。

追従処理は本体である「当たり判定」に
「アイテム判定」「自機外側」を追従させる処理です。
不要っちゃ不要だがそれぞれの変数Aが
「当たり判定」の「固定値」と同じなら
座標を「当たり判定」と同じところにするというもの。
画面外移動制御より後ろにしないと
ちょっと見た目がよろしくないので。
これは実際にイベントグループを前後させるとわかる。


とまあ、今回はここまで。
随分とまあ、長く書いたもんだ。

次回は敵の生成と動作処理を解説していきまっする。

ということでまた次回!

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

Master.typeX 2021/05/09 18:28

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

Master.typeX 2021/04/22 18:16

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

« 1 2 3

月別アーカイブ

記事を検索