前回三角関数を使ってオブジェクトを設置するでオブジェクトの設置を行いましたが、オブジェクトを正確に設置していくのは中々難しいものです。そこで今回はもっと手軽にオブジェクトを設置できるようにプログラミングして行こうと考えています。
まずは何をしたいのかを考えて、構造体を作っておくことに。
PlayerCreateObjectという構造体を作って、さっそくgPlayerObj変数で呼び出しています。次にオブジェクトのIDが全て記載されたリストを作っておきます。(今回はテストなので60種類程度のオブジェクト数ですが)
基礎設計はとりあえずここまで、次はエディターの開始と終了を作っていきます。
オブジェクトエディター開始のコマンドを入力したら、オブジェクト生成と同時にオブジェクトを自分の手前に出現させて自分が動いても自分の座標より数歩手前についてくるようにします。オブジョクトをくっつけるのはAttachObjectToPlayerです。AttachObjectToPlayerは対象となるプレイヤーに指定されたXYZ座標からついてまわるわけですが、これはプレイヤーを中心としたXYZ座標となっています。

上の図ですが、ピンク色の矢印がゲーム内のXYZ座標です。キャラクターはXが0度として280~290度あたりを向いています。キャラクターの向きと同じ方向に青色のY矢印が進んでいますが、これがキャラクターを中心としたXYZ座標です。つまりsin, cosを使用せず、Y座標を加算するだけでにキャラクターの正面にオブジェクトを設置できるわけです。
まずは「/create start」と入力したときの処理を見ていきましょう。
コマンドを入力したプレイヤーにのみ「オブジェクトエディットを開始します」と表示されるようになっています。文字の色を指定するために先ほどdefineしたものを使用しています。
次に以前クリエイトしたデータが残ってるかもしれないので値を初期化しておきます。gPlayerObj[playerid][y]を2にしているのはキャラクターよりちょっと手前にオブジェクトを表示させるためです。
その後、オブジェクト生成を行い、オブジェクトをキャラクターにつけるようにしています。
「/create end」は終了の表示とオブジェクトを破棄しているだけです。
入力されたキーの値を取得するのはOnPlayerKeyStateChange関数ですが、これはゲームで使用されるキーしか取得できないようです。なので使用できる範囲がかなり制限されるので使用には検討を要するでしょう。
キーコード表はこちらにあります。1と128を使用した理由は単にPS2コントローラーで使用したとき、それらがL1とR1だからです。エディター起動時のみgPlayerObj[playerid][id]変数に値が入っているのでif(gPlayerObj[playerid][id] != 0)を使ってエディタが起動しているかどうか判断します。起動しているときのみキーを判定し、1(L1)か128(R1)かで処理を変えています。
L1を押した場合、現在のオブジェクトを破棄し、今のオブジェクトIDより一つ下の番号のオブジェクトを生成しています。R1はその逆で一つ上の番号のオブジェクトを生成しています。
さて、一通りできたので実際に動作しているものを見てみましょう。釣堀のブロガーでもあるレノさんが撮影に協力してくれたので今回は動画です(音なし)。
とりあえず今回はオブジェクトの変更とキャラクターへくっつくという動作だけでした。次回はZ座標やXYZ軸の変更を記述しようと考えています。