3Dシューティング旋回

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
KSK
記事: 79
登録日時: 13年前

3Dシューティング旋回

#1

投稿記事 by KSK » 11年前

久しぶりに質問させていただきます。
僕は今3Dシューティングゲームを作っているのですが、旋回の仕方がわからないのです。
また、旋回した方向に進むようにしたいのですがどのようにすればよいでしょうか。
OSはWindows7,Visual C++,DXライブラリです。データを添付します。
よろしくお願いします。
添付ファイル
GameforSchoolFestival.7z
(13.08 MiB) ダウンロード数: 220 回


A


KSK
記事: 79
登録日時: 13年前

Re: 3Dシューティング旋回

#2

投稿記事 by KSK » 11年前

コメントアウトなどはしておりません。すみません。


A


アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 3Dシューティング旋回

#3

投稿記事 by softya(ソフト屋) » 11年前

その前に操作方法が不明なのですが教えてもらえませんか?

>コメントアウトなどはしておりません。すみません。
何か用語の勘違いを感じますよ。

コメントアウト・・・一部の機能をコメント化して殺すこと
コメント・・・機能の説明を書くこと
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 3Dシューティング旋回

#4

投稿記事 by softya(ソフト屋) » 11年前

ざっと見た感じ移動ベクトルや行列の存在を見つけられませんでした。
これらを使わないと思うようには動かせないと思います。最低限ベクトルの活用は必須です。

たとえば2Dで画面中を自在に移動する真上から見下ろしたRCカーは作れますか?
そういう知識は最低限必要です。

あとソースをアップする時にipch/debugフォルダやxxxxx.pdfなどは不要です。すごく小さくなるのでぜひ外して下さい。

【独り言】しかし急にいろんな人から3Dゲームの質問が増えたな・・・。ブームだろうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
てんむすキツネ
記事: 88
登録日時: 13年前
住所: 岡山

Re: 3Dシューティング旋回

#5

投稿記事 by てんむすキツネ » 11年前

3D初心者です。あなたよりも3D関係の知識は浅いかもしれません。

それと、ごめんなさい。圧縮ファイルが自分のに対応してないのでソースは見ていません。


本題ですが、その旋回は
「 画面の方向が変わり 」 、その「 変わった方向に進む 」という意味でしょうか?

自分の中では
旋回= 回転しながら向いている方向に進む(大きくカーブしてUターンする感じで)  という意識です。違っていたらすみません。

なら、自分のスピードと向かっている方向をラジアンで保存していればいいのでは?
角度 XとY XとZ をそれぞれ求めてその方向にあとは進ませればいいのでは?
要は

コード:

x-=cos(h_target)*set_spd;//自機X-=cos(画面の向いている方向)*スピード
z+=sin(h_target)*set_spd;
みたいに。
あとは、これをキーごとに設定して、
上ボタンなら~とか。
面倒ですね、はい。

あとはてきとうに、h_targetとか、画面の向いている方向の値を変えて
旋回しているように見えるまで式をつくっていけばいいと思います。

自分はベクトルとか数学的な知識がないのでこういう方法をとっていますが、
コードも長くなりますし
いい方法とはいえません。
オフトピック
 softya(ソフト屋)様、すごいです。
 ほとんどの質問に答えていらっしゃる・・・
【独り言】しかし急にいろんな人から3Dゲームの質問が増えたな・・・。ブームだろうか?
う、自分も含まれますよね・・・
助言、大変助かっています。
MLP!MLP!

KSK
記事: 79
登録日時: 13年前

Re: 3Dシューティング旋回

#6

投稿記事 by KSK » 11年前

いろいろありがとうございます。
操作方法はキーのW:前 S:後 D:右 A:左です。
ベクトル、行列については理解しておりません。
どのようなものなのでしょうか?


A


アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 3Dシューティング旋回

#7

投稿記事 by softya(ソフト屋) » 11年前

KSK さんが書きました:いろいろありがとうございます。
操作方法はキーのW:前 S:後 D:右 A:左です。
ベクトル、行列については理解しておりません。
どのようなものなのでしょうか?
どちらも高校で習う数学で、ベクトルは空間での向きと大きさを表します。ゲームで言えば、座標か進む方向と速度を表現するのに使います。
行列は、端的に言うとゲームとしてはモデルやベクトルの回転、拡縮、移動を行うための情報の2次元配列データです。本当の数学的な意味はもっとあります。
中学生だとしても、やり方だけ覚えれば何とか成るとは思います。

