一次后继续移动的对象 [英] Object to continue moving after one go
问题描述
我想知道是否有人可以帮助我完成这个程序.
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屋!