上と左右の当たり判定がおかしいです。
Posted: 2017年2月23日(木) 18:34
(このスレと合わせて読んで、お答えください。)
現在アクションゲームの当たり判定に悪戦苦闘している人です。どうやら別なところでやれということに気づきこれを立てました。
今起こっている症状:下の当たり判定は完成しているが、上に当たると下に大きく押し出されてしまう。
左右の当たり判定は左に衝突すると、右に大きく押し出してしまう。また右に衝突して左に行こうとすると、何故か倍速で右に行ってしまう。
問題のコードをあげますので自分でデバッグできる方はそれをご覧ください。
現在アクションゲームの当たり判定に悪戦苦闘している人です。どうやら別なところでやれということに気づきこれを立てました。
今起こっている症状:下の当たり判定は完成しているが、上に当たると下に大きく押し出されてしまう。
左右の当たり判定は左に衝突すると、右に大きく押し出してしまう。また右に衝突して左に行こうとすると、何故か倍速で右に行ってしまう。
問題のコードをあげますので自分でデバッグできる方はそれをご覧ください。
//衝突判定
int MapHitCheck(float X, float Y, float *MoveX, float *MoveY, float Size) {
float afX, afY;
afX = X + *MoveX;
afY = Y + *MoveY;
float blx, brx, bby, bty;
blx = (float)((int)afX / Size)*Size;
brx = (float)((int)afX / Size + 1)*Size;
bty = (float)((int)afY / Size)*Size;
bby = (float)((int)afY / Size + 1)*Size;
if (MapChipParam(X, afY - 1.0F) == 1 && *MoveY > 0.0F) {
//移動量を補正する
*MoveY = bty - Y - 1.0F;
//上の壁に当たったと判定する
return 3;
}
if (MapChipParam(X, afY + 1.0F) == 1 && *MoveY < 0.0F) {
//移動量を補正する
*MoveY = bby - Y - 1.0F;
//下の壁に当たったと判定する
return 4;
}
//右の当たり判定
if (MapChipParam(afX - 1.0F ,Y) == 1 && *MoveX > 0.0F) {
printf("右に当たりました。");
//移動量を補正する
*MoveX = blx - X + 1.0F;
//右の壁に当たったと判定する
return 1;
}
//左の当たり判定
if (MapChipParam(afX + 1.0F, Y) == 1 && *MoveX < 0.0F) {
printf("左に当たりました。");
//移動量を補正する
*MoveX = brx - X + 1.0F;
//左の壁に当たったと判定する
return 2;
}
return 0;
}
//当たり判定チェック
int CharMove(float *X, float *Y, float MoveX, float MoveY, float *Drop,float *G,char *Jump,float Size){
float Dummy = 0.0F;
float hsize;
hsize = Size * 0.5F;
//上下の当たり判定チェック、上に衝突したら落下させ、下に衝突したら着地させる。
{
//左下
if (MapHitCheck(*X - hsize, *Y + hsize, &Dummy, &MoveY,Size) == 3) *Drop = 0.0F;
//右下
if (MapHitCheck(*X + hsize, *Y + hsize, &Dummy, &MoveY,Size) == 3) *Drop = 0.0F;
//左上
if (MapHitCheck(*X - hsize, *Y - hsize, &Dummy, &MoveY,Size) == 4) *Drop = -1.0F;
//右上
if (MapHitCheck(*X + hsize, *Y - hsize, &Dummy, &MoveY,Size) == 4) *Drop = -1.0F;
//問題ないのなら移動させる
*Y += MoveY;
}
//左右の当たり判定チェック
{
//左下
MapHitCheck(*X - hsize, *Y + hsize, &MoveX, &Dummy, Size);
//右上
MapHitCheck(*X + hsize, *Y + hsize, &MoveX, &Dummy, Size);
//左上
MapHitCheck(*X - hsize, *Y - hsize, &MoveX, &Dummy, Size);
//右上
MapHitCheck(*X + hsize, *Y - hsize, &MoveX, &Dummy, Size);
//問題ないのなら移動させる
*X += MoveX;
}
//着地判定
{
if (MapChipParam(*X - hsize, *Y + hsize + 1.0F) == 0 && MapChipParam(*X + hsize, *Y + hsize + 1.0F) == 0) {
*Jump = TRUE;
}
else {
*Drop = 0.0F;
*G = 0.0F;
*Jump = FALSE;
}
}
return 0;
}