About

ゲーム作成用のオーサリングツール:MMF2とその機能などを紹介していたサイトです。2013年12月以降は新製品である Clickteam Fusion 2.5が発売されたため、ブログも含めCF2.5へ移行しました。MMF2関連ブログとして主要な記事は残りますが、MMF2と関連性のある新規記事追加は無くなります。開設以来多くのアクセス、誠にありがとうございました。

縦スクロールシューティング06

八方向移動:勝手に改造編

まずいきなりシューティング本体から作らず、先に8方向動作を別ファイルで作っておきましょう。8方向移動の自作はベースとしてdrnebulaの「8dir_spacemovement_widget_rev2」というサンプルを使うとあらかじめ決めてあります。このサンプルを自作8方向のベースに選んだのは楽をしようというより、解説的な意味で色々都合が良かったからです。オリジナルは内容や動作定義の仕方がとてもシンプル、そしてこのシンプルさにはまだ多く手を入れる余地があります。今回オリジナルのサンプルで使われている考え方や作り方を継承しつつ、ゲーム仕様に沿った内容に新たに作り直すことを目的としています。

最初はコリジョン無しで8方向移動の実現だけを考えてみましょう。まずオリジナルの動作サンプルを試してみてください。ソースコードはすこし整理したものの方が分かりやすいと思ったのでオリジナルをあらかじめ改変してあります。

drnebulaの「8dir_spacemovement_widget_rev2」(オリジナル)

ダウンロード:Prester改造版#00

オリジナルの「8 direction motion」には二種類の8方向移動が入っています。ソースコードに含まれているコメントにも書いてあるように、一つは斜め移動の際、移動量に補正を入れていない、もう一つはSin(45)を用いて斜め移動の際に補正を使っているサンプルとなります。これらは実際に移動させてみれば分かりますが、斜め移動の際移動量に補正をしていない方のサンプルは1フレームの移動量が大きいため同じだけキーを押していても斜め移動の際に補正有りのバージョンより速く進むことができます。

2つのウィジェット化された動作

2つのウィジェット化された動作

動作見本(SWF ビルド):20FPS設定>動作見本の50FPS設定はこちら

オリジナルの「8 direction motion」は移動量(オリジナルではスピードと表現されてる)をデフォルトで5としてありますが、これは高速ループを利用していません。高速ループを使っていないのでオリジナルにはコリジョン処理も最初からまったく付いていませんし、たぶん考慮されていません(純粋に八方向だけ実現している)。

スプライトの変数一覧

スプライトの変数一覧

あとは特徴として、ソースコードをみると分かりますがキー対応を実直に網羅してあります。複数キー同時押しのキー対応を全部書くと3キー同時押しまで考慮すると8方向はたしか15パターンくらいあるのですがオリジナルは主に2キー同時押しまでを考慮してあって、それに加えてテンキーでの操作も想定して更に9パターンの対応を作ってあります。こういう点も含めとても丁寧に作ってあるサンプルだと思います。

イベントリストエディタで見たコード一覧

イベントリストエディタで見たコード一覧

改造のポイント

コリジョンを付けるのでデテクタ用のスプライトと高速ループを用います。drnebulaのサンプルは高速ループを使っていないので前々回の高速ループレッスンで述べたとおりこのままだと正確なコリジョンを求めたり、スピードアップ処理を追加する場合仕様にだんだん悩まされることになります。しかしここから高速ループを使った動作に作り変えるのは比較的簡単なことです。

高速ループを使って移動量でスプライトの動作をコントロールする場合、同時押しキー対応は実直に全部書く必要はありません。特にオリジナルはだいたい主要なキー対応を一つ一つ書いてあるから一見するとこの書き方が直感的なんだけど、実現するためには手間がかかる上にちゃんと動くようにするまで点検するのが骨です。

実際の改造

コリジョンを付けるので一つのオブジェクトだけで完全なウィジェット化は達成できないからウィジェット化は諦めてオブジェクトイベントは削除します(ロジック以外再利用できる部分は今回あまり無いです)。イベントはイベントエディタ使ってまったく一から作り直します。そうするとCTRL+Lのショートカットでイベントリストエディタが使えるのも便利ですね。

オリジナルはスプライトのX座標に直接「スピード」を加算せずに、まず変数「Xpos」にスピードを加算していました。これは作り方としてまず高速ループ向きのやり方です。高速ループを使っていないので実際にはオリジナルだとイベントの最初の方で「常に実行」を使って座標の変更を一回だけ行っています。

最初に座標の変更を行ってる

最初に座標の変更を行ってる

移動を高速ループ使った方法に作り直す場合、「高速ループに挑戦」でやったのとほぼ同じ内容なのでこの辺はレッスンをやった人はすでに解決法が分かっていると思います。とりあえず実際にブログ筆者が改造したサンプルファイルをダウンロードしてオリジナルとの内容を比較してみてください。作り方としてはオリジナルと改造版、どちらもこれが正解というわけではなくもちろん優劣を競ってるわけでもありません。ただ「この人はこういう作り方をしたんだな」という視点で見ると「なぜこうやって作ったんだろう」という疑問が生まれると思います。で、それを来週以降解説していきます。

改造版サンプル:ソースコード:ダウンロード

改造版動作サンプル:Javaアプレット版

SWFビルド:動作サンプル(30FPS)


Comments are closed.