我如何让玩家的移动功能只计数一次,以便他们可以一个一个地执行?

How do i make the movement function for the player count only once so that they can be executed one by one?

我目前有一个游戏,其中有一个玩家和一些障碍物,我想用一些命令来导航这个玩家,但问题是命令得到执行但矩形没有得到更新所以我必须做一些带有 break 和全局变量的 while 逻辑很奇怪,否则玩家会跳起来。有没有办法让函数只计数一次,并且可以正常循环 for 和 while ?到目前为止,这是我的代码:

int border = 20;
int sqsize = 96;
int i = 0;

ArrayList<player> players = new ArrayList<player>();
ArrayList<obstacle> obstacles = new ArrayList<obstacle>();

void setup() {
  size(1000, 1000);
  players.add(new player(9, 0));
  obstacles.add(new obstacle(4, 0));
  obstacles.add(new obstacle(4, 1));
  obstacles.add(new obstacle(4, 2));
  obstacles.add(new obstacle(4, 3));
  obstacles.add(new obstacle(4, 4));
  obstacles.add(new obstacle(4, 5));
}
void draw() {
  background(#767C7C);
  for (int l = 0; l < 10; l++) {
    for (int w = 0; w < 10; w++) {
      fill(#F6F9EF);
      stroke(#BABAB6);
      strokeWeight(0.5);
      rect(border + l*sqsize, border + w*sqsize, sqsize, sqsize);
    }
  }
  players.get(0).draw();

  for ( int i = obstacles.size()-1; i>= 0; i--) {
    obstacles.get(i).draw();
  }
  for ( int i = obstacles.size()-1; i>= 0; i--) {
    obstacles.get(i).ask();
  }

  while (i < 5) {
    players.get(0).links();
    players.get(0).unten();
    break;
  }
  i++;
}


class player {
  int x, y;
  player(int ix, int iy) {
    x = border + ix*sqsize;
    y = border + iy*sqsize;
  }

  void draw() {
    fill(255, 0, 0);
    rect(x, y, sqsize, sqsize);
  }

  void right() {

    if (x < 1000-2*sqsize) {
      x = x + sqsize;
    }
  }
  void left() {
    if (x > 20) {
      x = x - sqsize;
    }
  }
  void up() {

    if (y > 20+sqsize) {
      y = y + sqsize;
    }
  }
  void down() {
    if (y < 1000-2*sqsize) {
      y = y + sqsize;
    }
  }

  void destroy() {
    textSize(64);
    text("Game Over", 500-2*sqsize, 500-sqsize/2); 
    noLoop();
  }
  int[] request() {
    int[] pos = {x, y};

    return pos;
  }
}


class obstacle {
  int x, y;
  obstacle(int ix, int iy) {
    x = border + ix*sqsize;
    y = border + iy*sqsize;
  }

  void draw() {
    fill(255, 0, 0);
    rect(x, y, sqsize, sqsize);
  }

  void rechts() {

    if (x < 1000-2*sqsize) {
      x = x + sqsize;
    }
  }
  void links() {
    if (x > 20) {
      x = x - sqsize;
    }
  }
  void oben() {

    if (y > 20+sqsize) {
      y = y + sqsize;
    }
  }
  void unten() {
    if (y < 1000-2*sqsize) {
      y = y + sqsize;
    }
  }

  void ask() {

    for ( int i = players.size()-1; i>= 0; i--) {
      int[] check = players.get(i).request();
      if (/*dist(check[0]+sqsize, check[1]+sqsize, x, y) == 0 || dist(check[0]-sqsize, check[1]-sqsize, x, y) == 0 ||*/ dist(check[0], check[1], x, y) == 0) {

        players.get(i).destroy();
      }
    }
  }
}

有没有办法检测玩家的哪一侧碰到了障碍物。

非常感谢(我是新手)

这就是我解决问题的方法(我使用了案例):

int border = 20;
int sqsize = 96;
int n = 0;
boolean f = true;
long lastTime = 0;
int count = 0;
int[] list = new int[100];

ArrayList<Player> Players = new ArrayList<Player>();
ArrayList<Obstacle> Obstacles = new ArrayList<Obstacle>();

void setup() {
  size(1000, 1000);
  Players.add(new Player(9, 0));
  Obstacles.add(new Obstacle(4, 0));
  Obstacles.add(new Obstacle(4, 1));
  Obstacles.add(new Obstacle(4, 2));
  Obstacles.add(new Obstacle(2, 3));
  Obstacles.add(new Obstacle(4, 4));
  Obstacles.add(new Obstacle(4, 5));
  lastTime = millis();
}
void draw() {
  background(#767C7C);
  for (int l = 0; l < 10; l++) {
    for (int w = 0; w < 10; w++) {
      fill(#F6F9EF);
      stroke(#BABAB6);
      strokeWeight(0.5);
      rect(border + l*sqsize, border + w*sqsize, sqsize, sqsize);
    }
  }

  /*Players.get(0).left();
   Players.get(0).down();*/

  if (f) {

    count = 0;
    list = new int[50];
    player();
    f = false;
  }

  Players.get(0).draw();

  for ( int i = Obstacles.size()-1; i>= 0; i--) {
    Obstacles.get(i).draw();
  }
  for ( int i = Obstacles.size()-1; i>= 0; i--) {
    Obstacles.get(i).ask();
  }
}


class Player {
  int x, y;
  int posCase = 0;

  Player(int ix, int iy) {
    x = border + ix*sqsize;
    y = border + iy*sqsize;
  }

  void draw() {
    while (n < count) {

      if ( millis() - lastTime > 600 ) {

        posCase = list[n];
        println(n);

        if (posCase == 5) {
          noLoop();
        }


        switch(posCase) {

        case 1 :
          if (x < 1000-2*sqsize) {
            x = x + sqsize;
          }
          break;


        case 2 :
          if (x > 20) {
            x = x - sqsize;
          }
          break; 


        case 3 :
          if (y > 20+sqsize) {
            y = y + sqsize;
          }
          break;


        case 4 :
          if (y < 1000-2*sqsize) {
            y = y + sqsize;
          }
          break;
        }
        n++;

        if ( n == count) {
          println("yes");
          f = true;
        }


        lastTime = millis();
      }

      break;
    }
    fill(255, 0, 0);
    rect(x, y, sqsize, sqsize);
  }

  void right() {
    list[count] = 1;
    count++;

    /*f (x < 1000-2*sqsize) {
     x = x + sqsize;
     redraw();
     }*/
  }
  void left() {
    list[count] = 2;
    count++;
    /*if (x > 20) {
     x = x - sqsize;
     redraw();
     }*/
  }
  void up() {
    list[count] = 3;
    count++;
    /*if (y > 20+sqsize) {
     y = y + sqsize;
     redraw();
     }*/
  }
  void down() {
    list[count] = 4;
    count++;
    /*if (y < 1000-2*sqsize) {
     y = y + sqsize;
     redraw();*/
  }
  void ende() {

    list[count] = 5;
    count++;
  }
  void destroy() {
    textSize(64);
    text("Game Over", 500-2*sqsize, 500-sqsize/2); 
    noLoop();
  }
  int[] request() {
    int[] pos = {x, y};

    return pos;
  }
}


class Obstacle {
  int x, y;
  int posCase = 0;

  Obstacle(int ix, int iy) {
    x = border + ix*sqsize;
    y = border + iy*sqsize;
  }

  void draw() {
    while (n < count) {

      if ( millis() - lastTime > 600 ) {

        posCase = list[n];
        println(n);

        if (posCase == 5) {
          noLoop();
        }


        switch(posCase) {

        case 1 :
          if (x < 1000-2*sqsize) {
            x = x + sqsize;
          }
          break;


        case 2 :
          if (x > 20) {
            x = x - sqsize;
          }
          break; 


        case 3 :
          if (y > 20+sqsize) {
            y = y + sqsize;
          }
          break;


        case 4 :
          if (y < 1000-2*sqsize) {
            y = y + sqsize;
          }
          break;
        }
        n++;

        if ( n == count) {
          println("yes");
          f = true;
        }


        lastTime = millis();
      }

      break;
    }
    fill(255, 0, 0);
    rect(x, y, sqsize, sqsize);
  }

  void right() {
    list[count] = 1;
    count++;

    /*f (x < 1000-2*sqsize) {
     x = x + sqsize;
     redraw();
     }*/
  }
  void left() {
    list[count] = 2;
    count++;
    /*if (x > 20) {
     x = x - sqsize;
     redraw();
     }*/
  }
  void up() {
    list[count] = 3;
    count++;
    /*if (y > 20+sqsize) {
     y = y + sqsize;
     redraw();
     }*/
  }
  void down() {
    list[count] = 4;
    count++;
    /*if (y < 1000-2*sqsize) {
     y = y + sqsize;
     redraw();*/
  }
  void ende() {

    list[count] = 5;
    count++;
  }
  void ask() {

    for ( int i = Players.size()-1; i>= 0; i--) {
      int[] check = Players.get(i).request();
      if ( dist(check[0], check[1], x, y) == 0) {

        Players.get(i).destroy();
      }
    }
  }

}