判定が上手く取れない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
伊藤

判定が上手く取れない

#1

投稿記事 by 伊藤 » 15年前

DXライブラリを使ってゲームを作っております。
移動の判定が上手くいかず
どうしてもわからなかったので質問させて頂きました。

仕様
・プレイヤーは常に左右のどちらかに移動し続けている
・壁に当たったら移動方向を反転する
・床がなかったら落ちる
といったよくありそうなゲームです。

壁に当たった際の左右反転は出来たのですが
落ちる際に左右の移動の判定が入ってしまったり
落ちた際に壁にめり込んで急に左右反転してしまうことがあります。

必要そうな一部分だけを切り出したのでミスがあったらすみません。
どうか改善案を頂けないでしょうか?
#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;
        
    }


}

伊藤

Re:判定が上手く取れない

#2

投稿記事 by 伊藤 » 15年前

ゲーム画像です。
青が壁で赤がプレイヤーです。

ookami

Re:判定が上手く取れない

#3

投稿記事 by ookami » 15年前

ここだけか分かりませんが、
if(MapData[Play.Cy+1][Play.Cx] != 1){
    Play.My = +3;
}
↑これだと、プレイヤーがマスとマスの間にいる時、左下のマスしかチェックしていないことになりますね。

伊藤

Re:判定が上手く取れない

#4

投稿記事 by 伊藤 » 15年前

回答ありがとうございます。

すみません・・・モデムが壊れてしまっためネットが使えず
折角、回答頂いたのに返事ができませんでした・・・。

一度、締めさせて頂きます。

閉鎖

“C言語何でも質問掲示板” へ戻る