レースゲームのハンドル操作ができません
-
どら
レースゲームのハンドル操作ができません
今、http://homepage2.nifty.com/natupaji/DxLib/dxfunc.htmlを見ながらレースゲームをつくっています。
アクセルバックは出来るんですが、なかなかうまくハンドル操作ができません。
http://sakura.hippy.jp/meta/のRaceGameみたいにしたいんですけとどうすればいいでしょうか。
[補正]URLタグを追加しました。 by softya(ソフト屋)
アクセルバックは出来るんですが、なかなかうまくハンドル操作ができません。
http://sakura.hippy.jp/meta/のRaceGameみたいにしたいんですけとどうすればいいでしょうか。
[補正]URLタグを追加しました。 by softya(ソフト屋)
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: レースゲームのハンドル操作ができません
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
どら
Re: レースゲームのハンドル操作ができません
softyaさん回答ありがとうございました。
すいませんフォーラムルール見ていませんでした。
[1] 質問文
[1.1] マリオカートみたいなレースゲームをつくりたい
[1.2] プログラムコード
プログラムの一部ですがこんな感じです。
[1.3] ハンドル操作ができない
[1.4] ハンドル操作をするにはどのようなプログラムにすればいいか
[2] 環境
[2.1] OS : Windows Vista Home Basic
[2.2] コンパイラ名 : Microsoft Visual C++ 2010 Express
[3] その他
・C言語を始めてから2カ月くらいです。
すいませんフォーラムルール見ていませんでした。
[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: レースゲームのハンドル操作ができません
(地面がY軸に垂直な場合)X方向とZ方向の速度・加速度を計算しないと、直進しかできませんよ。
ハンドル操作の実装は、うまくいかなかったとしても具体的にどのような方法を試されたのですか?
ハンドル操作の実装は、うまくいかなかったとしても具体的にどのような方法を試されたのですか?
-
どら
Re: レースゲームのハンドル操作ができません
>ハンドル操作の実装は、うまくいかなかったとしても具体的にどのような方法を試されたのですか?
キーボードの十字←→で地面(ステージ)を回転させて表示するようにしましたが
アクセルかバックをさせて←→を押すとかってに
地面が変な場所にずれてしまいます。
キーボードの十字←→で地面(ステージ)を回転させて表示するようにしましたが
アクセルかバックをさせて←→を押すとかってに
地面が変な場所にずれてしまいます。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: レースゲームのハンドル操作ができません
地形を回転させるのは間違っています。どら さんが書きました:>ハンドル操作の実装は、うまくいかなかったとしても具体的にどのような方法を試されたのですか?
キーボードの十字←→で地面(ステージ)を回転させて表示するようにしましたが
アクセルかバックをさせて←→を押すとかってに
地面が変な場所にずれてしまいます。
少なくともカーレースのゲームなら速度と移動方向を元に移動ベクトルを計算で求めて車の座標を移動させる必要があります。車も移動方向に合わせて回転させてください。
アクセル/ブレーキは速度、ハンドル操作は移動方向の数値を変更します。厳密に言うと現実の車の挙動に似せるには速度に合わせてハンドル操作の移動方向のきき具合は可変しなければなりませんが最初は固定の方がはるかに楽ですので厳密さにこだわるのはやめましょう。
とりあえずカメラは上からの見下ろしの固定で良いので、ラジコンカーのように操作できるものを作ってみてください。
[追記]最初はすごく単純に作って、だんだんと加速度、慣性などの物理運動を簡易化したものを載せていくことでマリオカートに近づけて行けば良いと思います。まず、走り回れるものを目標にした上で次のようなことも勉強してください。
「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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: レースゲームのハンドル操作ができません
ステージを回転させるにしても、車の座標を中心にステージを回転させないといけませんよ。どら さんが書きました:キーボードの十字←→で地面(ステージ)を回転させて表示するようにしましたが
アクセルかバックをさせて←→を押すとかってに
地面が変な場所にずれてしまいます。
アクセルかバックをさせると、ステージの中心と車の中心の座標がずれます。
MV1SetRotationXYZは常にモデルの中心座標を中心に回転させるので、変な場所にずれることになります。
指定座標を中心にモデルを回転させるには
MGetTranslate
MGetRotY
などを使って変換行列を求め、MV1SetMatrix で座標変換を行う必要があります。
Re: レースゲームのハンドル操作ができません
softyaさんの、ステージではなくて車を移動させる方法を試してみてはどうでしょうか?
あとレースゲームを作るのであれば一応、
高校数学程度の知識があったほうが良いと思われます。
あとレースゲームを作るのであれば一応、
高校数学程度の知識があったほうが良いと思われます。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: レースゲームのハンドル操作ができません
私の方法ならMV1SetRotationXYZで車自体を回せば良いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。