我正在写一个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;
}
}
}
答案 0 :(得分:2)
使用你提供的代码,会有一些怪物在一个方向上移动的时期,但认为它在另一个方向移动(因为changeDirection()
改变了内部方向值,而不是怪物的速度)。然后,当怪物撞到一堵墙,同时认为它正朝着一个不同的方向移动时,它会跳到墙的一侧,如果它朝着它认为正在移动的方向移动它将继续...然后继续它朝着它真正移动的方向开心,直到下一次打电话给update()
。
要解决此问题,请将调用从changeDirection()
的{{1}}移至update()
。实际上,我建议将update()
中的所有代码移到changeDirection()
的末尾,但它会以任何方式工作。