
四角い2つブロックの当たり判定をとりたいです。1つのブロックは十字キーによって移動することができ、もうひとつのブロックは画面中央に固定されたまま動くことはありません。2つの四角形が当たった時に擦りぬけないようにしたいのですが、ぶつかったときに十字キーで上下左右に動かしてもすりぬけないようにしたのですが、斜めに移動させるとおかしくなってしまいます。次のプログラムをどう修正すればいいでしょうか?
変数の説明
Player.x:動く四角形のX座標
Player.y:動く四角形のY座標
Player.width:動く四角形の幅
Player.height:動く四角形の高さ
Wall.x:動く四角形のX座標
Wall.y:動く四角形のY座標
Wall.width:動く四角形の幅
Wall.height:動く四角形の高さ
//2つの四角形がぶつかっていなかったら
if(!(((Player.x > Wall.x && Player.x < Wall.x + Wall.width) || (Wall.x > Player.x && Wall.x < Player.x + Player.width)) && ((Player.y > Wall.y && Player.y < Wall.y + Wall.height) || (Wall.y > Player.y && Wall.y < Player.y + Player.height))))
{
//右キーを押していたら
if(g_keyState[DIK_RIGHT] & 0x80 )
{
Player.x += 3;
if((((Player.x > Wall.x && Player.x < Wall.x + Wall.width) || (Wall.x > Player.x && Wall.x < Player.x + Player.width)) && ((Player.y > Wall.y && Player.y < Wall.y + Wall.height) || (Wall.y > Player.y && Wall.y < Player.y + Player.height))))
Player.x = Wall.x - Player.width - 1;
}
//左キーを押していたら
if(g_keyState[DIK_LEFT] & 0x80)
{
Player.x -= 3;
if((((Player.x > Wall.x && Player.x < Wall.x + Wall.width) || (Wall.x > Player.x && Wall.x < Player.x + Player.width)) && ((Player.y > Wall.y && Player.y < Wall.y + Wall.height) || (Wall.y > Player.y && Wall.y < Player.y + Player.height))))
Player.x = Wall.x + Wall.width + 1;
}
//上キーを押していたら
if(g_keyState[DIK_UP] & 0x80)
{
Player.y -= 3;
if((((Player.x > Wall.x && Player.x < Wall.x + Wall.width) || (Wall.x > Player.x && Wall.x < Player.x + Player.width)) && ((Player.y > Wall.y && Player.y < Wall.y + Wall.height) || (Wall.y > Player.y && Wall.y < Player.y + Player.height))))
Player.y = Wall.y + Wall.height + 1;
}
//下キーを押していたら
if(g_keyState[DIK_DOWN] & 0x80)
{
Player.y += 3;
if((((Player.x > Wall.x && Player.x < Wall.x + Wall.width) || (Wall.x > Player.x && Wall.x < Player.x + Player.width)) && ((Player.y > Wall.y && Player.y < Wall.y + Wall.height) || (Wall.y > Player.y && Wall.y < Player.y + Player.height))))
Player.y = Wall.y - Player.height - 1;
}
}
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
ですから、あなたのいう「おかしい」というのがどうゆう現象かはっきりしてくれないと、どこを直していいのかわかりません。
今の状態だと、斜めにしていると、ぶつかった四角に沿って滑る感じになると思います。
その動き自体があなたの求めているものなのかどうなのか。違うのならどうなって欲しいのか。
それによって対処法も違ってきます。
あるいは、めり込んでしまう、のなら、なにか判定の見落しがあるのかもしれません。
それも「めりこむ」という現象が起るのかどうかでプログラムに検証方法も変わってきます。
この回答への補足
斜め移動させて、固定された四角形にぶつかって滑っていくと、四角形と四角形の角がぶつかったタイミングで四角形が別の個所に移動してしまいます。例えば、左から固定された四角形にぶつかり、下キーと右キーを入力したまま滑らすと、動く四角形の右上座標と固定された四角形の左上がかぶったときに動く四角形の右下座標が固定されている四角形の左上座標の所に移動してしまいます。説明わかりにくくてすいません。
補足日時:2011/11/21 18:56No.1
- 回答日時:
どんな風に変なのかがよくわからないけど
このプログラムだと、(入力判定→移動→衝突判定→調整)を順番にやっているので、斜めへの移動は、横の移動→縦の移動と2回に分けて入力したのと同じです。この横移動→衝突→調整の後に縦移動、というのが、あなたの予想した動きとの違いになっていないでしょうか。
判定の不等号に=が必要な箇所がないか、補正させる場所はその計算でいいのか、あたりも確認しては?
あと、こんな条件式を何度も書くのは、勧められません。
関数にすればスッキリするし、修正も楽です。
この回答への補足
ソースを次のように変更してみたのですがうまくいきません。
移動前のPlayerの座標を別の変数に保存しておき、キー入力によって移動させます。
この時点でPlayerがWallに当たっている可能性があるので当たっていた場合はPlayerの座標を修正。この時移動後のPlayerの座標だけではWallに右から当たったのか左から当たったのかわからないため保存しておいた移動前のPlayerの座標を使います。
PrevPlayer = Player;
if(g_keyState[DIK_UP] & 0x80)
Player.y -= 3;
if(g_keyState[DIK_RIGHT] & 0x80)
Player.x += 3;
if(g_keyState[DIK_DOWN] & 0x80)
Player.y += 3;
if(g_keyState[DIK_LEFT] & 0x80)
Player.x -= 3;
if(Player.y < Wall.y + Wall.height && Player.y + Player.height > Wall.y)
{
if(PrevPlayer.x < Player.x){
if((Player.x + Player.width) >Wall.x)
Player.x = Wall.x - Player.width;
}
else if(PrevPlayer.x > Player.x)
{
if(Player.x < (Wall.x + Wall.width))
Player.x = Wall.x + Wall.width;
}
}
if(Player.x < Wall.x + Wall.width && Player.x + Player.width > Wall.x)
{
if(PrevPlayer.y < Player.y)
{
if((Player.y + Player.height) >Wall.y)
Player.y = Wall.y - Player.height;
}
else if(PrevPlayer.y > Player.y)
{
if(Player.y < (Wall.y + Wall.height))
Player.y = Wall.y + Wall.height;
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マインクラフト(pc版)で座標...
-
C言語による楕円関数の記述
-
グラフの交点の求め方(Excel)
-
OpenGL
-
マウスの移動範囲を限定するに...
-
ASP.NET フォーム上でp...
-
図形が重なりあっているかどうか
-
エクセルで回転する座標の出し方
-
PictureBoxのImageを前面に
-
MATLABの射影変換についての質...
-
「アイテムは収集されました」...
-
エクセルで作った新しいウイン...
-
VBでのハンドルの使い方
-
[VB.net] DataGridViewの列ヘッ...
-
メッセージボックスを大きくす...
-
ゲームでは結局どっちが良いの?
-
検索の画面がでなくなってしま...
-
jw-cadにBMP画像を貼り付けまし...
-
Excelの上下を固定したい
-
C# ウィンドウハンドルの取得
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
グラフの交点の求め方(Excel)
-
マインクラフト(pc版)で座標...
-
始点、終点の二つの座標と半径...
-
3次元空間上の2つの座標から...
-
エクセルで回転する座標の出し方
-
C言語 配列で座標
-
エクセルである点からの距離で...
-
シーケンサー(PLC?)で制...
-
多角形の内部かどうか判定する方法
-
Excel VBA で自在に図形を変化...
-
最小二乗平面
-
回転する矩形同士の当たり判定...
-
VBで、開いているExcelシートの...
-
ワード上Shapeの位置情報を統一...
-
図形が重なりあっているかどうか
-
C言語で制作するピラミッドアー...
-
ガウシアンフィルタのCプログラム
-
Excel関数で指定範囲内に有るか...
-
3次元座標上の2直線の交点判...
-
ダイアログ内コントロールの位...
おすすめ情報