ページ 11

3Dゲームでの弾の発射

Posted: 2014年1月08日(水) 23:08
by ptolemy
3Dでプレイヤーが向いている前方に弾を発射させたいのですが、弾などは扱ったことがないのでどのように書けばいいんでしょうか?

私のイメージでは、
http://dixq.net/forum/viewtopic.php?f=3 ... 8&start=60
の変数X,Yを弾の座標に足し続ければ前に進んでいくと考えているのですが、どうなんでしょうか?

また、あたり判定は、2Dでの四角形を使ったやり方を応用したら使えますか?

とても説明が理解しにくいですが、よろしくお願いします。

Re: 3Dゲームでの弾の発射

Posted: 2014年1月08日(水) 23:19
by みけCAT
ptolemy さんが書きました:変数X,Yを弾の座標に足し続ければ前に進んでいくと考えているのですが、どうなんでしょうか?
だいたいそんな感じだと思います。
ただ、3DだとZも必要かもしれません。
ptolemy さんが書きました:あたり判定は、2Dでの四角形を使ったやり方を応用したら使えますか?
弾と自機/敵が球状なら比較的楽に使えそうですが、そうでなければ回転も考えると難しいかもしれません。
ただ、「応用」すれば使えるかもしれません。(もう少し考えた方がよさそうです)

Re: 3Dゲームでの弾の発射

Posted: 2014年1月09日(木) 00:14
by ptolemy
ありがとうございます。

弾を発射させるまでの弾の発射位置は、どうやってプレイヤーの座標にできますか?


あたり判定は、

コード:

if(tamaX>tekiX&&tamaX<tekiX+?)

みたいに弾がある範囲に入ったら敵を消すと、XYZ全てに設定してやればOKでしょうか?

Re: 3Dゲームでの弾の発射

Posted: 2014年1月10日(金) 18:31
by ptolemy
押されたら弾を発射し、フィールド外にいったらもとの座標に戻すと書いたら、添付ファイルのような現象になりました。

一発と一発の間の時間を設定してやればいいんですか?

Re: 3Dゲームでの弾の発射

Posted: 2014年1月10日(金) 20:31
by softya(ソフト屋)
2Dゲームの場合も同じですが、弾を発生させる周期(フレーム)を管理してやらないといけません。
ところで弾の発射方法が不明なのと、readme.txtの著作権表記が分からなすぎるのでもう少し丁寧に書かれたほうが良いと思います。

Re: 3Dゲームでの弾の発射

Posted: 2014年1月10日(金) 21:04
by ptolemy
発射方法は、xだけで書くと

コード:


X2=speed*-sin(ang);//撃つ方向
X2*=10;//X2の距離を延長
if(0を押したら){
tamaX+=X2;   
tamaflag=1;
}
if(弾がフィールド外に出たら){
tamaflag=0;
tamaX=targetX;//元の位置に戻す
}
と書きました。Zも同じように書きました。


テキストには、次回は、もう少し詳しく記載します。

Re: 3Dゲームでの弾の発射

Posted: 2014年1月10日(金) 21:13
by softya(ソフト屋)
これだと0を押してないと弾が進まないのでは?
tamaflagが有効活用されていない気がするんですが。
発射した瞬間に移動ベクトルを生成して、そのベクトルで勝手に移動し続けないと弾とはいえませんよね。
ptolemy さんは、2Dのシューティングを作れたって言ってませんでしたっけ? 同じなんですけどね。

Re: 3Dゲームでの弾の発射

Posted: 2014年1月10日(金) 22:14
by ptolemy
シューティングは、作ったことないです。
横スクロールアクションだけしか経験ないです。

if(0を押したら){○}
の○に移動ベクトルを書いてみます。

Re: 3Dゲームでの弾の発射

Posted: 2014年1月10日(金) 22:26
by softya(ソフト屋)
すいません。勘違いでした。
これは、2Dシューティングを作れば必ず出てくる処理です。
よく3Dゲームからやりたいというと、2Dゲームを色々作っとけば経験値が上がるよってのは、こういう経験を言います。
知らないと、3Dを含めて初めてだらけになるので3Dが最初だと覚えることが多くて大変だからです。
【追記】アクションでもマリオのファイヤーボールみたいのなら必要な処理です。

[弾の処理の概要]
弾は難しい言葉で状態遷移と言いますが、弾の状態をフラグなどで管理しないと行けません。
弾は未発射→発射と状態が変化しますので、状態を変数で管理します。
弾が発射できるのは未発射の時、発射された状態なら発射してはいけません。
それと弾の座標と移動ベクトルは、発射する瞬間に確定するので発射後はプレーヤーや発射キーの影響を受けないようにしないと行けません。
発射状態なら、移動ベクトルを弾の座標に加算して画面外判定と当たり判定と表示を行います。
画面外か別のものに当たったら当たり処理をして、非発射の状態に戻します。

