我目前有一个游戏,它有一个玩家和一些障碍,我想用一些命令来导航这个玩家,但问题是命令被执行了,但是矩形没有更新,所以我不得不用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();
}
}
}
}有没有办法也能检测到玩家的哪一边碰到了障碍物。
非常感谢(我是新手)。
发布于 2020-06-18 23:50:07
这是我解决问题的方式(我使用了案例):
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();
}
}
}
}https://stackoverflow.com/questions/62424349
复制相似问题