当randomRestart设置为(550,650)时,小行星不显示?

时间:2015-12-11 03:53:20

标签: processing

class Sprite {
  float x;
  float y;
  float dx;
  float dy; 
}

Sprite player= new Sprite();

class Asteroids extends Sprite {
  float speedmultiplier;
  float speedupposition;
  color asteroidcolor;
  color hitcolor;
  String state; // "entering", "moving", "speed up"

当我将randomRestart设置为超过500(屏幕大小)的任何内容时,小行星完全停止动画。在“重新启动”状态下,更新功能中还有一个x = random(550,650),并且还有一个roix.x = random(550,650)。这些会影响randomRestart吗?

另一个问题是,我怎么能用小行星输入命中检测,以便玩家失去生命?

提前感谢您的帮助。

  void randomRestart(){
    x= random(550,650);
    y= random(50,550);
    speedmultiplier= random(1.10,1.5);
    dx= random(1.5,2.5);
    dy= 0;
    speedupposition= random(300,450);
    asteroidcolor= color(50,40,18);
    hitcolor= color(256, 0,0);   

    state = "entering";    
  }

  void render(){
    pushMatrix();
    if(state.equals("entering")){
      //translate(x,y);
      fill(asteroidcolor);
      noStroke();
      ellipse(x,y,50,50);
    }
    else if(state.equals("speed up")){
      //translate(x,y);
      fill(asteroidcolor);
      noStroke();
      ellipse(x,y,50,50);
    }

    else if(state.equals("hit")){
      //translate(x,y);
      fill(hitcolor);
      noStroke();
      ellipse(x,y,50,50);
    }
    else if (state.equals("restart")){
       translate(x,y); 
       fill(asteroidcolor);
       noStroke();
       ellipse(x,y,50,50);
    }

    popMatrix();
  }

  void update(){
  if (state.equals("entering")){
    x += -dx;
    if (state.equals("speed up")){
  x += -dx * speedmultiplier;
  }
  }
    if (x < 0 || x > width){
      state ="restart";
      randomRestart();    
      }

     else if (state.equals("restart")){
      x += dx;
       if (x < -50 || x >width){
      state = "entering";
      x= random(550,650);
      dx = -dx;
      randomRestart();
      }
  }
}


Asteroids randomAsteroids(){
  Asteroids roid = new Asteroids();
    roid.x= random(550,650);
    roid.y= random(50,550);
    roid.speedmultiplier= random(1.10,2.0);
    roid.dx= random(1.5,3.0);
    roid.dy= 0;
    roid.speedupposition= random(300,450);
    roid.asteroidcolor= color(50,40,18);
    roid.asteroidcolor= color(50,50,50);
    roid.hitcolor= color(256, 0,0);  
    return roid;
}

int NUM_ROIDS= 10;
ArrayList<Asteroids> roidsList;

void setup(){
  size(500,500);
  player.x = 50;
  player.y= 250;
  player.dx=0;
  player.dy=20.5; 

  roidsList = new ArrayList<Asteroids>();

  int i = 0;
  while (i<8){
   Asteroids a = new Asteroids();
   a.randomRestart();
    roidsList.add(a);
    ++i;
  }
}


void draw(){
  background(255);
  fill(0,0,0);
  noStroke();
  rect(player.x,player.y,10,30);
  player.x += player.dx;

  for (Asteroids b : roidsList){
    b.render();
    b.update();
  }
}

void keyPressed(){
  if (key =='w'){
  player.y += -player.dy;
  }
  if (key =='s'){
  player.y += player.dy;
  }
}

1 个答案:

答案 0 :(得分:0)

查看代码的这一部分:

if (x < 0 || x > width){
   state ="restart";
   randomRestart();    
}

如果您使用randomRestart()方法,x超过width,会怎样?

此if语句将始终被触发,因此您将再次重新启动您的小行星,将其置于屏幕边界之外,这会再次触发此if语句,重新启动它,这样......所以您永远不会给你的小行星有机会到达屏幕。

相反,你可能想让你的小行星在屏幕外有一些空间:

if (x < -100 || x > width + 100){
   state ="restart";
   randomRestart();    
}

碰撞检测是一个非常大的主题,您应该尝试一些事情并在另一个问题中询问。别忘了发帖MCVE。无耻的自我推销:我已经在可用的处理here中编写了关于碰撞检测的教程。