となるので、もっと複雑な処理になります。
複数の弾を同時に撃てるなら更に配列で弾を複数管理しますので、構造体が活躍します。

Re: 3Dゲームでの弾の発射

Posted: 2014年1月10日(金) 22:49
by ptolemy
詳しい返答ありがとうございます。

非発射と発射の変数を使って0を連打されないようにしてみます。

Re: 3Dゲームでの弾の発射

Posted: 2014年1月11日(土) 18:21
by ptolemy
ありがとうございました。

flagが1になったら移動ベクトルを有効にし、さらflagが0でなければ0キーを押せないようにしたら出来ました。

コード:

if(tamaflag==1){
X=speed*-sin(angleY);
Y=speed*-cos(angleY);
X*=10;
Y*=10;
}
if(tamaflag==0){
 tamaX=targetX;//プレイヤーの位置に弾を戻す。
 tamaZ =targetZ;
}
if(0を押したら&&tamaflag==0){
tamaflag=1;
tamaX+=X;
tamaZ+=Y;
}
if(ステージ外に出たら){
tamaflag=0;
}

Re: 3Dゲームでの弾の発射

Posted: 2014年1月11日(土) 20:37
by softya(ソフト屋)
インデントはちゃんとする癖をつけたほうが良いですよ。
あと、このコードだと弾が飛んでいる最中にangleYが変わると弾が曲がると思います。
と言うか、tamaXとtamaZにベクトルを足し続けていないので弾が飛んでいない気が。

Re: 3Dゲームでの弾の発射

Posted: 2014年1月11日(土) 22:24
by ptolemy
tamaの座標はforで足し続けました。
しかし、どうしても回転させると曲がります。
どうしたらいいのでしょうか?

Re: 3Dゲームでの弾の発射

Posted: 2014年1月11日(土) 22:30
by softya(ソフト屋)
ptolemy さんが書きました:tamaの座標はforで足し続けました。
しかし、どうしても回転させると曲がります。
どうしたらいいのでしょうか?
ここでforって話が出るのも変なのですが、1フレームに1回しか足さないです。

それと私の書いた[弾の処理の概要]を忠実にコード化していれば、この問題は起きません。
色々重要な事をすっ飛ばしています。もう一度読み直して、コードと比べて見てください。【誤字修正】
そうですね。[弾の処理の概要]の処理の部分をバラバラにして、ひとつ残らずコメントとしてソースコードに書き加えてみてください。
絶対当てはまらない部分が出てくるはずです。

Re: 3Dゲームでの弾の発射

Posted: 2014年1月12日(日) 17:40
by ptolemy
forは、勘違いしてました。
forの部分は、修正して1フレームに一回にできました。

コード:

if(0を押して&&tamaflag==0){//未発射の時のみ発射
tamaflag=1;
}

if(tamaflag==0){//未発射の時は、プレイヤーの位置に戻す。
tamaX=targetX;
tamaZ=targetZ;
}
if(tamaflag==1){//発射の時は、移動ベクトルの加算と弾の表示を行う
X=speed*-sin(angleY);
Y=speed*-cos(angleY);
tamaX+X;
tamaZ+Y;
MV1DrawModel(player);
}

if(外にでたら){
tamaflag=0;
}
//_______________
//発射の時は、発射キーの影響を受けてないが、プレイヤーの影響を受けている。
//追加
if(マウスの左を押して&&Mouseflag==1){//マウスのフラグがONじゃないと回転できない。
angleY-=回転スピード 
 }
if(マウスの右を押して&&Mouseflag==1){
angleY-=回転スピード
}

Re: 3Dゲームでの弾の発射

Posted: 2014年1月12日(日) 17:48
by ptolemy

コード:

//続き

if(tamaflag==0){//未発射の時は、プレイヤーの位置に戻す。
tamaX=targetX;
tamaZ=targetZ;
Mouseflag=1;
}
if(tamaflag==1){//発射の時は、移動ベクトルの加算と弾の表示を行う
X=speed*-sin(angleY);
Y=speed*-cos(angleY);
tamaX+=X;
tamaZ+=Z;
MV1DrawModel(player);
Mouseflag=0;
}
弾が未発射の時のみ回転できる。
と書いてみました。
どうでしょうか。

追記
上の返信の加算のプログラムが+=ではなく+と書いてしましました。
上の返信は、もう文字制限によりかけないので修正できないです。

Re: 3Dゲームでの弾の発射

Posted: 2014年1月12日(日) 18:50
by softya(ソフト屋)
それだとプレーヤーが弾が飛んでいる間は回転できないのでは?