RCカーに関して作れそうですか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

KSK
記事: 79
登録日時: 13年前

Re: 3Dシューティング旋回

#8

投稿記事 by KSK » 11年前

やってみます。


A


KSK
記事: 79
登録日時: 13年前

Re: 3Dシューティング旋回

#9

投稿記事 by KSK » 11年前

すみません。
僕の力ではここまででした。
sin,cosをうまく使えませんでした。
見て頂ければ解ると思いますが、車の向きと移動していく方向が対応しません。
どうすればよいのでしょうか。
添付ファイル
RCCar_Distribution.zip
(2.19 MiB) ダウンロード数: 118 回


A


アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 3Dシューティング旋回

#10

投稿記事 by softya(ソフト屋) » 11年前

見てみました。
ややこしくなっていますが、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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

KSK
記事: 79
登録日時: 13年前

Re: 3Dシューティング旋回

#11

投稿記事 by KSK » 11年前

softyaさんの言うとおり(3)で分からなくなってしまいました。
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
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 3Dシューティング旋回

#12

投稿記事 by softya(ソフト屋) » 11年前

これは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次元でも変わりません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

KSK
記事: 79
登録日時: 13年前

Re: 3Dシューティング旋回

#13

投稿記事 by KSK » 11年前

出来ました!
ありがとうございます。
おかげでとても勉強になりました。


A


アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 3Dシューティング旋回

#14

投稿記事 by softya(ソフト屋) » 11年前

KSK さんが書きました:出来ました!
ありがとうございます。
おかげでとても勉強になりました。
3Dの方は大丈夫でしょうか?
XYZ軸の方向とか全然違いますので注意して下さい。
あとベクトルの回転にRCカーではsin/cosを使っていますが3軸もあるので行列を使って回転させないとややこしいことになります。
平面上の回転であるシンプルな1軸回転に限定すればsin/cosを使った方法は3Dでも有効です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

KSK
記事: 79
登録日時: 13年前

Re: 3Dシューティング旋回

#15

投稿記事 by KSK » 11年前

忘れて解決にしてしまいました。
行列とはどのようなものでしょうか?


A


アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 3Dシューティング旋回

#16

投稿記事 by softya(ソフト屋) » 11年前

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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

KSK
記事: 79
登録日時: 13年前

Re: 3Dシューティング旋回

#17

投稿記事 by KSK » 11年前

ありがとうございます。
ただ、未熟なものでどのようにすればよいのかわかりません。
ご教授願えないでしょうか?


A


アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 3Dシューティング旋回

#18

投稿記事 by softya(ソフト屋) » 11年前

「角度からベクトル」のサンプルコードを解説するとややこしくなるので、ご自分で色々実験される方が良いと思います。
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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

KSK
記事: 79
登録日時: 13年前

Re: 3Dシューティング旋回

#19

投稿記事 by KSK » 11年前

ありがとうございます。
ファイヤーフォックスはスターフォックスのことでしょうか?
何度もすみませんが、横(つまり前に進む方向より90°違う方向)に進むにはどうすればよいのか考えてもわからないのですが、
教えて頂けますか?


A


アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 3Dシューティング旋回

#20

投稿記事 by softya(ソフト屋) » 11年前

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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

KSK
記事: 79
登録日時: 13年前

Re: 3Dシューティング旋回

#21

投稿記事 by KSK » 11年前

なるほど。
出来ました。


A


KSK
記事: 79
登録日時: 13年前

Re: 3Dシューティング旋回

#22

投稿記事 by KSK » 11年前

常に自機の後ろにカメラをつけたいのですが、これも行列を使用しますか?


A


アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 3Dシューティング旋回

#23

投稿記事 by softya(ソフト屋) » 11年前

KSK さんが書きました:常に自機の後ろにカメラをつけたいのですが、これも行列を使用しますか?
RCカーの動きの範囲内ならカメラの座標をベクトル計算できます。
自機の移動ベクトルの逆方向にカメラがあるって事ですね。カメラの高さは自機の高さから計算できますよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

KSK
記事: 79
登録日時: 13年前

Re: 3Dシューティング旋回

#24

投稿記事 by KSK » 11年前

出来ました。
ありがとうございます。


A


KSK
記事: 79
登録日時: 13年前

Re: 3Dシューティング旋回

#25

投稿記事 by KSK » 11年前

