java - 文字不会留在屏幕上
问题描述
我正在尝试在 Processing 中编写一个简单的太空游戏。这是代码:
float xPlayer, yPlayer;
float xBullet, yBullet;
float xMoon, yMoon;
float ySpeed;
boolean gunShoots = true;
boolean drawMoon = true;
PFont font;
void setup(){
size(500,500);
ySpeed = 10;
xBullet = xPlayer;
yBullet = yPlayer + 30;
xMoon = width;
yMoon = random(0,height);
font = loadFont("DINCondensed-Bold-48.vlw");
}
void draw(){
background(0);
circle(xBullet,yBullet,10); //gun
if(keyPressed && key == ' '){
gunShoots=true;
}
if (gunShoots == true){
xBullet = xBullet + 5; //gunshoots
}
if (xBullet > width){
gunShoots = false;
}
if (gunShoots == false){
xBullet = xPlayer +25; //gun resets
yBullet = yPlayer +30;
}
if((key =='a') || (key=='d') || (keyPressed == false) || (key == ' ')){ //spaceship stays
drawPlayer(xPlayer,yPlayer);
} else if((key == 'w')||(key == 's')){ //spaceship tilted
drawPlayertilted(xPlayer, yPlayer);
}
if(dist(xBullet, yBullet, xMoon, yMoon) > 30){
drawMoon = true;
} if (drawMoon == true){
drawMoon(xMoon,yMoon);
xMoon = xMoon - 1;
}
if(dist(xBullet, yBullet, xMoon, yMoon) < 30){
drawMoon = false;
if (drawMoon == false){
xMoon = -width;
displayText();
}
}
}
void drawPlayer(float x, float y){
stroke(0); //spaceship
strokeWeight(2);
fill(#F5F5F5);
circle(x,y,50);
fill(0);
circle(x,y,20);
triangle(x,y,x-8,y+25,x+8,y+25);
fill(105,105,105);
rect(x-20,y+20,40,5);
rect(x-25,y+25,50,15);
fill(255,255,0);
triangle(x-25,y+25,x-40,y+35,x-25,y+40);
triangle(x+25,y+25,x+40,y+35,x+25,y+40);
fill(#F5F5F5);
arc(x,y+40,50,20,0,PI,CHORD);
}
void drawPlayertilted(float x, float y){
stroke(0); //spaceship
strokeWeight(2);
fill(#F5F5F5);
ellipse(x,y,50,35);
fill(0);
triangle(x,y,x-19,y+20,x+19,y+20);
ellipse(x,y,20,15);
fill(105,105,105);
quad(x-15,y+15,x+15,y+15,x+20,y+18,x-20,y+18);
quad(x-25,y+18,x+25,y+18,x+30,y+30,x-30,y+30);
fill(255,255,0);
triangle(x+25,y+18,x+40,y+25,x+30,y+30);
triangle(x-25,y+18,x-40,y+25,x-30,y+30);
fill(#F5F5F5);
arc(x,y+30,60,20,0,PI,CHORD);
}
void drawMoon(float x, float y){
stroke(107, 112, 120);
fill(172, 175, 181);
circle(x,y,50);// moving moon
}
void displayText(){
textFont(font, 30);
fill(255);
textAlign(CENTER);
text("Winner Winner Chicken Dinner !!!", 250, 250);
}
void keyPressed(){ //spaceship movement
if(key =='s')
yPlayer = yPlayer + 10;
if(key =='w')
yPlayer = yPlayer - 10;
if(key =='a')
xPlayer = xPlayer - 5;
if(key =='d')
xPlayer = xPlayer + 5;
}
所以每次月亮被子弹击中时,我都希望出现一个文本,让玩家知道他们已经赢得了比赛。
if(dist(xBullet, yBullet, xMoon, yMoon) < 30){
drawMoon = false;
if (drawMoon == false){
xMoon = -width;
displayText();
}
但是,当月亮被击中时,文字只会弹出1s,但月亮消失后它不会留在屏幕上。如果有人可以帮助我,那就太好了。也欢迎其他关于如何改进代码的反馈和评论!
谢谢 :)
解决方案
在draw
循环中,即使游戏已获胜,您仍继续更改子弹和月亮的坐标。
因此,此检查if(dist(xBullet, yBullet, xMoon, yMoon) < 30)
返回 false 之间只是时间问题,并且您绘制“获胜者获胜者”文本的唯一位置是在 if 中。
您可以通过修改这部分代码轻松解决此问题:
if(dist(xBullet, yBullet, xMoon, yMoon) > 30){
drawMoon = true;
} if (drawMoon == true){
drawMoon(xMoon,yMoon);
xMoon = xMoon - 1;
}
if(dist(xBullet, yBullet, xMoon, yMoon) < 30){
drawMoon = false;
if (drawMoon == false){
xMoon = -width;
displayText();
}
}
并使它像这样:
// if drawMoon is false, no need to calculate the distance. If the distance is less than 30 pixels, no need to re-calculate it, we already know that drawMoon is now false
if(drawMoon && dist(xBullet, yBullet, xMoon, yMoon) > 30){
drawMoon(xMoon,yMoon);
xMoon = xMoon - 1;
}
else{
drawMoon = false;
}
// once drawMoon becomes false, draw the text. Knowing that there is no place where we set it to true, it implies that it'll always be drawn from this point on
if (!drawMoon){
displayText();
}
请注意,我目前不在 IDE 中,无法测试您的代码。对此我很抱歉,但我有理由认为它会没事的。
玩得开心!
推荐阅读
- java - 在 JAVA 中使用 this 在 ENUM 类函数中更改 ENUM 的值
- php - 动态创建输入字段并将这些属性存储在数据库中
- python - 当我使用网格时,我使用了一半的屏幕宽度和屏幕高度,但我得到了这些错误 tkinter python
- powershell - Powershell脚本:如何根据部分用户输入和打印查找文件?
- python - VsCode Insiders 中的 Jupyter Notebook 显示重复输出
- javascript - 将 PHP 放在 JavaScript 中会出现关于缺失的错误)
- python - 为什么每次我尝试使用 Open cv 的 Video Capture 时都会出现错误,它在 Visual Studio 中不断出现同样的错误
- php - 500:PHP 解析错误:语法错误,意外的“?”
- python - python中的链接类
- python - 如何找到相关性超过 0.50 的任何属性