问题描述
我在处理 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);
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,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,10,10);
fill(51,51,204);
rect(x+10,10);
rect(x-10,10);
fill(255,215,0);
rect(x,y-10,0);
rect(x+10,y+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,bulletmover);
}
if (bultr != 1) {
bulletmover = 0;
bultr = 1;
}