すみません。
本当に怒られてしまうようなことですが、
2Dの画面に出る弾の最大個数を決めて弾を扱うプログラムはまだわかるのですが、
3Dの弾の間隔(前に発射された弾から何フレーム経ったか)で扱うプログラムを考えたのですがいまいちよく分からないのです。
本当に初歩的なことですみませんが、教えて頂けないでしょうか?


A


アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 3Dシューティング旋回

#26

投稿記事 by softya(ソフト屋) » 11年前

2Dの龍神録でもフレーム制御しているはずですがコードを見た事無いですか?
wait変数を構造体に追加して待ちたいフレーム数を設定して、カウントが0になったら再開で良いと思います。龍神録は違った方法かも。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

KSK
記事: 79
登録日時: 13年前

Re: 3Dシューティング旋回

#27

投稿記事 by KSK » 11年前

出来ました。
ありがとうございました。


A


KSK
記事: 79
登録日時: 13年前

Re: 3Dシューティング旋回

#28

投稿記事 by KSK » 11年前

いつもすみません。
3Dの当たり判定を検索したところいろいろ出てきたのですがどれを使っていいかわかりません。
こういう複雑な形状の当たり判定はどうすればよいのでしょうか?
お願いします。


A


アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 3Dシューティング旋回

#29

投稿記事 by softya(ソフト屋) » 11年前

KSK さんが書きました:いつもすみません。
3Dの当たり判定を検索したところいろいろ出てきたのですがどれを使っていいかわかりません。
こういう複雑な形状の当たり判定はどうすればよいのでしょうか?
お願いします。
話の脈絡が分かりませんが、こういう複雑な形状とはどんな形状でしょうか?
あと何と何を衝突判定したいのでしょうか?

3D空間でシューティングだと地形以外は球の当たり判定で済ませられるはずですが。
翼に当たり判定を付けたいのなら少しややこしくはなりますが、DXライブラリの3D当たり判定処理があるのでそれが使えます。

【補足】
そういえばフォーラムルールに則って、出来れば現状のソースコードの提供もお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

KSK
記事: 79
登録日時: 13年前

Re: 3Dシューティング旋回

#30

投稿記事 by KSK » 11年前

すみません。
当たり判定は教えて頂いた通り球を使いました。
ありがとうございました。
今困っているのはENEMYクラスへのPLAYER座標の渡し方です。
PLAYER座標を返す関数を作ったのですが、PLAYER座標が更新されず、当たり判定できません。
どうすればよいでしょうか?
添付ファイル
Distribution.zip
(1.11 MiB) ダウンロード数: 118 回


A


アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 3Dシューティング旋回

#31

投稿記事 by softya(ソフト屋) » 11年前

Player::GetPositionの事でしょうか?
引数が参照になっていないので値が戻っていないと思われますね。
void Player::GetPosition(VECTOR Position)
 ↓
void Player::GetPosition(VECTOR &Position)

ただ、参照にするよりも分りやすい戻り値にした方が良いと思いますよ。
VECTOR Player::GetPosition()
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

KSK
記事: 79
登録日時: 13年前

Re: 3Dシューティング旋回

#32

投稿記事 by KSK » 11年前

すみません。
VECTOR Player::GetPosition()にしても、座標が更新されません。
どうすればよいでしょうか。


A


アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 3Dシューティング旋回

#33

投稿記事 by softya(ソフト屋) » 11年前

添付してもらったコードにはPlayerクラスのインスタンスからGetPositionしている部分は見つかりませんでした。
なので、今どうやって使っているかを教えて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

KSK
記事: 79
登録日時: 13年前

Re: 3Dシューティング旋回

#34

投稿記事 by KSK » 11年前

いまはこうです。

コード:

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
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 3Dシューティング旋回

#35

投稿記事 by softya(ソフト屋) » 11年前

ローカル変数としてGameManager gm;が生成されていますが。
これだと本来のgmと保持している情報が違うのでは?
クラスのインスタンスはグローバルとローカルにあるものは別物ですよ。これは変数の関係と同じです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

KSK
記事: 79
登録日時: 13年前

Re: 3Dシューティング旋回

#36

投稿記事 by KSK » 11年前

そうなんですか!
ではどうすればよいでしょうか?


A


アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 3Dシューティング旋回

#37

投稿記事 by softya(ソフト屋) » 11年前

