首页 > 解决方案 > 文字不会留在屏幕上

问题描述

我正在尝试在 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,但月亮消失后它不会留在屏幕上。如果有人可以帮助我,那就太好了。也欢迎其他关于如何改进代码的反馈和评论!

谢谢 :)

标签: javaprocessingdisplay

解决方案


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 中,无法测试您的代码。对此我很抱歉,但我有理由认为它会没事的。

玩得开心!


推荐阅读