久しぶりにXNAねた。

これまでは自機の動きしか考えてなかったので、戦車っぽく弾の発射機能を考える。

昔いじってた玉転がりサンプルのHeightmapCollisionで試してみよう。
今回は適当に一発だけ打てればいいやという事で、
打ったかどうかを判定するboolをグローバルに宣言してあげる。

あとは、弾のModelクラスとそれの座標を計算するメソッドをUpdateに追加して、
Drowで描写すればよいのだ。
簡単だね!

なので、
追加するのは
 弾を打ったか判定するbool
 弾を表すModel
 弾の位置を表すVector3
 弾の撃った方向を表すMatrix
を適当だねって思う心を押さえ込んで、グローバルに宣言する。


で、まずはLoadContentで弾を読み込む。
    sphereBoll = Content.Load<Model>("sphere"); //めんどくさいので玉と同じModelをつかう

つぎに、イベントを拾うためにHandleInputにスペースを押された時の動作を入れる。
まず、弾打boolをtrueにする。

で、打った場所と方向を保持するために現在の位置を 弾の位置を表すVector3、弾の撃った方向を表すMatrixに保持する。
ただし、保持するのは初回だけ(falseがtrueになったとき)なのでif文にbool値を加える。

//スペース押されたら玉発射
if(currentKeyboardState.IsKeyDown(Keys.Space) && !isShoot){
isShoot = true;
spherePosition2 = spherePosition;
sphereRollingMatrix2 = sphereFacingMatrix; //向いている方向
}

変数名が・・・w


あとは時間がたつごとにspherePosition2が「上手く」変化していけば弾が向いてるほうに打てるはずなので、
vector3(0, 0, -8f)を作って、向いている方向を掛けてあげたものをspherePosition2に足してあげればいいんだね!
コードにするとこんな感じだね!

if(isShoot) {
Vector3 a = new Vector3(0f, 0f, -10f);

spherePosition2 += Vector3.Transform(a, sphereRollingMatrix2);

        //有る程度移動したら弾を消したいので
iss++;
if(iss > 120) {
iss = 0;
isShoot = false;
}

}

これをさっきの後ろに書いてあげればいいんだ。
ほら、簡単でしょ?(私はちょっと苦労しましたが)


実際動かしてみると、山を突っ切って移動しちゃうんですよ。
当たり前ですねw
弾はハイトマップ考慮してないですもんね。
弾もハイトマップに合わせて動かすのは簡単なので省略。

次は弾が壁にぶつかったときに爆発するようにする。
衝突判定と光を出すアニメ(サンプルがあったと)を・・・。


コンクールに入賞した作品凄いですねぇ、普通に売り出せるぜ。
ぼちぼちしていこう。