KSK さんが書きました:そうなんですか!
ではどうすればよいでしょうか?
KSKさんの知識量がわかりませんが、構造体変数を宣言したらその値はどうやって引渡しますか?
クラスのインスタンスも、それと同じです。
オブジェクト指向的に言えば、出来るだけ公開しない方が良いですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

KSK
記事: 79
登録日時: 13年前

Re: 3Dシューティング旋回

#38

投稿記事 by KSK » 11年前

関数の仮引数に構造体変数をとる、ということですか?


A


アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 3Dシューティング旋回

#39

投稿記事 by softya(ソフト屋) » 11年前

KSK さんが書きました:関数の仮引数に構造体変数をとる、ということですか?
仮引数も実引数もですけどね。
クラスも構造体も基本的に同じです。

まぁ、普通に渡すとコピーされるので参照渡しで渡してください。

【補足】
ふと考えるとgm自体グローバル変数と言って良いと思いますので、良い設計とはいえませんがグローバル変数としてgmを公開するのも方法です。
class GameManager自体がグローバル変数といっても良い設計なので、もう参照渡しにしてもグローバル変数にしても大差はないと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

KSK
記事: 79
登録日時: 13年前

Re: 3Dシューティング旋回

#40

投稿記事 by KSK » 11年前

すみません。
具体的にどうすればよいのかまでの知識はありません。
どうすればよいですか?


A


アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 3Dシューティング旋回

#41

投稿記事 by softya(ソフト屋) » 11年前

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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

KSK
記事: 79
登録日時: 13年前

Re: 3Dシューティング旋回

#42

投稿記事 by KSK » 11年前

そうするとこうなってしまいました。
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
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 3Dシューティング旋回

#43

投稿記事 by softya(ソフト屋) » 11年前

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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

KSK
記事: 79
登録日時: 13年前

Re: 3Dシューティング旋回

#44

投稿記事 by KSK » 11年前

出来ました。
ありがとうございます。
C++についての知識はほとんどと言って良い程ありません。
すみません。


A


アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 3Dシューティング旋回

#45

投稿記事 by softya(ソフト屋) » 11年前

KSK さんが書きました:出来ました。
ありがとうございます。
C++についての知識はほとんどと言って良い程ありません。
すみません。
C++は中途半端な知識で使っているとインスタンスとか色々罠にハマると思います。
「ロベールのC++教室」 こちらなどをちゃんと読んで勉強してみてください。
http://www7b.biglobe.ne.jp/~robe/cpphtml/
よく分からないなら無理せずC言語風に書くべきだと思います。

例えばメンバが全部publicなclassはstructと同じです。と言うよりstructで書くべきです。
【追記】あとインナークラスを使っている理由も良く分かりません。理由は何でしょう?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

KSK
記事: 79
登録日時: 13年前

Re: 3Dシューティング旋回

#46

投稿記事 by KSK » 11年前

ありがとうございます。
インナークラスを使った理由は自分でもよく分かりません。
不思議です。


A


KSK
記事: 79
登録日時: 13年前

Re: 3Dシューティング旋回

#47

投稿記事 by KSK » 11年前

すみません。
ちょっと気になることがあったのですが、
ファイルのパス指定のときに\\と/がありますが、どう違うのですか?


A


アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 3Dシューティング旋回

#48

投稿記事 by softya(ソフト屋) » 11年前

都合上全角で書きますが¥¥はMD-DOS時代からの指定方法で/はUnix/linuxの文化です。
本当は¥マークだけなのですが文字列中は¥はエスケープと見なされるので¥¥と書きます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

KSK
記事: 79
登録日時: 13年前

Re: 3Dシューティング旋回

#49

投稿記事 by KSK » 11年前

ありがとうございます。
音声ファイルをロードしたのですが\\だと音割れせず、/だと音割れします。
それで気になったのです。


A


アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 3Dシューティング旋回

#50

投稿記事 by softya(ソフト屋) » 11年前

KSK さんが書きました:ありがとうございます。
音声ファイルをロードしたのですが\\だと音割れせず、/だと音割れします。
それで気になったのです。
パスの書き方のせいで音割れは考えづらいので違う原因かと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

KSK
記事: 79
登録日時: 13年前

Re: 3Dシューティング旋回

#51

投稿記事 by KSK » 11年前

softyaさん他みなさんのおかげで何とか完成させることが出来ました!
ありがとうございました!


A


閉鎖

“C言語何でも質問掲示板” へ戻る