[補足]
弾は発射した瞬間からプレーヤーとは独立した物体です。
なので、弾とプレーヤーで変数を共有する事自体が間違いなのです。[うわぁ。誤字です]
弾の変数とプレーヤーの変数を分けて下さい。
弾の変数がプレーヤーの変数から影響をうけるのは、発射する瞬間の1フレームだけです。

Re: 3Dゲームでの弾の発射

Posted: 2014年1月13日(月) 00:13
by ptolemy
確かに回転できませんね。

コード:

if(tamaflag==0){
tamaangleY=angleY;
}
if(tamaflag==1){
//angleYの部分をtamaangleY
}
MV1SetRotationXYZ(tama,VGet(0.0f,tamaangleY,0.0f));

とtamaflagが0の時は、弾のアングルとプレイヤーのアングルを等しくして、1の時は、弾のアングルは、独立させる。

だとどうですか?

Re: 3Dゲームでの弾の発射

Posted: 2014年1月13日(月) 00:18
by softya(ソフト屋)
>とtamaflagが0の時は、弾のアングルとプレイヤーのアングルを等しくして、1の時は、弾のアングルは、独立させる。

ソースコードが分かりづらく成るだけだと思います。
if(0を押して&&tamaflag==0){//未発射の時のみ発射
このifの中で値を設定すれば済む話ですよ。

【補足】
一応、それでも出来ますが余りオススメできません。
if(tamaflag==0){//未発射の時は、プレイヤーの位置に戻す。
tamaX=targetX;
tamaZ=targetZ;
}
これもオススメできません。弾の座標も発射時に確定すべきだと思います。

Re: 3Dゲームでの弾の発射

Posted: 2014年1月13日(月) 00:35
by ptolemy
わかりました。

if(tamaflag==1)
の中のプログラムを
0を押したときのifに書き換えます。


また、前回分からなかったポインタですが、
*で定義した変数に
&を付けた変数を
代入することにより*で定義した変数が&を付けた変数のコピー(ショートカット)になる。
という理解で問題ありませんか?

Re: 3Dゲームでの弾の発射

Posted: 2014年1月13日(月) 10:23
by softya(ソフト屋)
ptolemy さんが書きました: また、前回分からなかったポインタですが、
*で定義した変数に
&を付けた変数を
代入することにより*で定義した変数が&を付けた変数のコピー(ショートカット)になる。
という理解で問題ありませんか?
それはポインタの一面ですが、大雑把にはあっています。
ただ、勘違いしていないか心配です。
「*で定義した変数」はポインタ変数と言いますが、それらをうまく使えて初めて理解したことになります。
それよりも今のプログラムコードは構造体を理解して使ったほうが良いように思います。

Re: 3Dゲームでの弾の発射

Posted: 2014年1月13日(月) 17:56
by ptolemy
構造体について勉強してみます。

Re: 3Dゲームでの弾の発射

Posted: 2014年1月13日(月) 20:45
by ptolemy
構造体は、
struct a/*構造体名*/{b/*変数の定義*/}c/*構造体の変数*/;

と書き、構造体の変数は、後に書くほどaが格納された構造体の変数が複製される。

構造体の変数をc1,c2....のように書いていってもc1とc2は、別行動をとる。

aには
c1.a
のようにアクセスする。

また、構造体の変数は、代入のみ行える。


という理解でよろしいですか?

これを使ってangleYとtamaangleYを整頓すればいいんですね。

Re: 3Dゲームでの弾の発射

Posted: 2014年1月13日(月) 20:48
by softya(ソフト屋)
大体はあってます。それ以外の変数の宣言とか使い方もあります。
あと敵とプレーヤーの関連する変数を別々の構造体にまとめる事で整理するのが正しい方法かと思います。

【補足】
物の単位でまとめると覚えて下さい。
弾と言う単位で構造体を作り、プレーヤーという単位で構造体を作ります。
その構造体を見れば、それぞれを制御するのに必要な物は全て入っているのが理想です。

Re: 3Dゲームでの弾の発射

Posted: 2014年1月24日(金) 18:31
by ptolemy
長らく返信できずすいません。
学校のテストで書けませんでした。

____
構造体は、比較ができないと書いてあったんですが、
プレイヤー等をまとめると、
当たり判定などで比較できないですよね?

座標の変数は、構造体化しない方がいいんですか?

Re: 3Dゲームでの弾の発射

Posted: 2014年1月24日(金) 18:46
by softya(ソフト屋)
構造体全体は一度に比較できませんが要素(メンバ)は比較できます。
なので、構造体の要素として座標を持っているならその座標を比較できます。

Re: 3Dゲームでの弾の発射

Posted: 2014年1月24日(金) 19:12
by ptolemy
そうなんですか!構造体化してみます。
ありがとうございました。