Java游戏开发。让怪物在迷宫中随机移动

时间:2012-06-01 00:02:09

标签: java maze pacman

我正在写一个pacman风格的游戏,其中假设怪物在迷宫中随机移动。但我无法弄明白如何让他们适应他们想要的正确方向。我正在使用一些常量来指示。

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>))

这对玩家有用。在碰撞方法中,我将怪物与地图的网格对齐。

编辑:更改了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;
        }
    }
}

1 个答案:

答案 0 :(得分:2)

使用你提供的代码,会有一些怪物在一个方向上移动的时期,但认为它在另一个方向移动(因为changeDirection()改变了内部方向值,而不是怪物的速度)。然后,当怪物撞到一堵墙,同时认为它正朝着一个不同的方向移动时,它会跳到墙的一侧,如果它朝着它认为正在移动的方向移动它将继续...然后继续它朝着它真正移动的方向开心,直到下一次打电话给update()

要解决此问题,请将调用从changeDirection()的{​​{1}}移至update()。实际上,我建议将update()中的所有代码移到changeDirection()的末尾,但它会以任何方式工作。