一次后继续移动的对象 [英] Object to continue moving after one go

查看:50
本文介绍了一次后继续移动的对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I was wondering if anyone could help me with this program.

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

I need to make the ball that is going horizontally start moving again and then shoot another ball that is going vertically. How can I make this happen over and over again, rather than it stopping after one go?

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

Also, how can I make the ball launching done by any key on the keyboard rather than the touchpad?

这是我的程序:

    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, 200);
      xPos=xPos+xDir;
      if (xPos>width-20 || xPos<20)
      {
        xDir=-xDir;
      }
      
      if(ball2Exist)
      {
        fill (255, 0, 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 类.

In order to make the ball launching done by pressing a key, you can use the keyPressed() function in the same way that you used the mouseClicked() function. In order to make the horizontal ball continue moving after launching a ball, you can just set the ball's speed xDir to its old value. To ensure that it continues going in the same direction you should use a variable to store its current value before you set it to 0, then you can set xDir to this value after launching the ball. In order to have multiple red balls you want to store a list of ball information so that you can draw multiple balls at the same time and in order to this effectively, you probably want to create a Ball class.

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

In the following program, I made a ball class to encapsulate all of the ball drawing, and I used PVectors to deal with the x and y corrdinates for position and speed.

// 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, 0, 140, color(255, 200, 200));
  
  // Create list of balls
  balls = new ArrayList<Ball>();
}

void draw() {
  background(255);

  fill (255, 200, 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, 0, -5, 70, color(255, 0, 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;
  }
}

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

To make the balls decelerate and ricochet off the window boundaries. I also used a random function to randomise the speed and the rate at which the balls decelerate.

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

PVector oldSpeed;

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

void draw() {
  background(255);

  fill (255, 200, 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){
    // 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, mainBall.position.y, 0, random(-8, -5), 70, color(255, 0, 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, 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 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;
  }
}

这篇关于一次后继续移动的对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