移動の判定が上手くいかず
どうしてもわからなかったので質問させて頂きました。
仕様
・プレイヤーは常に左右のどちらかに移動し続けている
・壁に当たったら移動方向を反転する
・床がなかったら落ちる
といったよくありそうなゲームです。
壁に当たった際の左右反転は出来たのですが
落ちる際に左右の移動の判定が入ってしまったり
落ちた際に壁にめり込んで急に左右反転してしまうことがあります。
必要そうな一部分だけを切り出したのでミスがあったらすみません。
どうか改善案を頂けないでしょうか?
#include <math.h>
#include "DxLib.h"
#include "Main.h"
#define CEL_SW 32
#define CEL_SH 32
#define CEL_W 20
#define CEL_H 15
enum{ RIGHT, LEFT };
// キャラクター情報
typedef struct{
bool Flg;
bool Dir; // false : RIGHT / true : LEFT
int Px,Py,Mx,My;
int Ox,Oy,Cx,Cy;
int Speed;
}CHR;
CHR Play;
// マップデータ
int MapData[CEL_H][CEL_W] = {
{ 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1 },
{ 1,0,0,0,0, 0,0,0,1,0, 0,0,0,0,0, 0,0,0,0,1 },
{ 1,1,1,1,0, 0,0,0,0,0, 0,1,1,0,0, 0,0,0,0,1 },
{ 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1 },
{ 1,0,0,0,1, 1,1,1,1,0, 0,0,0,0,0, 0,0,0,0,1 },
{ 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1 },
{ 1,0,0,0,0, 0,0,0,0,0, 1,1,1,1,0, 0,0,0,0,1 },
{ 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1 },
{ 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1 },
{ 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1 },
{ 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1 },
{ 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1 },
{ 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1 },
{ 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1 },
{ 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1 },
};
// 初期化
void Init(){
InitHandle(); // 画像の読み込み
// プレイヤー
Play.Flg = true;
Play.Cx = 1;
Play.Cy = 1;
Play.Px = Play.Cx * CEL_SW + CEL_SW/2;
Play.Py = Play.Cy * CEL_SH + CEL_SH/2;
Play.Speed = 2;
}
// 処理
void Loop(){
PlayMove();
// 向きの変更の移動
if(Key[KEY_INPUT_RIGHT].Key) Play.Dir = RIGHT;
if(Key[KEY_INPUT_LEFT].Key) Play.Dir = LEFT;
if(Mouse.clFlg){
if(Mouse.x > Play.Px) Play.Dir = RIGHT;
else if(Mouse.x <= Play.Px) Play.Dir = LEFT;
}
}
// 描画
void Draw(){
// プレイヤー
if(Play.Flg) DrawCenter( Play.Px, Play.Py, Handle.Play, 0xff, Play.Dir ) ;
// マップ
for(int i=0; i<CEL_H; i++){
for(int j=0; j<CEL_W; j++){
int x = j*CEL_SW + CEL_SW/2;
int y = i*CEL_SH + CEL_SH/2;
int h = NULL;
switch(MapData[j]){
case 1:
h = Handle.Obj[0];
break;
}
DrawCenter( x, y, h, 0xff, Play.Dir ) ;
}
}
void PlayMove(void){
// 移動量の初期化
Play.Mx = 0;
Play.My = 0;
// 移動量のセット
for(int speed=0; speed<Play.Speed; speed++){
Play.Cx = int((Play.Px - CEL_SW/2)/CEL_SW);
Play.Cy = int((Play.Py - CEL_SH/2)/CEL_SH);
if((Play.Px - CEL_SW/2)%32 == 0){
if(MapData[Play.Cy][Play.Cx+1] == 1){
Play.Dir = LEFT;
}
if(MapData[Play.Cy][Play.Cx-1] == 1){
Play.Dir = RIGHT;
}
}
if(Play.Dir == RIGHT) Play.Mx = 1;
else if(Play.Dir == LEFT) Play.Mx = -1;
if(MapData[Play.Cy+1][Play.Cx] != 1){
Play.My = +3;
}
Play.Px += Play.Mx;
Play.Py += Play.My;
}
}