レースゲームのハンドル操作ができません

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
どら

レースゲームのハンドル操作ができません

#1

投稿記事 by どら » 14年前

今、http://homepage2.nifty.com/natupaji/DxLib/dxfunc.htmlを見ながらレースゲームをつくっています。
アクセルバックは出来るんですが、なかなかうまくハンドル操作ができません。
http://sakura.hippy.jp/meta/のRaceGameみたいにしたいんですけとどうすればいいでしょうか。

[補正]URLタグを追加しました。 by softya(ソフト屋)

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

Re: レースゲームのハンドル操作ができません

#2

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

それだけの情報だと残念ですが回答は難しいです。
フォーラムルールをご覧頂いてテンプレートに従って記入頂けますか。
現状のソースコードをcodeタグで囲って貼ってください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

どら

Re: レースゲームのハンドル操作ができません

#3

投稿記事 by どら » 14年前

softyaさん回答ありがとうございました。
すいませんフォーラムルール見ていませんでした。

[1] 質問文
 [1.1] マリオカートみたいなレースゲームをつくりたい
 [1.2] プログラムコード
 
プログラムの一部ですがこんな感じです。

コード:


CAR_DAUN  = 0.005f;    
CAR_SPEED = 200.0f;    //車最高速度
CAR_CASOK = 0.08f;     //加速
CAR_SYOKI = 15.0f;     //車初期速度
CAR_BUREK = 1.5f;      //ブレーキの効き

//*****************************************************************************************************				
//表示
//*****************************************************************************************************	    			
		
		MV1SetPosition( BaguHandle , VGet( 320.0f, -1000.0f, 600.0f ) ) ;		
		MV1SetPosition( StegHandle , VGet( 320.0f,  200.0f , steg01 ) ) ;				
		
		MV1SetRotationXYZ( StegHandle , VGet( 0.0f, kabu * PHI_F / 180.0f, 0.0f ) ) ;
		
		MV1DrawModel( CarHandle ) ;
		MV1DrawModel( BaguHandle  ) ;		
		MV1DrawModel( StegHandle ) ;    					
		
//*****************************************************************************************************				
//ブレーキ処理		
//*****************************************************************************************************				
		
		if ( Key[KEY_INPUT_C]==1 ){		   	   	 	   		   
		   if(CheckSoundMem(bgm03)==0){
			   PlaySoundMem( bgm03 , DX_PLAYTYPE_BACK ) ;}     			  
		   if(flag==1 || 11){
			   flag=4;}
	       else if(flag==2 || 12){
			   flag=5;}		   		   
		}		
	
//*****************************************************************************************************				
//加速処理		
//*****************************************************************************************************				
		
		if    (Key[KEY_INPUT_Z]==1&&flag==11){
		   StopSoundFile() ; 
		   steg01=steg01+steg02;		   
		   flag==11;
		   stegD=1.0;
		   if(steg02<CAR_SPEED){
			   steg02=steg02+CAR_CASOK;}
		   if(CheckSoundMem(bgm02)==0){
			   PlaySoundMem( bgm02 , DX_PLAYTYPE_BACK ) ;}		  	
		}		
		
		else if(Key[KEY_INPUT_X]==1&&flag==12){
		   StopSoundFile() ; 
		   steg01=steg01-steg02;		   
		   flag==12;
		   stegD=1.0;
		   if(steg02<CAR_SPEED){
			   steg02=steg02+CAR_CASOK;}
		   if(CheckSoundMem(bgm02)==0){
			   PlaySoundMem( bgm02 , DX_PLAYTYPE_BACK ) ;}		  	
		}	
		
		
		
//*****************************************************************************************************				
//アクセル処理		
//*****************************************************************************************************				
		
		else if( Key[KEY_INPUT_Z]==1){ 
		   StopSoundFile() ; 		          
		   steg01=steg01+steg02;             
		   flag=11;                           
		   stegD=1.0;
		   steg02=CAR_SYOKI;
		   if(CheckSoundMem(bgm02)==0){        
			   PlaySoundMem( bgm02 , DX_PLAYTYPE_BACK ) ;}	  		   	  		   		   		
		}		
		
//*****************************************************************************************************				
//バック処理		
//*****************************************************************************************************						
		
		else if ( Key[ KEY_INPUT_X   ]  == 1 ){
		   StopSoundFile() ; 
		   steg01=steg01-steg02;		   
		   flag=12;
		   stegD=1.0;
		   steg02=CAR_SYOKI;
		   if(CheckSoundMem(bgm02)==0){
			   PlaySoundMem( bgm02 , DX_PLAYTYPE_BACK ) ;}		  		   
		}					

