ページ 1 / 1
アクションゲーム(壁判定についての質問)
Posted: 2010年10月07日(木) 11:44
by 駄文使い
DXライブラリ関数使用。
VC2008 EXPRESS出の作業環境。
進行状況:キャラクターを表示し、キャラクターから弾丸を発射するまでの作業ができている。
問題:キャラクターをステージの上に乗せる作業-つまり壁判定についてです。
現在キャラクターはイント型で作っているのですが、DXライブラリのサンプルプログラムを見たところ、フロートで作っており、これをイント型で作り出すことが可能かを教えてほしいです。
Re:アクションゲーム(壁判定についての質問)
Posted: 2010年10月07日(木) 11:50
by softya
>現在キャラクターはイント型で作っているのですが、DXライブラリのサンプルプログラムを見たところ、フロートで作っており、これをイント型で作り出すことが可能かを教えてほしいです。
可能です。ただ、微妙な速度を考えればfloatの方が便利です。
Re:アクションゲーム(壁判定についての質問)
Posted: 2010年10月07日(木) 11:57
by れい
駄文使いさんがんばってくださいね。
応援してます。
Re:アクションゲーム(壁判定についての質問)
Posted: 2010年10月07日(木) 12:04
by 駄文使い
回答ありがとうございます。
微妙な速度というと、実行速度のことでしょうか。
可能ということで、新しい質問をさせていただきます。
現在 イント型の二次配列に「0」「1」を入れておき、マップの形状どおりにキャラクターが動くように作りましたが、ジャンプした後に壁の上に乗ろうとする動きをすると、その場でY座標での動きのみで、x座標での動きが反映さえれず、乗ることができないでいます。
よろしくお願いします。
Re:アクションゲーム(壁判定についての質問)
Posted: 2010年10月07日(木) 12:50
by softya
ちょっと見ましたが、色々と直すところが多そうなので時間が取れたらやってみますが、もし他の人で時間が取れる方がいたらお願いします。
とりあえず私の環境だと壁に近づく事もできません。
Re:アクションゲーム(壁判定についての質問)
Posted: 2010年10月07日(木) 19:08
by パコネコ
とりあえず…
if(ch.x%1==0 && ch.y%1==0){ //座標が32で割り切れたら入力可能
これは間違えているのでは?
Re:アクションゲーム(壁判定についての質問)
Posted: 2010年10月07日(木) 21:21
by softya
見ただけですがパコネコさんの指摘にもある部分で32ドット単位で歩くのか1ドット単位で歩くのかシステムを明確にした方が良いと思います。
それとジャンプ後の位置をch.xとch.y基準で決めてますが当たり判定がch.xとch.yなので、障害物の上に乗ることはどうやっても出来ません。ここも直す必要がありますね。
結局のところの、現在位置はch.xとch.yで持っていてジャンプの処理をベクトルで管理したほうが処理しやすくなりますが、そこでどうしても少数以下が欲しくなるのでfloatが無いのは非常に面倒なんですよね。
方法としては数値全てを10倍して仮想的に少数位の一桁目を整数の一の位に持ってきます。で、マップと突き合わせたり表示するときだけは10で割って元の値に戻します。って分かりますでしょうか?
float a = 4;
a = a * 0.3;
int b = (int)a;
printf( "b=%d\n", b );
と
int a= 40;
a = a * 3;
int b = a / 10;
printf( "b=%d\n", b );
は同等ってことです。
ここまで面倒なことをしてintにこだわるかは駄文使いさんにお任せします。
Re:アクションゲーム(壁判定についての質問)
Posted: 2010年10月07日(木) 23:05
by パコネコ
//微妙な速度というと、実行速度のことでしょうか。
一応これについて…
私はint型以外で作ることは少ないので、intで作るのは悪いこととは思いませんが、
こだわろうとするとどうしてもめんどうです。
困る部分としては、ジャンプなどの移動距離(速度)です。
例えばジャンプの移動量を常に下に向けるにしてもintでは最低でも1ずつしかできません。
自然落下で0.5ずつとかのスピードの調節がやりづらくなってしまいます。
スピードを上げたいときも、1から2(2倍)へ大きな変化になってしまいます。
0.5から0.75へとかができないのです。
微妙な速度とはこのことを言っていると思います。
Re:アクションゲーム(壁判定についての質問)
Posted: 2010年10月08日(金) 07:57
by naohiro19
softyaさんに補足をつけます。
固定小数点という考え方があります。
0x0001 0000
[整数部][小数部]
として考えます。
0x10000000と書いた場合は実数の1.0として考えます。
0x00008000と書いた場合は実数の0.5として考えます。
0x00001600と書いた場合は実数の0.75として考えます。
計算方法:
計算したいものを16回左シフトしておき、計算した結果を右に16回シフトします。
//インクルードを省略しているので必要な場合は付け加えてください
int main()
{
int x = 100;
int mx = 0x8000; //0.5
int i;
x = x << 16; //xを固定少数にする
for (i = 0; i < 3; i++) {
x += mx; //0.5ずつ加える
printf("[変換前:%d][変換後:%d]\n", x, x >> 16);
}
return 0;
}
-- 追記
計算方法が間違っていましたので修正しました。
-- 追記2
漢字がおかしかったので修正しました。
