3Dシューティング旋回
3Dシューティング旋回
久しぶりに質問させていただきます。
僕は今3Dシューティングゲームを作っているのですが、旋回の仕方がわからないのです。
また、旋回した方向に進むようにしたいのですがどのようにすればよいでしょうか。
OSはWindows7,Visual C++,DXライブラリです。データを添付します。
よろしくお願いします。
僕は今3Dシューティングゲームを作っているのですが、旋回の仕方がわからないのです。
また、旋回した方向に進むようにしたいのですがどのようにすればよいでしょうか。
OSはWindows7,Visual C++,DXライブラリです。データを添付します。
よろしくお願いします。
- 添付ファイル
-
- GameforSchoolFestival.7z
- (13.08 MiB) ダウンロード数: 271 回
A
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dシューティング旋回
その前に操作方法が不明なのですが教えてもらえませんか?
>コメントアウトなどはしておりません。すみません。
何か用語の勘違いを感じますよ。
コメントアウト・・・一部の機能をコメント化して殺すこと
コメント・・・機能の説明を書くこと
>コメントアウトなどはしておりません。すみません。
何か用語の勘違いを感じますよ。
コメントアウト・・・一部の機能をコメント化して殺すこと
コメント・・・機能の説明を書くこと
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dシューティング旋回
ざっと見た感じ移動ベクトルや行列の存在を見つけられませんでした。
これらを使わないと思うようには動かせないと思います。最低限ベクトルの活用は必須です。
たとえば2Dで画面中を自在に移動する真上から見下ろしたRCカーは作れますか?
そういう知識は最低限必要です。
あとソースをアップする時にipch/debugフォルダやxxxxx.pdfなどは不要です。すごく小さくなるのでぜひ外して下さい。
【独り言】しかし急にいろんな人から3Dゲームの質問が増えたな・・・。ブームだろうか?
これらを使わないと思うようには動かせないと思います。最低限ベクトルの活用は必須です。
たとえば2Dで画面中を自在に移動する真上から見下ろしたRCカーは作れますか?
そういう知識は最低限必要です。
あとソースをアップする時にipch/debugフォルダやxxxxx.pdfなどは不要です。すごく小さくなるのでぜひ外して下さい。
【独り言】しかし急にいろんな人から3Dゲームの質問が増えたな・・・。ブームだろうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 3Dシューティング旋回
3D初心者です。あなたよりも3D関係の知識は浅いかもしれません。
それと、ごめんなさい。圧縮ファイルが自分のに対応してないのでソースは見ていません。
本題ですが、その旋回は
「 画面の方向が変わり 」 、その「 変わった方向に進む 」という意味でしょうか?
自分の中では
旋回= 回転しながら向いている方向に進む(大きくカーブしてUターンする感じで) という意識です。違っていたらすみません。
なら、自分のスピードと向かっている方向をラジアンで保存していればいいのでは?
角度 XとY XとZ をそれぞれ求めてその方向にあとは進ませればいいのでは?
要は みたいに。
あとは、これをキーごとに設定して、
上ボタンなら~とか。
面倒ですね、はい。
あとはてきとうに、h_targetとか、画面の向いている方向の値を変えて
旋回しているように見えるまで式をつくっていけばいいと思います。
自分はベクトルとか数学的な知識がないのでこういう方法をとっていますが、
コードも長くなりますし
いい方法とはいえません。
それと、ごめんなさい。圧縮ファイルが自分のに対応してないのでソースは見ていません。
本題ですが、その旋回は
「 画面の方向が変わり 」 、その「 変わった方向に進む 」という意味でしょうか?
自分の中では
旋回= 回転しながら向いている方向に進む(大きくカーブしてUターンする感じで) という意識です。違っていたらすみません。
なら、自分のスピードと向かっている方向をラジアンで保存していればいいのでは?
角度 XとY XとZ をそれぞれ求めてその方向にあとは進ませればいいのでは?
要は みたいに。
あとは、これをキーごとに設定して、
上ボタンなら~とか。
面倒ですね、はい。
あとはてきとうに、h_targetとか、画面の向いている方向の値を変えて
旋回しているように見えるまで式をつくっていけばいいと思います。
自分はベクトルとか数学的な知識がないのでこういう方法をとっていますが、
コードも長くなりますし
いい方法とはいえません。
オフトピック
softya(ソフト屋)様、すごいです。
ほとんどの質問に答えていらっしゃる・・・
助言、大変助かっています。
ほとんどの質問に答えていらっしゃる・・・
う、自分も含まれますよね・・・【独り言】しかし急にいろんな人から3Dゲームの質問が増えたな・・・。ブームだろうか?
助言、大変助かっています。
MLP!MLP!
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dシューティング旋回
どちらも高校で習う数学で、ベクトルは空間での向きと大きさを表します。ゲームで言えば、座標か進む方向と速度を表現するのに使います。KSK さんが書きました:いろいろありがとうございます。
操作方法はキーのW:前 S:後 D:右 A:左です。
ベクトル、行列については理解しておりません。
どのようなものなのでしょうか?
行列は、端的に言うとゲームとしてはモデルやベクトルの回転、拡縮、移動を行うための情報の2次元配列データです。本当の数学的な意味はもっとあります。
中学生だとしても、やり方だけ覚えれば何とか成るとは思います。
RCカーに関して作れそうですか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 3Dシューティング旋回
すみません。
僕の力ではここまででした。
sin,cosをうまく使えませんでした。
見て頂ければ解ると思いますが、車の向きと移動していく方向が対応しません。
どうすればよいのでしょうか。
僕の力ではここまででした。
sin,cosをうまく使えませんでした。
見て頂ければ解ると思いますが、車の向きと移動していく方向が対応しません。
どうすればよいのでしょうか。
- 添付ファイル
-
- RCCar_Distribution.zip
- (2.19 MiB) ダウンロード数: 167 回
A
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dシューティング旋回
見てみました。
ややこしくなっていますが、TargetX,TergetYはいらないと思います。
シンプルにするために次のようにして下さい。
(1) 旋回キーでは角度(car.roll)だけを決めます。
(2) 上下キーでは速度(car.Speed)の増減だけします。
(3) スピード(x,y)を求めます。car.rollをsinとcosしてcar.Speedを掛けたものがx,yに分けたスピードです。このスピード(x,y)が移動ベクトルと呼ばれるものですね。
(4) 常に移動をします。 座標(x,y)にスピード(x,y)を足します。
これでRCカーになると思います。肝は(3)の部分ですね。
ややこしくなっていますが、TargetX,TergetYはいらないと思います。
シンプルにするために次のようにして下さい。
(1) 旋回キーでは角度(car.roll)だけを決めます。
(2) 上下キーでは速度(car.Speed)の増減だけします。
(3) スピード(x,y)を求めます。car.rollをsinとcosしてcar.Speedを掛けたものがx,yに分けたスピードです。このスピード(x,y)が移動ベクトルと呼ばれるものですね。
(4) 常に移動をします。 座標(x,y)にスピード(x,y)を足します。
これでRCカーになると思います。肝は(3)の部分ですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 3Dシューティング旋回
softyaさんの言うとおり(3)で分からなくなってしまいました。
90°違う方向に行ってしまいます。
何故でしょうか。
90°違う方向に行ってしまいます。
何故でしょうか。
#include <DxLib.h>
#include <math.h>
typedef struct
{
int X;
int Y;
int Speed;
int SpeedX;
int SpeedY;
int Flag;
int tmpFlag;
double Roll;
int Graph;
}Car_t;
int WINAPI WinMain
(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
Car_t car;
SetGraphMode(640,480,32);
SetDrawScreen(DX_SCREEN_BACK);
ChangeWindowMode(TRUE);
DxLib_Init();
car.X=320;
car.Y=240;
car.Speed=0;
car.SpeedX=0;
car.SpeedY=0;
car.Flag=0;
car.tmpFlag=0;
car.Roll=0.0;
car.Graph=LoadGraph("CarGraph.png");
while
(
!ProcessMessage()&&
!ScreenFlip()&&
!ClearDrawScreen()&&
!CheckHitKey(KEY_INPUT_ESCAPE)
)
{
DrawRotaGraph(car.X,car.Y,1.0,car.Roll,car.Graph,TRUE);
if(CheckHitKey(KEY_INPUT_W))
{
car.Speed++;
if(car.Speed>50)
{
car.Speed=50;
}
}
if(CheckHitKey(KEY_INPUT_S))
{
car.Speed--;
if(car.Speed<-50)
{
car.Speed=-50;
}
}
if(CheckHitKey(KEY_INPUT_D))
{
car.Roll+=PHI/180*1;
}
if(CheckHitKey(KEY_INPUT_A))
{
car.Roll-=PHI/180*1;
}
if(!CheckHitKey(KEY_INPUT_W)&&!CheckHitKey(KEY_INPUT_S))
{
car.Speed=0;
}
car.SpeedX=cos(car.Roll)*car.Speed;
car.SpeedY=sin(car.Roll)*car.Speed;
car.X+=car.SpeedX;
car.Y+=car.SpeedY;
}
DxLib_End();
return 0;
}
A
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dシューティング旋回
これはsin/cosが90度ズレた関係にあるって知っていると解決します。
car.SpeedX=sin(car.Roll)*car.Speed;
car.SpeedY=cos(car.Roll)*car.Speed;
で90度のズレが解消します。
ただ、他にも問題があって上下などの方向性がおかしくなります。
狙ったベクトルを求めるには
car.SpeedX=sin(car.Roll)*car.Speed;
car.SpeedY=-cos(car.Roll)*car.Speed;
とすれば完全にRCカーとなるでしょう。
こういう所は画面座標系(yのプラスが下方向)と数学の時間に使うグラフ(yのプラスが上方向)の違いです。
これがベクトルの基本なのですが理解できましたでしょうか?
・ベクトルは移動量を表すことが出来る。
・方向と速度から移動ベクトルを求めることが出来る。
・座標と移動ベクトルを足すと移動先の座標と成る。
これは3次元でも変わりません。
car.SpeedX=sin(car.Roll)*car.Speed;
car.SpeedY=cos(car.Roll)*car.Speed;
で90度のズレが解消します。
ただ、他にも問題があって上下などの方向性がおかしくなります。
狙ったベクトルを求めるには
car.SpeedX=sin(car.Roll)*car.Speed;
car.SpeedY=-cos(car.Roll)*car.Speed;
とすれば完全にRCカーとなるでしょう。
こういう所は画面座標系(yのプラスが下方向)と数学の時間に使うグラフ(yのプラスが上方向)の違いです。
これがベクトルの基本なのですが理解できましたでしょうか?
・ベクトルは移動量を表すことが出来る。
・方向と速度から移動ベクトルを求めることが出来る。
・座標と移動ベクトルを足すと移動先の座標と成る。
これは3次元でも変わりません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dシューティング旋回
3Dの方は大丈夫でしょうか?KSK さんが書きました:出来ました!
ありがとうございます。
おかげでとても勉強になりました。
XYZ軸の方向とか全然違いますので注意して下さい。
あとベクトルの回転にRCカーではsin/cosを使っていますが3軸もあるので行列を使って回転させないとややこしいことになります。
平面上の回転であるシンプルな1軸回転に限定すればsin/cosを使った方法は3Dでも有効です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dシューティング旋回
【補足】解決は外しておきました。KSK さんが書きました:忘れて解決にしてしまいました。
行列とはどのようなものでしょうか?
この際は理屈は抜きで説明しますが、ベクトルを行列と演算すると回転・拡縮・移動したベクトルが得られます。
回転も3軸の回転が可能です。飛行機で言うとピッチ、ヨー、ロールですね(実は使い方次第でジンバルロックという問題があるのですが困ってからで良いです)。
同様にモデルに行列を設定するとモデルに対して回転・拡縮・移動が行われます。
カメラに関しても行列が演算に使われていますので3Dは行列抜きに語れません。
行列同士は掛け算や加算が可能ですが、今のところ掛け算さえ理解していれば良いですね。
掛け算は順番が重要で順番を間違えると結構とんでもないことになります。
X,Y,Zの掛け合わせにも順番があります。
MATRIX rotateMatrix= MMult( MMult( MGetRotZ( RotZ ), MGetRotX( -RotX ) ), MGetRotY( RotY ) );//回転マトリクス Z x X x Y
MATRIX myMatrix = MMult( rotateMatrix, MGetTranslate(position) ); //回転行列 × 移動行列 で 回転移動行列ができます。
MV1SetMatrix( myModel,myMatrix ) ; //モデルに設定します。
この例の場合の処理は移動ベクトルと回転差分は含まれていません。
つい最近のトピックより飛行体の処理。 スピードやピッチ、ヨー、ロールの回転などが可能です。
「角度からベクトル • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3 ... =30#p89119
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dシューティング旋回
「角度からベクトル」のサンプルコードを解説するとややこしくなるので、ご自分で色々実験される方が良いと思います。
3D空間での挙動は動作をイメージできるかどうかですので、色々いじってどんな風に動くか感覚で掴んでください。
大雑把につかめたのなら、細かい部分の質問にはお応えします。
とにかく理屈は分からなくて良いので、
MATRIX rotateMatrix= MMult( MMult( MGetRotZ( RotZ ), MGetRotX( -RotX ) ), MGetRotY( RotY ) );//回転マトリクス Z x X x Y
MATRIX myMatrix = MMult( rotateMatrix, MGetTranslate(position) ); //回転行列 × 移動行列 で 回転移動行列ができます。
MV1SetMatrix( myModel,myMatrix ) ; //モデルに設定します。
これで物体は回転して移動するんだなと言う程度の理解が出来ていれば良いです。
↓ 本当に理論面を解説するとこうなります。
「3D基礎知識」
http://www.ceres.dti.ne.jp/~ykuroda/oya ... sic3d.html
もし、ちゃんと勉強したければ
「Amazon.co.jp: ゲーム開発のための数学・物理学入門 改訂版 (Professional game programming): ウェンディ・スターラー, 山下 恵美子: 本」
http://www.amazon.co.jp/gp/product/toc/4797356774/
こういう本を買われたほうが良いでしょう。
まぁ、数学として行列を知っている大学生でも行列演算を使った応用の世界である3Dゲームを作るイメージを掴むのは大変なので、それなりの理解・勉強は避けられないと思ってもらったほうが良いと思います。
【補足】
エースコンバットのような物理運動をシミュレートして自由移動を許すシューティングは力学・数学的に色々難しなります。
ファイヤーフォックスの様な固定方向移動のシューティングを作る分にはエースコンバットよりもやることが減り楽ができます。
自分の出来ることに合わせてシューティングのルールを決めるのも時には必要かと。
3D空間での挙動は動作をイメージできるかどうかですので、色々いじってどんな風に動くか感覚で掴んでください。
大雑把につかめたのなら、細かい部分の質問にはお応えします。
とにかく理屈は分からなくて良いので、
MATRIX rotateMatrix= MMult( MMult( MGetRotZ( RotZ ), MGetRotX( -RotX ) ), MGetRotY( RotY ) );//回転マトリクス Z x X x Y
MATRIX myMatrix = MMult( rotateMatrix, MGetTranslate(position) ); //回転行列 × 移動行列 で 回転移動行列ができます。
MV1SetMatrix( myModel,myMatrix ) ; //モデルに設定します。
これで物体は回転して移動するんだなと言う程度の理解が出来ていれば良いです。
↓ 本当に理論面を解説するとこうなります。
「3D基礎知識」
http://www.ceres.dti.ne.jp/~ykuroda/oya ... sic3d.html
もし、ちゃんと勉強したければ
「Amazon.co.jp: ゲーム開発のための数学・物理学入門 改訂版 (Professional game programming): ウェンディ・スターラー, 山下 恵美子: 本」
http://www.amazon.co.jp/gp/product/toc/4797356774/
こういう本を買われたほうが良いでしょう。
まぁ、数学として行列を知っている大学生でも行列演算を使った応用の世界である3Dゲームを作るイメージを掴むのは大変なので、それなりの理解・勉強は避けられないと思ってもらったほうが良いと思います。
【補足】
エースコンバットのような物理運動をシミュレートして自由移動を許すシューティングは力学・数学的に色々難しなります。
ファイヤーフォックスの様な固定方向移動のシューティングを作る分にはエースコンバットよりもやることが減り楽ができます。
自分の出来ることに合わせてシューティングのルールを決めるのも時には必要かと。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 3Dシューティング旋回
ありがとうございます。
ファイヤーフォックスはスターフォックスのことでしょうか?
何度もすみませんが、横(つまり前に進む方向より90°違う方向)に進むにはどうすればよいのか考えてもわからないのですが、
教えて頂けますか?
ファイヤーフォックスはスターフォックスのことでしょうか?
何度もすみませんが、横(つまり前に進む方向より90°違う方向)に進むにはどうすればよいのか考えてもわからないのですが、
教えて頂けますか?
A
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dシューティング旋回
ごめんなさい。スターフォックスです。KSK さんが書きました:ありがとうございます。
ファイヤーフォックスはスターフォックスのことでしょうか?
何度もすみませんが、横(つまり前に進む方向より90°違う方向)に進むにはどうすればよいのか考えてもわからないのですが、
教えて頂けますか?
XZ平面における90度回転はRCカーと同じで行列も必要ありません。
これが分からないならRCカー自体のソースコードをわかってないことに成るんですが。
【補足】
RCカーはXY平面における回転ですので、これを軸をちょっと変えてXZ平面で行うだけです。
ただし、軸のプラスマイナスの方向が変わるのでそこは要注意です。
【さらに補足】
三角関数でつまずいているなら、ココらへんからもう一度。
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ] 補足資料 6章 sin, cosって何?(三角比の基本)」
http://dixq.net/g/h_06.html
ここも直感的。数学的な座標系なのでYのプラスは上方向。Xプラスは右方向。
「初心者のためのフラッシュレベルアップ講座」
http://www.procreo.jp/tutorial03.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dシューティング旋回
RCカーの動きの範囲内ならカメラの座標をベクトル計算できます。KSK さんが書きました:常に自機の後ろにカメラをつけたいのですが、これも行列を使用しますか?
自機の移動ベクトルの逆方向にカメラがあるって事ですね。カメラの高さは自機の高さから計算できますよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 3Dシューティング旋回
すみません。
本当に怒られてしまうようなことですが、
2Dの画面に出る弾の最大個数を決めて弾を扱うプログラムはまだわかるのですが、
3Dの弾の間隔(前に発射された弾から何フレーム経ったか)で扱うプログラムを考えたのですがいまいちよく分からないのです。
本当に初歩的なことですみませんが、教えて頂けないでしょうか?
本当に怒られてしまうようなことですが、
2Dの画面に出る弾の最大個数を決めて弾を扱うプログラムはまだわかるのですが、
3Dの弾の間隔(前に発射された弾から何フレーム経ったか)で扱うプログラムを考えたのですがいまいちよく分からないのです。
本当に初歩的なことですみませんが、教えて頂けないでしょうか?
A
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dシューティング旋回
2Dの龍神録でもフレーム制御しているはずですがコードを見た事無いですか?
wait変数を構造体に追加して待ちたいフレーム数を設定して、カウントが0になったら再開で良いと思います。龍神録は違った方法かも。
wait変数を構造体に追加して待ちたいフレーム数を設定して、カウントが0になったら再開で良いと思います。龍神録は違った方法かも。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 3Dシューティング旋回
いつもすみません。
3Dの当たり判定を検索したところいろいろ出てきたのですがどれを使っていいかわかりません。
こういう複雑な形状の当たり判定はどうすればよいのでしょうか?
お願いします。
3Dの当たり判定を検索したところいろいろ出てきたのですがどれを使っていいかわかりません。
こういう複雑な形状の当たり判定はどうすればよいのでしょうか?
お願いします。
A
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dシューティング旋回
話の脈絡が分かりませんが、こういう複雑な形状とはどんな形状でしょうか?KSK さんが書きました:いつもすみません。
3Dの当たり判定を検索したところいろいろ出てきたのですがどれを使っていいかわかりません。
こういう複雑な形状の当たり判定はどうすればよいのでしょうか?
お願いします。
あと何と何を衝突判定したいのでしょうか?
3D空間でシューティングだと地形以外は球の当たり判定で済ませられるはずですが。
翼に当たり判定を付けたいのなら少しややこしくはなりますが、DXライブラリの3D当たり判定処理があるのでそれが使えます。
【補足】
そういえばフォーラムルールに則って、出来れば現状のソースコードの提供もお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 3Dシューティング旋回
すみません。
当たり判定は教えて頂いた通り球を使いました。
ありがとうございました。
今困っているのはENEMYクラスへのPLAYER座標の渡し方です。
PLAYER座標を返す関数を作ったのですが、PLAYER座標が更新されず、当たり判定できません。
どうすればよいでしょうか?
当たり判定は教えて頂いた通り球を使いました。
ありがとうございました。
今困っているのはENEMYクラスへのPLAYER座標の渡し方です。
PLAYER座標を返す関数を作ったのですが、PLAYER座標が更新されず、当たり判定できません。
どうすればよいでしょうか?
- 添付ファイル
-
- Distribution.zip
- (1.11 MiB) ダウンロード数: 162 回
A
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dシューティング旋回
Player::GetPositionの事でしょうか?
引数が参照になっていないので値が戻っていないと思われますね。
void Player::GetPosition(VECTOR Position)
↓
void Player::GetPosition(VECTOR &Position)
ただ、参照にするよりも分りやすい戻り値にした方が良いと思いますよ。
VECTOR Player::GetPosition()
引数が参照になっていないので値が戻っていないと思われますね。
void Player::GetPosition(VECTOR Position)
↓
void Player::GetPosition(VECTOR &Position)
ただ、参照にするよりも分りやすい戻り値にした方が良いと思いますよ。
VECTOR Player::GetPosition()
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dシューティング旋回
添付してもらったコードにはPlayerクラスのインスタンスからGetPositionしている部分は見つかりませんでした。
なので、今どうやって使っているかを教えて下さい。
なので、今どうやって使っているかを教えて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 3Dシューティング旋回
いまはこうです。
void Enemy::Weak::CheckHit()
{
GameManager gm;
VECTOR PlayerPosition;
PlayerPosition=gm.pl.GetPosition();
DrawFormatString(0,32,GetColor(255,0,0),"%f,%f,%f",PlayerPosition.x,PlayerPosition.y,PlayerPosition.z);
for(int i=0;i<WEAKENEMYQUANTITY;i++)
{
if(gm.CheckCollison(PlayerPosition,2.5f,pos[i],5.0f))
{
DrawString(0,0,"OK",GetColor(255,0,0));
}
}
}
A
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dシューティング旋回
ローカル変数としてGameManager gm;が生成されていますが。
これだと本来のgmと保持している情報が違うのでは?
クラスのインスタンスはグローバルとローカルにあるものは別物ですよ。これは変数の関係と同じです。
これだと本来のgmと保持している情報が違うのでは?
クラスのインスタンスはグローバルとローカルにあるものは別物ですよ。これは変数の関係と同じです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dシューティング旋回
KSKさんの知識量がわかりませんが、構造体変数を宣言したらその値はどうやって引渡しますか?KSK さんが書きました:そうなんですか!
ではどうすればよいでしょうか?
クラスのインスタンスも、それと同じです。
オブジェクト指向的に言えば、出来るだけ公開しない方が良いですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dシューティング旋回
仮引数も実引数もですけどね。KSK さんが書きました:関数の仮引数に構造体変数をとる、ということですか?
クラスも構造体も基本的に同じです。
まぁ、普通に渡すとコピーされるので参照渡しで渡してください。
【補足】
ふと考えるとgm自体グローバル変数と言って良いと思いますので、良い設計とはいえませんがグローバル変数としてgmを公開するのも方法です。
class GameManager自体がグローバル変数といっても良い設計なので、もう参照渡しにしてもグローバル変数にしても大差はないと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dシューティング旋回
補足したんですが遅かったですね。KSK さんが書きました:すみません。
具体的にどうすればよいのかまでの知識はありません。
どうすればよいですか?
gm自体グローバル変数と言って良いと思いますので、良い設計とはいえませんがグローバル変数としてgmを公開するのも方法です。
class GameManager自体がグローバル変数といっても良い設計なので、もう参照渡しにしてもグローバル変数にしても大差はないと思います。
これは決してキレイな設計ではありません。
【追記】
公開方法を書いておきます。
これは構造体変数をexternする時と同じです。
main.cppに
GameManager gm;
を書きます。
GameManager.hに
extern GameManager gm;
を書けば何処からでもgmは参照できます。
GameManager gmpl;が有るようですがGameManager gm;に統一してください。
【補足】
じゃあキレイに設計するには?
って事で具体例が龍神録をベースにDixqさんがC++版の設計やコードを披露してらっしゃいます。
http://dixq.net/rp/ 一番下にリンクがあります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 3Dシューティング旋回
そうするとこうなってしまいました。
1>Enemy.obj : error LNK2001: 外部シンボル ""class GameManager gm" (?gm@@3VGameManager@@A)" は未解決です。
1>Player.obj : error LNK2001: 外部シンボル ""class GameManager gm" (?gm@@3VGameManager@@A)" は未解決です
1>Enemy.obj : error LNK2001: 外部シンボル ""class GameManager gm" (?gm@@3VGameManager@@A)" は未解決です。
1>Player.obj : error LNK2001: 外部シンボル ""class GameManager gm" (?gm@@3VGameManager@@A)" は未解決です
A
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dシューティング旋回
KSK さんが書きました:そうするとこうなってしまいました。
1>Enemy.obj : error LNK2001: 外部シンボル ""class GameManager gm" (?gm@@3VGameManager@@A)" は未解決です。
1>Player.obj : error LNK2001: 外部シンボル ""class GameManager gm" (?gm@@3VGameManager@@A)" は未解決です
って書きましたか?main.cppに
GameManager gm;
を書きます。
処でC++は何処のサイトあるいは書籍で勉強されているんでしょうか?
余りに知識が中途半端な気がするんですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dシューティング旋回
C++は中途半端な知識で使っているとインスタンスとか色々罠にハマると思います。KSK さんが書きました:出来ました。
ありがとうございます。
C++についての知識はほとんどと言って良い程ありません。
すみません。
「ロベールのC++教室」 こちらなどをちゃんと読んで勉強してみてください。
http://www7b.biglobe.ne.jp/~robe/cpphtml/
よく分からないなら無理せずC言語風に書くべきだと思います。
例えばメンバが全部publicなclassはstructと同じです。と言うよりstructで書くべきです。
【追記】あとインナークラスを使っている理由も良く分かりません。理由は何でしょう?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dシューティング旋回
都合上全角で書きますが¥¥はMD-DOS時代からの指定方法で/はUnix/linuxの文化です。
本当は¥マークだけなのですが文字列中は¥はエスケープと見なされるので¥¥と書きます。
本当は¥マークだけなのですが文字列中は¥はエスケープと見なされるので¥¥と書きます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dシューティング旋回
パスの書き方のせいで音割れは考えづらいので違う原因かと思います。KSK さんが書きました:ありがとうございます。
音声ファイルをロードしたのですが\\だと音割れせず、/だと音割れします。
それで気になったのです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。