-3

私は、モンスターが迷路内でランダムな方向に移動すると想定されるパックマン スタイルのゲームを書いていました。しかし、彼らが望む正しい方向に適応させる方法がわかりません。方向にいくつかの定数を使用していました。

public class Monster extends GObject {

    private final int DIRECTION_UP = 0;
    private final int DIRECTION_DOWN = 1;
    private final int DIRECTION_LEFT = 2;
    private final int DIRECTION_RIGHT = 3;

    private int DIRECTION = 2;

    private float speed = 0.06f;

    public Monster(float x, float y){
        super(Treasure.MONSTER_LEFT);
        setX(x);
        setY(y);
        DIRECTION = random(3);
    }

    public void update(long elapsedTime){
        setVelocityX(0);
        setVelocityY(0);
        switch (DIRECTION){
            case DIRECTION_UP :
                setVelocityY(-speed);
                setImage(Treasure.MONSTER_UP);
                break;
            case DIRECTION_DOWN :
                setVelocityY(speed);
                setImage(Treasure.MONSTER_DOWN);
                break;
            case DIRECTION_LEFT :
                setVelocityX(-speed);
                setImage(Treasure.MONSTER_LEFT);
                break;
            case DIRECTION_RIGHT :
                setVelocityX(speed);
                setImage(Treasure.MONSTER_RIGHT);
                break;
        }
        changeDirection();
    }

    private int random(int x){
        return (int)Math.floor(Math.random() * (x+1));
    }

    public void collision(GObject other){
        if (other instanceof Wall){
            switch (DIRECTION){
                case DIRECTION_UP :
                    setY(other.getY()+other.getHeight());
                    break;
                case DIRECTION_DOWN :
                    setY(other.getY()-getHeight());
                    break;
                case DIRECTION_LEFT :
                    setX(other.getX()+other.getWidth());
                    break;
                case DIRECTION_RIGHT :
                    setX(other.getX()-getWidth());
                    break;
            }
        }
    }

}

これが私が使用した changeDirection() メソッドです。

private void changeDirection(){
    int random = random(1);
    boolean opposite = (random==1);
    int dir = DIRECTION;
    switch (Explorer.DIRECTION){
        case DIRECTION_UP :
            if (opposite){
                dir = DIRECTION_DOWN;
            } else {
                dir = DIRECTION_UP;
            }
            break;
        case DIRECTION_DOWN :
            if (opposite){
                dir = DIRECTION_UP;
            } else {
                dir = DIRECTION_DOWN;
            }
            break;
        case DIRECTION_LEFT :
            if (opposite){
                dir = DIRECTION_RIGHT;
            } else {
                dir = DIRECTION_LEFT;
            }
            break;
        case DIRECTION_RIGHT :
            if (opposite){
                dir = DIRECTION_LEFT;
            } else {
                dir = DIRECTION_RIGHT;
            }
            break;
    }
    switch (dir){
        case DIRECTION_UP :
            if (Map.isObjectCollisionFree(getX(), getY()-1, true, this)){
                DIRECTION = dir;
            }
            break;
        case DIRECTION_DOWN :
            if (Map.isObjectCollisionFree(getX(), getY()+1, true, this)){
                DIRECTION = dir;
            }
            break;
        case DIRECTION_LEFT :
            if (Map.isObjectCollisionFree(getX()-1, getY(), true, this)){
                DIRECTION = dir;
            }
            break;
        case DIRECTION_RIGHT :
            if (Map.isObjectCollisionFree(getX()+1, getY(), true, this)){
                DIRECTION = dir;
            }
    }
}

迷路でモンスターをランダムに動かす方法を教えてください...

私が直面している現在の問題は、モンスターが動かないことです..彼らはゲームでジャンプしています. 視野の外にいると二度と戻ってこない… モニターしていると、座標が-12000まで伸びてそこで止まるそうです。これが壁のチェック方法です。

if (Map.isObjectCollisionFree(<x-pos>, <y-pos>, <solid-state>, <object>))

これはプレーヤーにとってうまくいきました。衝突法では、モンスターをマップのグリッドに合わせています。

EDIT : changeDirection() メソッドを変更しました

    private void changeDirection(){     
        DIRECTION = random(3);
}

the update() method

    public void update(long elapsedTime){
    if (MapView.isVisible(this)){
        if ((getX()%Map.TILE_SIZE==0) && (getY()%Map.TILE_SIZE==0)){
            changeDirection();
        }
        setVelocityX(0);
        setVelocityY(0);
        switch (DIRECTION){
            case DIRECTION_UP :
                setVelocityY(-speed);
                setImage(Treasure.MONSTER_UP);
                break;
            case DIRECTION_DOWN :
                setVelocityY(speed);
                setImage(Treasure.MONSTER_DOWN);
                break;
            case DIRECTION_LEFT :
                setVelocityX(-speed);
                setImage(Treasure.MONSTER_LEFT);
                break;
            case DIRECTION_RIGHT :
                setVelocityX(speed);
                setImage(Treasure.MONSTER_RIGHT);
                break;
        }
    }
}
4

1 に答える 1

2

あなたが提供したコードでは、モンスターが一方向に動いているが、別の方向に動いていると考える期間があります (changeDirection()内部方向の値を変更しますが、モンスターの速度は変更しないため)。そして、モンスターが全く別の方向に動いていると思いながら壁に激突すると、自分が動いていると思った方向に動いていた壁の側にジャンプして……進みます。への次の呼び出しまで、実際に移動していた方向に陽気な方法で進みますupdate()

これを修正するには、呼び出しをchangeDirection()の末尾からupdate()先頭に移動します。実際には、すべてのコードupdate()を の最後に移動することをお勧めしchangeDirection()ますが、どちらの方法でも機能します。

于 2012-06-01T00:48:52.207 に答える