更改子弹离开屏幕上的值
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;
}
计算机这样做:
- 执行以下操作之一。如果
bultr
为 1,则执行 (a),否则执行 (b)。
- (a) 执行
drone1(...)
,并将 bultr
设置为该输出。
- (b) 将
bulletmover
设置为 0,将 bultr
设置为 1。
- 继续执行
if...else
语句之后的代码。
所以如果你把 int bultr = 1
直接放在它前面,计算机会 总是 看到 bultr
是 1,所以它总是会做 (a)永远不会(b)。我没有仔细阅读您的代码,但我认为您想要做的是:
- 如果
bultr
为 1,则执行 drone1(...)
,并将 bultr
设置为该输出。
- 如果
bultr
不是 1,则将 bulletmover
设置为 0,将 bultr
设置为 1。
- 继续执行
if...else
语句之后的代码。
在代码中,它看起来像这样:
if (bultr == 1) {
bultr = drone1(width/2, 0.1 * i, i, bulletmover);
}
if (bultr != 1) {
bulletmover = 0;
bultr = 1;
}
我在 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;
}
计算机这样做:
- 执行以下操作之一。如果
bultr
为 1,则执行 (a),否则执行 (b)。- (a) 执行
drone1(...)
,并将bultr
设置为该输出。 - (b) 将
bulletmover
设置为 0,将bultr
设置为 1。
- (a) 执行
- 继续执行
if...else
语句之后的代码。
所以如果你把 int bultr = 1
直接放在它前面,计算机会 总是 看到 bultr
是 1,所以它总是会做 (a)永远不会(b)。我没有仔细阅读您的代码,但我认为您想要做的是:
- 如果
bultr
为 1,则执行drone1(...)
,并将bultr
设置为该输出。 - 如果
bultr
不是 1,则将bulletmover
设置为 0,将bultr
设置为 1。 - 继续执行
if...else
语句之后的代码。
在代码中,它看起来像这样:
if (bultr == 1) {
bultr = drone1(width/2, 0.1 * i, i, bulletmover);
}
if (bultr != 1) {
bulletmover = 0;
bultr = 1;
}