更改子弹离开屏幕上的值

Changing value on bullet leaving screen

我在 Processing 3.5.3 中有一堆写得很糟糕的代码。 当“子弹”离开屏幕时,我希望“无人机”再次射击,但它开始出现故障。 任何想法,可能有什么问题,或者如何改进屏幕离开检测或类似的事情。 我把整个代码复制到这里,你可以试试看,因为它还没有那么复杂

int charx;
int chary;
void setup() {
  charx = width/2;
  chary = height - height/10;
  fullScreen();
  background(0);
}
void keyPressed(){
  if(key=='w'){if(!(chary<30))chary-=15;}}
  if(key=='s'){if(!(chary>height-60)){chary+=15;}}
  if(key=='a'){charx-=15;if(charx<30){charx=width-30;}}
  if(key=='d'){charx+=15;if(charx>width-30){charx=30;}}
}
int bullet(int x, int y) {
  if ( y > height - 30){return(0);}
  fill(175, 0, 0);
  triangle(x, y, x-8, y-16, x+8, y-16);
  fill(255);
  return(1);
}
int launch = 0;
int starterx = 0;
int drone1(float startx, float xm, int y, int i) {
  int x = ceil(startx) + ceil(40 * sin(xm));
  if (i == 0) {
    starterx = ceil(startx);
  } else {
    if (launch == 0) {
      starterx = x;
      launch = 1;
      return(0);
    }}
  fill(0, 200, 50);
  rect(x, y, 30, 30);
  fill(255);
  if (launch == 1) {
    launch = bullet(ceil(asin(x)) + starterx + 15, y + 46 + i * 3);
  }
  return(1);}
void player(int x, int y) {
  fill(255);
  rect(x, y, 10, 10);
  fill(51, 51, 204);
  rect(x+10, y, 10, 10);
  rect(x-10, y, 10, 10);
  fill(255, 215, 0);
  rect(x, y-10, 10, 10);
  fill(255, 0, 0);
  rect(x+10, y+10, 10, 10);
  rect(x-10, y+10, 10, 10);
  fill(255);
}
int i = 0; 
int bulletmover = 0;
void draw() {
  background(0);
  player(charx, chary);
  int bultr = 1;
  if (bultr == 1) {
    bultr = drone1(width/2, 0.1 * i, i, bulletmover);
  } else {
    bulletmover = 0;
    bultr = 1;
  }
  bulletmover += 1;
  i += 1;
}

您的 draw 循环中有一些死代码(永远不会 运行 的代码)。当你写

if (bultr == 1) {
  bultr = drone1(width/2, 0.1 * i, i, bulletmover);
} else {
  bulletmover = 0;
  bultr = 1;
}

计算机这样做:

  1. 执行以下操作之一。如果 bultr 为 1,则执行 (a),否则执行 (b)。
    • (a) 执行 drone1(...),并将 bultr 设置为该输出。
    • (b) 将 bulletmover 设置为 0,将 bultr 设置为 1。
  2. 继续执行 if...else 语句之后的代码。

所以如果你把 int bultr = 1 直接放在它前面,计算机会 总是 看到 bultr 是 1,所以它总是会做 (a)永远不会(b)。我没有仔细阅读您的代码,但我认为您想要做的是:

  1. 如果 bultr 为 1,则执行 drone1(...),并将 bultr 设置为该输出。
  2. 如果 bultr 不是 1,则将 bulletmover 设置为 0,将 bultr 设置为 1。
  3. 继续执行 if...else 语句之后的代码。

在代码中,它看起来像这样:

if (bultr == 1) {
  bultr = drone1(width/2, 0.1 * i, i, bulletmover);
}
if (bultr != 1) {
  bulletmover = 0;
  bultr = 1;
}