ページ 11

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

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

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

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

Posted: 2011年3月12日(土) 13:35
by softya(ソフト屋)
それだけの情報だと残念ですが回答は難しいです。
フォーラムルールをご覧頂いてテンプレートに従って記入頂けますか。
現状のソースコードをcodeタグで囲って貼ってください。

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

Posted: 2011年3月17日(木) 19:33
by どら
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カ月くらいです。
 

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

Posted: 2011年3月17日(木) 19:42
by h2so5
(地面がY軸に垂直な場合)X方向とZ方向の速度・加速度を計算しないと、直進しかできませんよ。

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

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

Posted: 2011年3月18日(金) 16:52
by どら
>ハンドル操作の実装は、うまくいかなかったとしても具体的にどのような方法を試されたのですか?

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

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

Posted: 2011年3月18日(金) 17:33
by softya(ソフト屋)
どら さんが書きました:>ハンドル操作の実装は、うまくいかなかったとしても具体的にどのような方法を試されたのですか?

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


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

[追記]最初はすごく単純に作って、だんだんと加速度、慣性などの物理運動を簡易化したものを載せていくことでマリオカートに近づけて行けば良いと思います。まず、走り回れるものを目標にした上で次のようなことも勉強してください。
「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
どちらも日常的な感覚的には知っていることを物理法則としてまとめたモノです。ここを理解しないと車の挙動が作れません。

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

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

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

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

Posted: 2011年3月19日(土) 17:42
by どら
softyaさん 、h2so5さん
ありがとうございます。
ためしてみます。

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

Posted: 2011年3月19日(土) 19:48
by どら
どうすれば指定した座標を中心に回転できるのでしょうか
サンプルプログラムも見ましたかがやり方が分かりません...

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

Posted: 2011年3月19日(土) 20:00
by h2so5
softyaさんの、ステージではなくて車を移動させる方法を試してみてはどうでしょうか?

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

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

Posted: 2011年3月19日(土) 21:35
by softya(ソフト屋)
私の方法ならMV1SetRotationXYZで車自体を回せば良いと思います。

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

Posted: 2011年3月20日(日) 08:59
by どら
ではそうしてみます。