###前提・実現したいこと
いまアクションゲームを制作していて、その一環でサンプルコードを自作しているものです。
問題とかが発生したので質問したいと思います。
###発生している問題・エラーメッセージ
地面に着地せず何故か左に跳ね回ってしまいます。
どうすれば治るのでしょうか?
###該当のソースコード
問題となりそうなコードだけを上げたいと思います。
C++
1//衝突判定 2int MapHitCheck(float X, float Y, float *MoveX, float *MoveY, int Size) { 3 float afX, afY; 4 afX = X + *MoveX; 5 afY = Y + *MoveY; 6 float blx, brx, bby, bty; 7 blx = (float)((int)afX / Size)*Size; 8 brx = (float)((int)afX / Size + 1)*Size; 9 bty = (float)((int)afY / Size)*Size; 10 bby = (float)((int)afY / Size + 1)*Size; 11 if (MapChipParam(afX, afY) == 1) { 12 if (*MoveY > 0.0F) { 13 printf("\n下に当たりました。"); 14 //移動量を補正する 15 *MoveY = bty - Y - 1.0F; 16 //上の壁に当たったと判定する 17 return 3; 18 } 19 if (*MoveY < 0.0F) { 20 printf("\n上に当たりました。"); 21 //移動量を補正する 22 *MoveY = bby - Y + 1.0F; 23 //下の壁に当たったと判定する 24 return 4; 25 } 26 //右の当たり判定 27 if (*MoveX > 0.0F) { 28 printf("\n右に当たりました。"); 29 //移動量を補正する 30 *MoveX = blx - X - 1.0F; 31 //右の壁に当たったと判定する 32 return 1; 33 } 34 //左の当たり判定 35 if (*MoveX < 0.0F) { 36 printf("\n左に当たりました。"); 37 //移動量を補正する 38 *MoveX = brx - X + 1.0F; 39 //左の壁に当たったと判定する 40 return 2; 41 } 42 //ここに来たら適当な値を返す 43 return 4; 44 } 45 return 0; 46} 47 48//当たり判定チェック 49int CharMove(float *X, float *Y, float MoveX, float MoveY, float *Drop,float *G,char *Jump,char *Air,char *Vert, int *JumpT,float *Vect,int Size, char *Slide, int *JCount){ 50 float Dummy = 0.0F; 51 float hsize; 52 //直前フレーム 53 float PrevX = *X + MoveX; 54 float PrevY = *Y + MoveY; 55 //ベクトルのバックアップ 56 float SaveMoveX = MoveX; 57 float SaveMoveY = MoveY; 58 59 hsize = Size * 0.5F; 60 //上下の当たり判定チェック、上に衝突したら落下させ、下に衝突したら着地させる。 61 { 62 //左下 63 if (MapHitCheck(*X - hsize, *Y + hsize, &Dummy, &MoveY,(int)Size) == 3) MoveX = 1.0F,*Drop = 0.0F,printf("\n上下::左下"); 64 //右下 65 if (MapHitCheck(*X + hsize, *Y + hsize, &Dummy, &MoveY,(int)Size) == 3) MoveX = 1.0F,*Drop = 0.0F,printf("\n上下::右下"); 66 //左上 67 if (MapHitCheck(*X - hsize, *Y - hsize, &Dummy, &MoveY,(int)Size) == 4) MoveX = -1.0F,*Drop *= -0.5F,printf("\n上下::左上"); 68 //右上 69 if (MapHitCheck(*X + hsize, *Y - hsize, &Dummy, &MoveY,(int)Size) == 4) MoveX = -1.0F,*Drop *= -0.5F,printf("\n上下::右上"); 70 //問題ないのなら移動させる 71 PrevY = *Y + MoveY; 72 *Y = PrevY; 73 } 74 //左右の当たり判定チェック 75 { 76 //左下 77 if (MapHitCheck(*X - hsize, *Y + hsize, &MoveX, &Dummy, (int)Size))*Slide = FALSE,MoveX = -1.0F,*Vect = 0.0F, printf("\n左右::左下"); 78 //右上 79 if (MapHitCheck(*X + hsize, *Y + hsize, &MoveX, &Dummy, (int)Size))*Slide = FALSE,MoveX = 1.0F,*Vect = 0.0F, printf("\n左右::右下"); 80 //左上 81 if (MapHitCheck(*X - hsize, *Y - hsize, &MoveX, &Dummy, (int)Size))*Slide = FALSE,MoveX = 1.0F,*Vect = 0.0F, printf("\n左右::左上"); 82 //右上 83 if (MapHitCheck(*X + hsize, *Y - hsize, &MoveX, &Dummy, (int)Size))*Slide = FALSE,MoveX = -1.0F,*Vect = 0.0F, printf("\n左右::右上"); 84 //問題ないのなら移動させる 85 PrevX = *X + MoveX; 86 *X = PrevX; 87 } 88 //着地判定 89 { 90 if (MapChipParam(*X - hsize, *Y + hsize) == 0 && MapChipParam(*X + hsize, *Y + hsize) == 0) { 91 *Air = TRUE; 92 *G = 0.5F; 93 } 94 else { 95 *JumpT = 0; 96 *Drop = 0.0F; 97 *G = 0.0F; 98 *Air = FALSE; 99 *JCount = 0; 100 *Vert = FALSE; 101 *Jump = FALSE; 102 } 103 } 104 return 0; 105} 106
###試したこと
当たり判定チェックの部分をいじりまわしたり、情報収集をしたりしました。
###補足情報(言語/FW/ツール等のバージョンなど)
Visual Studio 2017 Community
DXライブラリ Ver.3.17e
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。