0

对象应该根据经过的时间(在追逐或分散之间切换)改变模式(运动算法)。我创建了一个while循环,但对象仅以一种模式(追逐)移动,这很奇怪,因为我最初将它设置为分散。

private static int seconds=0;
private static boolean ghostalive;

protected static final int chaseMode = 0;
protected static final int scatterMode = 1;
protected static final int frightenedMode = 2;

static int mode; //initially ghost start in scatterMode

public Ghost(int x, int y, Maze maze){
    super(x, y, maze);
    futureDirection = 0;
    timer = 0;
    mode = getMode();
}     

public static int getMode(){
    mode=setMode();
    return mode;
}

//LEVEL 1
//scatter for 7s 
//chase for 20s 
//scatter for 7s 
//chase for 20s 
//scatter for 5s 
//chase for 20s
//scatter for 5s 
//chase indefinite

public static int setMode(){

while(ghostalive){

    mode = scatterMode;
    if(seconds>7)
        mode = chaseMode;//chaseMode=true;
    if(seconds>27)
        mode = scatterMode;
    if(seconds>34)
        mode = chaseMode;
    if(seconds>54) 
        mode = scatterMode;
    if(seconds>59) 
        mode = chaseMode;
    if(seconds>79)
        mode = scatterMode;
    if(seconds>84)
        mode = chaseMode;

    seconds++;      
   }    
       return mode;
}
4

1 回答 1

1

您的评论说它从 开始scatterMode,但是在声明它时您没有将模式设置为任何东西。因此,它实际上默认为chaseMode. 因为您没有初始化 boolean ghostAlive,所以它默认为 false ,这意味着您的循环永远不会发生,这意味着模式不会设置为scatterMode,这意味着它始终保持在chaseMode.

要开始解决此问题,您应该初始化ghostAlive为 true。然后,对于所有的 if,您可以放置​​一个ghostAlive = false语句来结束循环。我不确定您在整个项目的上下文中使用这种方法的目标是什么,但是这点知识应该可以帮助您解决任何问题。您必须以ghostAlive某种方式在循环内使 false 退出循环。

不过,不确定为什么要使用所有这些静态方法和字段。您发布的内容似乎没有必要。

此外,最好将 if 语句(甚至是单语句)放在大括号中。如果您必须稍后添加一些错误,这将有助于遏制任何错误(看起来您必须在这里)。

于 2012-11-15T04:42:12.573 回答