【问题标题】:Text won't stay on screen文字不会留在屏幕上
【发布时间】:2021-11-08 19:46:22
【问题描述】:

我正在尝试在 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(); 
    }

但是,文本仅在月亮被击中时弹出 1 秒,但在月亮消失后不会停留在屏幕上。如果有人可以帮助我,那就太好了。也欢迎其他关于我如何改进代码的反馈和 cmets!

谢谢你:)

【问题讨论】:

  • 改进:为什么要进行 2 次测试?以下语法不够 if(dist(xBullet, yBullet, xMoon, yMoon)
  • 请修剪您的代码,以便更容易找到您的问题。请按照以下指南创建minimal reproducible example

标签: java processing display


【解决方案1】:

draw 循环中,即使游戏已获胜,您仍继续更改子弹和月亮的坐标。

因此,此检查 if(dist(xBullet, yBullet, xMoon, yMoon) &lt; 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,无法测试您的代码。对此我很抱歉,但我有理由认为它会没事的。

玩得开心!

【讨论】:

  • 嗨 Laancelot,谢谢你的回答 :) 我已经按照你的建议修复了代码,但是当我删除了绘制月亮的条件时:if(dist(xBullet, yBullet, xMoon, yMoon) &lt; 30),它没有检测到碰撞当我开枪的时候。我曾想过使用 x 和 y 坐标进行另一种碰撞检测,但我也觉得这很困难。真的很困惑:(
  • 嘿! nvm 我在修复代码时犯了一些错误 :) 它现在可以工作了!谢谢你:)
猜你喜欢
  • 2013-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-09
  • 2016-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多