一次后继续移动的对象

问题描述

我想知道是否有人可以帮助我完成这个程序。

我需要让水平移动的球再次开始移动,然后射出另一个垂直移动的球。我怎样才能让这种情况一遍又一遍地发生,而不是一次又一次地停止?

另外,我怎样才能通过键盘上的任意键而不是触摸板来完成球的发射?

这是我的程序:

    int xPos =200;
    int yPos =700;
    int xDir=3;   // SPEED
    
    float ball2X;
    float ball2Y;
    float ball2Speed=5;
    boolean ball2Exist = false;
    
    void setup () {  
    size (1280,960);
    }
    
    void draw() {
    background(255);
    fill (255,200,200);
    rect (0,550,width,height);
    fill (225);
    
    //Player(ball)
    ellipse(xPos,yPos,140,140);
    fill (255,200);
      xPos=xPos+xDir;
      if (xPos>width-20 || xPos<20)
      {
        xDir=-xDir;
      }
      
      if(ball2Exist)
      {
        fill (255,0);
        ellipse(ball2X,ball2Y,70,70);
        ball2Y -= ball2Speed;
      }
    }
    
    void mouseClicked() {
      if(xDir!=0) // first click
      xDir = 0;
      else // second click
      {
        ball2X = xPos;
        ball2Y = yPos;
        ball2Exist = true;
      }
    }

解决方法

为了通过按键完成球的发射,您可以像使用 keyPressed() 函数一样使用 mouseClicked() 函数。为了使水平球在发射球后继续移动,您只需将球的速度 xDir 设置为其旧值。为了确保它继续朝同一方向前进,您应该在将其设置为 0 之前使用一个变量来存储其当前值,然后您可以在发射球后将 xDir 设置为该值。为了有多个红球,您需要存储一个球信息列表,以便您可以同时绘制多个球,并且为了有效地做到这一点,您可能需要创建一个 Ball 类。

在下面的程序中,我做了一个ball类来封装所有的球画,我用PVectors来处理位置和速度的x和y坐标。

// Horizontal ball
Ball mainBall;
// List of red balls
ArrayList<Ball> balls;

void setup () {  
  size (1280,960);
  
  //Create main ball
  mainBall = new Ball(200,700,3,140,color(255,200,200));
  
  // Create list of balls
  balls = new ArrayList<Ball>();
}

void draw() {
  background(255);

  fill (255,200);
  rect (0,550,width,height);
  
  ellipseMode(CENTER);

  //If the main ball collides with edge of window,reverse speed
  mainBall.collisionUpdate();
  //Draw the main ball
  mainBall.drawBall();
  
  //Create arraylist to store balls to get removed from the list
  ArrayList<Ball> toRemove = new ArrayList<Ball>();
  
  // For every ball
  for(Ball ball : balls){
    ball.drawBall();
    
    //If the ball is off the screen need to remove it
    if(ball.isNotVisible()){
      toRemove.add(ball);
    }
  }
  
  // Remove all the non-visible balls
  balls.removeAll(toRemove);
}

void launch(){
  // Add a new ball to the list
  balls.add(new Ball(mainBall.position.x,mainBall.position.y,-5,70,0)));
}

void mouseClicked() {
  launch();
}

void keyPressed(){
  launch();
}

// Ball class
class Ball{
  PVector position;
  PVector speed;
  float diameter;
  color c;
  
  Ball(float x,float y,float xSpeed,float ySpeed,float _diameter,color _c){
    position = new PVector(x,y);
    speed = new PVector(xSpeed,ySpeed);
    diameter = _diameter;
    c = _c;
  }
  
  void drawBall(){
    fill(c);
    circle(position.x,position.y,diameter);
    // Update position of ball
    position.add(speed);
  }

  void collisionUpdate(){
    if(position.x < diameter/2 || position.x > width-diameter/2 || position.y < diameter/2 || position.y > height-diameter/2 ){
      //Reverse speed
      speed.mult(-1);
    }
  }
  
  // Return true or false if the ball is off the screen
  boolean isNotVisible(){
     return position.x > width+diameter || position.x < -diameter || position.y > height+diameter || position.y < -diameter;
  }
}

编辑:

使球减速并跳出窗口边界。我还使用了一个随机函数来随机化球减速的速度和速率。

// Horizontal ball
Ball mainBall;
// List of red balls
ArrayList<Ball> balls;

PVector oldSpeed;

void setup () {  
  size (1280,reverse speed
  mainBall.collisionUpdate();
  //Draw the main ball
  mainBall.drawBall();
  
  //Create arraylist to store balls to get removed from the list
  ArrayList<Ball> toRemove = new ArrayList<Ball>();
  
  // For every ball
  for(Ball ball : balls){
    // Balls bounce within the screen
    ball.collisionUpdate();
    
    // Slow the speed of the ball
    ball.slowSpeed(random(0.98,0.999));
    
    ball.drawBall();
    
    //If the ball is off the screen need to remove it
    if(ball.isNotVisible()){
      toRemove.add(ball);
    }
  }
  
  // Remove all the non-visible balls
  balls.removeAll(toRemove);
}

void launch(){
  if(!mainBall.isStationary()){
    oldSpeed = mainBall.speed;
    mainBall.setSpeed(0,0);
  }else{
    // Add a new ball to the list
    balls.add(new Ball(mainBall.position.x,random(-8,-5),0)));
    //Make the main ball move again
    mainBall.setSpeed(oldSpeed);
  }
}

void mouseClicked(){
  launch();
}

void keyPressed(){
  launch();
}

// Ball class
class Ball{
  PVector position;
  PVector speed;
  float diameter;
  color c;
  
  Ball(float x,diameter);
    // Update position of ball
    position.add(speed);
  }
  
  void setSpeed(float xSpeed,float ySpeed){
    speed = new PVector(xSpeed,ySpeed);
  }
  
  void setSpeed(PVector _speed){
    speed = _speed;
  }
  
  boolean isStationary(){
    return speed.x == 0 && speed.y == 0;
  }

  void collisionUpdate(){
    if(position.x < diameter/2 || position.x > width-diameter/2 || position.y < diameter/2 || position.y > height-diameter/2 ){
      //Reverse speed
      speed.mult(-1);
    }
  }
  
  void slowSpeed(float deceleration){
      if(speed.mag() < 0.5){
          speed = new PVector(0,0);
      }else{
          speed.mult(deceleration);
      }
  }
  
  // Return true or false if the ball is off the screen
  boolean isNotVisible(){
     return position.x > width+diameter || position.x < -diameter || position.y > height+diameter || position.y < -diameter;
  }
}