//*****************************************************************************************************				
//停止処理		
//*****************************************************************************************************						
		
		else{		  
		   StopSoundMem( bgm02 ) ;
		   if(flag==1||flag==11){
		     steg01=steg01+(steg02/stegD);
		     stegD=stegD+CAR_DAUN;		        		     
			 flag==1;		      
		   }  
	       else if(flag==2||flag==12){
		     steg01=steg01-(steg02/stegD);
		     stegD=stegD+CAR_DAUN;		     
		     flag==2;
		   } 	  		   	              	  
	       else if(flag==4){
		     steg01=steg01+(steg02/stegD/CAR_BUREK);     
		     stegD=stegD+CAR_DAUN;	 		  
		   }	  	   
		   else if(flag==5){
		     steg01=steg01-(steg02/stegD/CAR_BUREK);     
		     stegD=stegD+CAR_DAUN;			    
		     flag==5;
		   }	
		}	   
	    
//*****************************************************************************************************				
//*****************************************************************************************************


[1.3] ハンドル操作ができない
 [1.4] ハンドル操作をするにはどのようなプログラムにすればいいか

[2] 環境  
 [2.1] OS : Windows Vista Home Basic
 [2.2] コンパイラ名 : Microsoft Visual C++ 2010 Express

[3] その他
 ・C言語を始めてから2カ月くらいです。
 

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: レースゲームのハンドル操作ができません

#4

投稿記事 by h2so5 » 14年前

(地面がY軸に垂直な場合)X方向とZ方向の速度・加速度を計算しないと、直進しかできませんよ。

ハンドル操作の実装は、うまくいかなかったとしても具体的にどのような方法を試されたのですか?

どら

Re: レースゲームのハンドル操作ができません

#5

投稿記事 by どら » 14年前

>ハンドル操作の実装は、うまくいかなかったとしても具体的にどのような方法を試されたのですか?

キーボードの十字←→で地面(ステージ)を回転させて表示するようにしましたが
アクセルかバックをさせて←→を押すとかってに
地面が変な場所にずれてしまいます。

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

Re: レースゲームのハンドル操作ができません

#6

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

どら さんが書きました:>ハンドル操作の実装は、うまくいかなかったとしても具体的にどのような方法を試されたのですか?

キーボードの十字←→で地面(ステージ)を回転させて表示するようにしましたが
アクセルかバックをさせて←→を押すとかってに
地面が変な場所にずれてしまいます。
地形を回転させるのは間違っています。
少なくともカーレースのゲームなら速度と移動方向を元に移動ベクトルを計算で求めて車の座標を移動させる必要があります。車も移動方向に合わせて回転させてください。
アクセル/ブレーキは速度、ハンドル操作は移動方向の数値を変更します。厳密に言うと現実の車の挙動に似せるには速度に合わせてハンドル操作の移動方向のきき具合は可変しなければなりませんが最初は固定の方がはるかに楽ですので厳密さにこだわるのはやめましょう。


とりあえずカメラは上からの見下ろしの固定で良いので、ラジコンカーのように操作できるものを作ってみてください。

[追記]最初はすごく単純に作って、だんだんと加速度、慣性などの物理運動を簡易化したものを載せていくことでマリオカートに近づけて行けば良いと思います。まず、走り回れるものを目標にした上で次のようなことも勉強してください。
「3-1-1-1 変位と速度と加速度」
http://www.wakariyasui.sakura.ne.jp/3-1 ... okudo.html
「1.速度と加速度」
http://yasumoto.iuhw.ac.jp/HS_phys/1-5/1-5.htm
「慣性の法則」
http://www.max.hi-ho.ne.jp/lylle/undo1.html
どちらも日常的な感覚的には知っていることを物理法則としてまとめたモノです。ここを理解しないと車の挙動が作れません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: レースゲームのハンドル操作ができません

#7

投稿記事 by h2so5 » 14年前

どら さんが書きました:キーボードの十字←→で地面(ステージ)を回転させて表示するようにしましたが
アクセルかバックをさせて←→を押すとかってに
地面が変な場所にずれてしまいます。
ステージを回転させるにしても、車の座標を中心にステージを回転させないといけませんよ。
アクセルかバックをさせると、ステージの中心と車の中心の座標がずれます。
MV1SetRotationXYZは常にモデルの中心座標を中心に回転させるので、変な場所にずれることになります。

指定座標を中心にモデルを回転させるには
MGetTranslate
MGetRotY
などを使って変換行列を求め、MV1SetMatrix で座標変換を行う必要があります。

どら

Re: レースゲームのハンドル操作ができません

#8

投稿記事 by どら » 14年前

softyaさん 、h2so5さん
ありがとうございます。
ためしてみます。

どら

Re: レースゲームのハンドル操作ができません

#9

投稿記事 by どら » 14年前

どうすれば指定した座標を中心に回転できるのでしょうか
サンプルプログラムも見ましたかがやり方が分かりません...

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: レースゲームのハンドル操作ができません

#10

投稿記事 by h2so5 » 14年前

softyaさんの、ステージではなくて車を移動させる方法を試してみてはどうでしょうか?

あとレースゲームを作るのであれば一応、
高校数学程度の知識があったほうが良いと思われます。

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

Re: レースゲームのハンドル操作ができません

#11

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

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


閉鎖

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