前回はオブジェクトの変更、プレイヤーへの追尾だけで終わりました。今回は実際に 設置を行って見ようと思います。しかしそこには大きな問題があるようで・・・
実際作って見るまで気づかなかったのですが、AttachObjectToPlayer使用時に GetObjectPosでオブジェクトを取得しても、 どうやらAttachObjectToPlayerの座標を取得してしまうようです。
前回の説明したAttachObjectToPlayerの図ですが、青色の座標を取得してしまうようです。
結局三角関数使ってアレコレしましょうって話になるわけです。
とってもわかりにくい図ですが、AttachObjectToPlayerで座標を取得する 方法です。青い点の位置にオブジェクトがありYXの中点にキャラがおり、Aの方向を向いていると しましょう。
まずはxyの中点にオブジェクトを設置する方法を考えます。これは以前やった 三角関数を使ってオブジェクトを設置する と同じです。なのでここは問題ないでしょう。
これでAttachObjectToPlayerした場合のオブジェクトのY方向を動かしても取得することができます。 次にX方向です。
ここで勘違いしそうなのがxy座標の0度の位置ですが、0度はaの位置です。三角関数を使ってオブジェクトを設置する でキャラクターの目線方向ではなく、右肩が0度だったというのを覚えていれば分かると思いますが、 AttachObjectToPlayerした場合のオブジェクトのY方向を決めるときに90度加算しているので、実際の位置は 赤い点線の方向であって、0度はY軸の下の線ですよね。なのでX方向を決めるときはa度加算すればいいわけです。
前回と少し構造体が変わっているので注意して下さい。
大分(私が下手なのもあって)コードが増えましたが、やってる事は単純なものです。要所要所説明していきます。
まずは、オブジェクトの設置動作ですが。
if(newkeys == 2)とありますが、2はPS2コントローラーでいうセレクトで、ゲーム内ではしゃがみキーに 割り当てられています。(自由に変更して構いません。)
コメントにしているコードは先ほど述べた理由で動作してくれなかったです。AttachObjectToPlayerの 座標を取得してゲームフィールドの座標に設置したらそりゃあ意図した場所に設置されないわけですが 気づくのに時間がかかりました。
PlayerPlaySoundは音を鳴らすものですが、第二から第四引数(X,Y,Z座標の位置で音を鳴らす引数)は 現在動作しておらず、第一引数のプレイヤーIDの人にそのまま音が鳴るだけのようです。
if(IsPlayerInAnyVehicle(playerid))~の部分は乗車していたら車の角度と座標、そうでなかったら キャラクターの角度と座標を取得するようにしています。
次にキャラクターの位置にオブジェクトの位置を加算してオブジェクトの座標を取得するわけですが、 先ほど図に描いたものをコード化してあります。最終的にkpx、kpy、kpzに取得されるようになっています。 krx,kry,krzはオブジェクトの回転軸です。
最後に取得したXYZ座標・XYZ軸からCreateObjectでオブジェクトの設置を行っています。 それ以下のメッセージ送信ははデバッグ用なので削除してかまいません。
とりあえず、オブジェクトの変更とX座標の変更、X軸の変更のコードを解説していきます。 まずはオブジェクトの変更から。ここらへんはswitch(gPlayerObj[playerid][mode])を使って オブジェクトの操作を切り替えるようにしています。
これは前回と似たような感じですね。ただ音を鳴らしたり現在の操作モードを教えたりと簡単なインタフェースを 付け加えているだけです。
次にX座標を変更するプログラムです。なぜわざわざ
と書かず
と書いたのか、私も理由は良く分からなかったのですが、大いにぶっ壊れてくれるのでわざわざこのように 記述しました。(floatに--とか++したら~みたいなアレがあるんですかね。)
X軸の加算減算ですが、これも特に問題ないですね。特徴といえば360度を越えたら0度に戻ることくらいでしょうか。
動画もそのうち公開予定。
次はメニューを使ってオブジェクトの選択をもっと簡単にしようと考えています。