質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

Q&A

解決済

2回答

1822閲覧

[DXライブラリ]地面に着地せず右に跳ね回ってしまう。

Nagkei10

総合スコア15

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

0グッド

0クリップ

投稿2017/03/26 07:53

編集2017/03/26 07:56

###前提・実現したいこと
いまアクションゲームを制作していて、その一環でサンプルコードを自作しているものです。
問題とかが発生したので質問したいと思います。
###発生している問題・エラーメッセージ
地面に着地せず何故か左に跳ね回ってしまいます。
どうすれば治るのでしょうか?
###該当のソースコード
問題となりそうなコードだけを上げたいと思います。

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

更にコードをいじったら、治りました。

C++

1//当たり判定チェック 2int 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){ 3 float Dummy = 0.0F; 4 float hsize; 5 //直前フレーム 6 float PrevX = *X + MoveX; 7 float PrevY = *Y + MoveY; 8 //ベクトルのバックアップ 9 float SaveMoveX = MoveX; 10 float SaveMoveY = MoveY; 11 12 hsize = Size * 0.5F; 13 //上下の当たり判定チェック、上に衝突したら落下させ、下に衝突したら着地させる。 14 { 15 //左下 16 if (MapHitCheck(*X - hsize, *Y + hsize - 1.0F, &Dummy, &MoveY,(int)Size) == 3) MoveY -= 1.0F,*Drop = 0.0F,printf("\n上下::左下"); 17 //右下 18 if (MapHitCheck(*X + hsize, *Y + hsize - 1.0F, &Dummy, &MoveY,(int)Size) == 3) MoveY -= 1.0F,*Drop = 0.0F,printf("\n上下::右下"); 19 //左上 20 if (MapHitCheck(*X - hsize, *Y - hsize + 1.0F, &Dummy, &MoveY,(int)Size) == 4) MoveY += 1.0F,*Drop *= -0.5F,printf("\n上下::左上"); 21 //右上 22 if (MapHitCheck(*X + hsize, *Y - hsize + 1.0F, &Dummy, &MoveY,(int)Size) == 4) MoveY += 1.0F,*Drop *= -0.5F,printf("\n上下::右上"); 23 //問題ないのなら移動させる 24 PrevY = *Y + MoveY; 25 *Y = PrevY; 26 } 27 //左右の当たり判定チェック 28 { 29 //左下 30 if (MapHitCheck(*X - hsize + 1.0F, *Y + hsize, &MoveX, &Dummy, (int)Size))*Slide = FALSE,MoveX -= 1.0F,*Vect = 0.0F, printf("\n左右::左下"); 31 //右上 32 if (MapHitCheck(*X + hsize - 1.0F, *Y + hsize, &MoveX, &Dummy, (int)Size))*Slide = FALSE,MoveX += 1.0F,*Vect = 0.0F, printf("\n左右::右下"); 33 //左上 34 if (MapHitCheck(*X - hsize + 1.0F, *Y - hsize, &MoveX, &Dummy, (int)Size))*Slide = FALSE,MoveX -= 1.0F,*Vect = 0.0F, printf("\n左右::左上"); 35 //右上 36 if (MapHitCheck(*X + hsize - 1.0F, *Y - hsize, &MoveX, &Dummy, (int)Size))*Slide = FALSE,MoveX += 1.0F,*Vect = 0.0F, printf("\n左右::右上"); 37 //問題ないのなら移動させる 38 PrevX = *X + MoveX; 39 *X = PrevX; 40 } 41 //着地判定 42 { 43 if (MapChipParam(*X - hsize, *Y + hsize + 1.0F) == 0 && MapChipParam(*X + hsize, *Y + hsize + 1.0F) == 0) { 44 *Air = TRUE; 45 *G = 0.5F; 46 } 47 else { 48 *JumpT = 0; 49 *Drop = 0.0F; 50 *G = 0.0F; 51 *Air = FALSE; 52 *JCount = 0; 53 *Vert = FALSE; 54 *Jump = FALSE; 55 } 56 } 57 return 0; 58} 59

投稿2017/03/26 08:25

Nagkei10

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

相変わらず当たり判定をいじり回していたら、少しずつですが治っていきました。
後はめり込み判定をしっかりさせることですね…。

C++

1//当たり判定チェック 2int 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){ 3 float Dummy = 0.0F; 4 float hsize; 5 //直前フレーム 6 float PrevX = *X + MoveX; 7 float PrevY = *Y + MoveY; 8 //ベクトルのバックアップ 9 float SaveMoveX = MoveX; 10 float SaveMoveY = MoveY; 11 12 hsize = Size * 0.5F; 13 //上下の当たり判定チェック、上に衝突したら落下させ、下に衝突したら着地させる。 14 { 15 //左下 16 if (MapHitCheck(*X - hsize, *Y + hsize - 1.0F, &Dummy, &MoveY,(int)Size) == 3) MoveX = 0.0F,*Drop = 0.0F,printf("\n上下::左下"); 17 //右下 18 if (MapHitCheck(*X + hsize, *Y + hsize - 1.0F, &Dummy, &MoveY,(int)Size) == 3) MoveX = 0.0F,*Drop = 0.0F,printf("\n上下::右下"); 19 //左上 20 if (MapHitCheck(*X - hsize, *Y - hsize + 1.0F, &Dummy, &MoveY,(int)Size) == 4) MoveX = 0.0F,*Drop *= -0.5F,printf("\n上下::左上"); 21 //右上 22 if (MapHitCheck(*X + hsize, *Y - hsize + 1.0F, &Dummy, &MoveY,(int)Size) == 4) MoveX = 0.0F,*Drop *= -0.5F,printf("\n上下::右上"); 23 //問題ないのなら移動させる 24 PrevY = *Y + MoveY; 25 *Y = PrevY; 26 } 27 //左右の当たり判定チェック 28 { 29 //左下 30 if (MapHitCheck(*X - hsize, *Y + hsize, &MoveX, &Dummy, (int)Size))*Slide = FALSE,MoveX = 0.0F,*Vect = 0.0F, printf("\n左右::左下"); 31 //右上 32 if (MapHitCheck(*X + hsize, *Y + hsize, &MoveX, &Dummy, (int)Size))*Slide = FALSE,MoveX = 0.0F,*Vect = 0.0F, printf("\n左右::右下"); 33 //左上 34 if (MapHitCheck(*X - hsize, *Y - hsize, &MoveX, &Dummy, (int)Size))*Slide = FALSE,MoveX = 0.0F,*Vect = 0.0F, printf("\n左右::左上"); 35 //右上 36 if (MapHitCheck(*X + hsize, *Y - hsize, &MoveX, &Dummy, (int)Size))*Slide = FALSE,MoveX = 0.0F,*Vect = 0.0F, printf("\n左右::右上"); 37 //問題ないのなら移動させる 38 PrevX = *X + MoveX; 39 *X = PrevX; 40 } 41 //着地判定 42 { 43 if (MapChipParam(*X - hsize, *Y + hsize + 1.0F) == 0 && MapChipParam(*X + hsize, *Y + hsize + 1.0F) == 0) { 44 *Air = TRUE; 45 *G = 0.5F; 46 } 47 else { 48 *JumpT = 0; 49 *Drop = 0.0F; 50 *G = 0.0F; 51 *Air = FALSE; 52 *JCount = 0; 53 *Vert = FALSE; 54 *Jump = FALSE; 55 } 56 } 57 return 0; 58}+ 59

投稿2017/03/26 08:10

Nagkei10

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問