ラジコン操作でゴーゴーの巻
ゴーゴーって(^^;。
●概要
早い話、キャラクターを「入力通りに動かす」のではなく、「移動方向を左右に回転させる」方式つまりレーシングゲームのハンドル操作をさせると言うことです。最近では余り需要のないルーチンだとは思いますが(ラジコン操作方式だと操作性が余りよくないし。慣れりゃどうってことないんだけど)。
●どうする?
「キーを左右に押したら右に曲がったり左に曲がったり」すりゃいーわけでして、アルゴリズムはこんな感じです。
何方向に動かせばいいかが決まったら360度を等分して、1方向ずつに番号をふります。ここまでが上の図解です。これができたらあとはキー入力を読んで右だったら方向を表す変数を+1し、左だったら-1すればいいわけです。反時計回りの時は逆になります。最後に移動させて終わり。
つまり、組むべき処理は以下の3つです。
8方向だったら、下のスクリプトのような感じになります。
;移動方向を設定 dim V,8 dim W,8 V.0=0,1,0,1,0,-1,0,-1 W.0=-1,-1,0,1,1,1,0,-1 S=1 ;キー入力 stick S,0 if S&1 : S-- if S&4 : S++ if S=0 : S=8 if S=9 : S=1 ;移動 X+=V.S Y+=W.S |
これで終わってもいいのですが、なんか手抜きな感じがするのでニーズにあわせた使い方を紹介しましょう。
●前準備
移動量は8方向なら上のように配列に入れてやればよいのですが、32方向とか64方向とかとなるとさすがに代入するのも移動量の計算をするのも面倒です。そこで、三角関数を使って1回転全て(ふつう360度だけど、DLLとかの都合で256度)の方向の移動量をあらかじめデータにしておきましょう。いわゆる「テーブル化」です。三角関数を計算するにはHSPEXT.DLLを使いますが、ファイルに保存すればDLLは不要になります。
#include"hspext.as" dim sc,2,256 emath 8 repeat 256 i=cnt emsin sc.0.i,i emcos sc.1.i,i loop bsave"SINCOS.DAT",sc.0 |
ちなみに、ここ以降のスクリプトは要点のみ載せることにします。
●ヘビゲーっぽく
キャラクタは常に移動していて、キーを1回押すたびにカクン、カクンと方向を変えるというものです。このスクリプトは8方向で動かしているので、はじめのスクリプトとほとんど変わりません。相違点はカーソルキーをトリガータイプで検出しているかどうか程度です。
;キー入力 d=0 stick s,0 if (s&1) : d++ if (s&4) : d-- ;移動--------------------- rad+=d*32 rad=(rad+256)\256 x+=sc.0.rad*3 y-=sc.1.rad*3 |
下から3行目の部分がわかりにくい、という人がいることと思いますので説明しましょう。変数rad(現在の移動方向)は、0〜255の範囲にないとエラーになってしまいますので、radがその範囲に常に収まるようにしなくてはなりません。で、まず値がマイナスになったときにプラスになるようにまず256を足します。その後256で割った余りを出すことで値が255を越えることはなくなり、角度が-256より小さい値にならない限りradは範囲内に収まるようになります。
if文を使って組んでもよいのですが、このように計算式で済ませたほうがスマートです。
余談ですが、カッコを省き、「\256」を「&255」に換えたほうが処理速度が(わずかながら)向上します。
●バイオハザード歩き
別にバイオハザードでなくてレースゲームだって似たようなものですが、ヘビゲーの例が勝手に動いていたのに対してこちらは前進もキー操作によって行うものです。バイオハザードなので後退とダッシュのオマケ付きです。
;キー入力 d=0 spd=0 stick s,31 if s&1 : d++ if s&4 : d-- if s&2 : spd=2 if s&8 : spd=-1 if (spd>0)&(s&16=16): spd=8 ;移動--------------------- rad+=d*8 rad=(rad+256)\256 x+=sc.0.rad*spd y-=sc.1.rad*spd |
あ、とりあえずスクリプトの説明をしておきます。キー入力状態を調べてカーソルキーが左右に入っていれば、dの値は-1か+1のどちらかになります(注:両方押されていると相殺して0になる)。上下に入っているときはspdの値を変化させて前進または後退するようにし、前進でかつスペースキーが押されていればspdの値を大きくしてダッシュさせます。ここまでが「キー入力」の部分。
続いて「移動」部分。はじめにdの数値が変化していればradの値がそれにあわせて変化し、角度が変わります。あとは範囲内に収まるように数値を調整し、角度別に移動量を収納した配列変数を参照して移動します。OK?
●HOVER!
このネタがわかる人いるかなあ。それはいいとして、アクセルふかしっぱなしでズギャーッとドリフトするような感覚を味わうためのものです。そんなドリドリ感覚=ホバークラフトって言うイメージが頭の隅にあったのですが、とにかくドリフトもどきです。訳のわからない話はいいのでスクリプトです。
;キー入力 d=0 stick s,31 if s&1 : d++ if s&4 : d-- if s&16 : d=d*2 ;移動--------------------- rad+=d*2 rad=(rad+256)\256 v+=sc.0.rad>>1 w-=sc.1.rad>>1 if v>0 : vv=v : else : vv=-v if w>0 : ww=w : else : ww=-w if sc.0.rad>0 : sin=sc.0.rad*16 : else : sin=-sc.0.rad*16 if sc.1.rad>0 : cos=sc.1.rad*16 : else : cos=-sc.1.rad*16 if (vv>sin) : v=sc.0.rad*16 if (ww>cos) : w=-sc.1.rad*16 x+=v>>1 y+=w>>1 |
これまで「移動量」として使った配列変数を「加速度」として使うことでドリフトっぽくしています。一見ややこしく見えますが、間に「加速」「移動量と最大移動量を絶対値にする」「最大移動量を超えないようにする」という処理が挟まっているだけです。本当はHSPにABS命令があればもう少し楽にかけるのですが・・・。
ここでは要点だけに絞っていますが、フルセットのスクリプトにあるboxf命令を消すとキャラクタの残像ができますので曲がったときにケツが滑る様子をご覧ください。
●さて
とまあこんな感じです。今回もまたわかるかどうだか微妙なラインではあります。しかし何度も言っていますが、実際に動かしたりいろいろいじればきっと理解できるはずです。そんなわけで動かせるスクリプトを用意しましたのでダウンロードしてみてくださいな。そういえばレースゲームらしく操作する方法を教えるの忘れていますな。これらをアレンジすればできますので研究してください(あ、逃げた)。
おっと、ネタは随時募集中ですよ(笑)。