皆さんこんばんは
9つ工場の一番搾りを手に入れビール三昧の日々を送っているSです。

今回は重金属ガールの制作でPMOを使用せず移動処理を組んだのでその際にサンプルとして作った重力制御とスムースな加減速のmfaファイルを解説&公開したいと思います。
いつも通り自分メモとして記事を書きますので自分以外の人がみてもわからないかもしれません。
参考にする方はCF2.5のチュートリアルのチョコブレイクと縦スクロールシューティングあたりは理解していないときついと思います。

が、その前に…

前回の記事で急遽実施したアンケート結果の発表で~す!

なんと予想の3倍以上の10票入りました!!
有難うございます。
そして

堕ちる捜査官・・・・・3票
重金属ガール・・・・・4票
金字塔と冥府の王2・・3票+1票

となりました。
金字塔と冥府の王2の+1票はアンケート期間の終わった後にツイッターで寄せられた票です。
ツイッターの集計期間は7日までしかないのですができれば1ヶ月と1年と無期限をつけて欲しいですね。

情報の露出量から考えて妥当な結果となりました。
という訳で心置きなく重金属ガールの制作に邁進できます。
残り2つはいつでも制作を開始できるようにネタを溜めていこうと思います。


ここからCF2.5での自機動作のサンプル公開と解説します。

最初に
  • 衝突マスク
  • 高速ループ
  • mod
  • abs
  • int
を使っているので簡単に説明しておきます。

衝突マスクは特定の座標が「障害物」もしくは「はしご」かを判定するもので条件のストーリーボードコントロール(チェス盤と馬みたいなアイコン)にあります。

高速ループは指定した回数同じ命令を繰り返すためのものです。条件、アクションともに特別(歯車アイコン)の中にあります。
何らかの条件を使用しアクションでループを開始。
条件でループ実行中を選び繰り返したいアクションを入れる。
といった使い方をします。
最低でも2行使用します。

「mod」「abs」「int」は数式です。
数値Aを数値Bで割った時の余りを出すのが「mod」で「数値A mod 数値B」というように使用します。
例えば「13 mod 10」とすれば「3」と返してくれます。

「abs」は絶対値を返してくれます。
絶対値ってのは0からどれだけ離れているかを表しています。
わかりやすく言うとプラス・マイナスを除いて数字だけを返してくれます。
「abs(-3)」も「abs(3)」も「3」と返してくれます。

「int」は小数点以下を切り捨ててくれます。
「int(1.41421356)」の場合「1」となります。

詳しくはCF2.5のwikiを見てください。

ではサンプルの解説です。

まずは重力制御サンプルです。
フレーム「ゲーム的重力制御」のリストにコメントを入れているのでみればわかると思います。
基本的な考え方としては

重力→落下速度の最大値
重力加速度→1フレームごとに加算される速度
落下速度→現在の落下速度

となり落下速度分オブジェクトを下に移動させることになります。

条件・落下速度が重力より下
アクション・落下速度=現在の落下速度+重力加速度

条件は空中にいる時が判別できればなんでも良い
アクション・オブジェクトのY座標を現在のY座標+落下速度

文章にするとわかりにくいですがサンプルの重力基本の所をみれば理解しやすいと思います。

後は障害物に衝突したときに落下速度を0にするなりフラグなりなんなりで空中判定から地上判定へ切り替えてやれば重力制御の完成です。

ここまでできればジャンプに関しては落下速度をマイナスにしてやれば勝手に上昇した後落ちてきます。
重力を5、重力加速度を1、ジャンプ力を4とした場合
  1. 落下速度を-4にする→落下速度に加速度を加える--4+1=-3→Y座標を-3(3ドット上昇)
  2. 現在の落下速度は-3なので加速度を加えて-2→Y座標を-2
  3. -2+1=-1
  4. -1+1=0→落下速度0なのでこのフレームではオブジェクトは移動しない(ジャンプの頂点)
  5. 0+1=1→ここから落下し始める
  6. 1+1=2
  7. 2+1=3
  8. 3+1=4
  9. 4+1=5
  10. 以降は重力の5を超えてしまうので毎フレーム5ドットの落下
内部的にはこんな感じになります。
1フレームでの移動量が-3,-2,-1,0,1,2,3,4,5,5~と徐々に変わっていくのがわかると思います。
あとは重力と重力加速度をいろいろといじってやれば自分の納得できる挙動ができるのではないかと思います。


次に小数点以下の移動サンプルです。
こちらは1フレームに1ドットの移動よりも遅い移動を実現するためのサンプルです。
しかしゲーム画面がピクセル単位で構成されている以上1ドット以下の移動はできません。
なので1ドット以下の移動の表現は経過時間と絡める必要があります。
どういうことかと言うと

1フレームに0.5ドットの移動は不可能

2フレームに1ドットの移動は可能

ということです。

ここからは説明が難しいのでサンプルをみて解析してほしいのですが考え方としては

最低速度は1フレームに1/100ドット移動、つまり100フレームに1ドット移動とする
移動開始と共に経過フレーム数をカウント
カウントが100に達したら1ドット移動してカウントを初期化
加速して速度が2/100になったら50フレームに1ドット移動なのでカウントの上限を50に設定

といった感じ。

加速時のパラメータは
  • 現在の速度(移動速度)
  • 加速度
  • カウント(移動用タイマー)
  • 移動するタイミング
の4つになりリスト的には

移動開始とともに移動用タイマーを常に1加算していく
同時に移動速度に加速度を足していく
移動するタイミングは100を現在の速度で割った値
移動用タイマーの値が移動するタイミング以上になったら1ドット移動

となる。
現在の速度が100を超えたら機能しなくなるのでここでmodを利用しています。
移動速度 mod 100 として0~99を繰り返してます。

移動速度が100を超えたら上記の移動分に加えて1フレームにつき「int(移動速度/100)」ドット移動させています。
intを使って小数点以下を切り捨てています。

小数点以下の移動と1フレームに1ドット以上の移動の2つの処理を組み合わせて作っています。

減速に関しては移動速度から減速度を引く処理をするだけで他の処理は加速と兼用です。
移動の反転時は減速と加速が同時に働くように組んだので入力がない場合と反転入力がある場合とでは制動距離がかわるようになっています。

う~~~~~~~~~ん

そんな感じ!

あとはmfaファイルみてとしか言えない。
そもそもこの記事は後々自分がみて思い出せればいいのだ!←身も蓋もない(;´Д`)

最後にこのサンプルを経てできた重金属ガールの挙動がこちらになります。

ダウンロード

CGがつくと結構それっぽい動きになってますね。

カーソルキーとZXVキーで操作します。
サマンサのドキドキトレジャーハンティングのキーコンフィグプログラムをコピーしてexeファイルとおなじ場所に置けばキーコンフィグもできちゃうぞw

ジャンプとかできちゃいますがプレイヤー操作でジャンプする予定はありません。



しれっとα版を配布しつつ今回は終わりたいと思います。
ではでは!