八方向移動:勝手に改造編
最初はコリジョン無しで8方向移動の実現だけを考えてみましょう。まずオリジナルの動作サンプルを試してみてください。ソースコードはすこし整理したものの方が分かりやすいと思ったのでオリジナルをあらかじめ改変してあります。
drnebulaの「8dir_spacemovement_widget_rev2」(オリジナル)
ダウンロード:Prester改造版#00
オリジナルの「8 direction motion」には二種類の8方向移動が入っています。ソースコードに含まれているコメントにも書いてあるように、一つは斜め移動の際、移動量に補正を入れていない、もう一つはSin(45)を用いて斜め移動の際に補正を使っているサンプルとなります。これらは実際に移動させてみれば分かりますが、斜め移動の際移動量に補正をしていない方のサンプルは1フレームの移動量が大きいため同じだけキーを押していても斜め移動の際に補正有りのバージョンより速く進むことができます。
動作見本(SWF ビルド):20FPS設定>動作見本の50FPS設定はこちら
オリジナルの「8 direction motion」は移動量(オリジナルではスピードと表現されてる)をデフォルトで5としてありますが、これは高速ループを利用していません。高速ループを使っていないのでオリジナルにはコリジョン処理も最初からまったく付いていませんし、たぶん考慮されていません(純粋に八方向だけ実現している)。
あとは特徴として、ソースコードをみると分かりますがキー対応を実直に網羅してあります。複数キー同時押しのキー対応を全部書くと3キー同時押しまで考慮すると8方向はたしか15パターンくらいあるのですがオリジナルは主に2キー同時押しまでを考慮してあって、それに加えてテンキーでの操作も想定して更に9パターンの対応を作ってあります。こういう点も含めとても丁寧に作ってあるサンプルだと思います。
改造のポイント
高速ループを使って移動量でスプライトの動作をコントロールする場合、同時押しキー対応は実直に全部書く必要はありません。特にオリジナルはだいたい主要なキー対応を一つ一つ書いてあるから一見するとこの書き方が直感的なんだけど、実現するためには手間がかかる上にちゃんと動くようにするまで点検するのが骨です。
実際の改造
オリジナルはスプライトのX座標に直接「スピード」を加算せずに、まず変数「Xpos」にスピードを加算していました。これは作り方としてまず高速ループ向きのやり方です。高速ループを使っていないので実際にはオリジナルだとイベントの最初の方で「常に実行」を使って座標の変更を一回だけ行っています。
移動を高速ループ使った方法に作り直す場合、「高速ループに挑戦」でやったのとほぼ同じ内容なのでこの辺はレッスンをやった人はすでに解決法が分かっていると思います。とりあえず実際にブログ筆者が改造したサンプルファイルをダウンロードしてオリジナルとの内容を比較してみてください。作り方としてはオリジナルと改造版、どちらもこれが正解というわけではなくもちろん優劣を競ってるわけでもありません。ただ「この人はこういう作り方をしたんだな」という視点で見ると「なぜこうやって作ったんだろう」という疑問が生まれると思います。で、それを来週以降解説していきます。
改造版サンプル:ソースコード:ダウンロード
改造版動作サンプル:Javaアプレット版
SWFビルド:動作サンプル(30FPS)