我如何让玩家的移动功能只计数一次,以便他们可以一个一个地执行?
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();
}
}
}
}
我目前有一个游戏,其中有一个玩家和一些障碍物,我想用一些命令来导航这个玩家,但问题是命令得到执行但矩形没有得到更新所以我必须做一些带有 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();
}
}
}
}