我正在学习Java,并且我知道有关新手程序员的最大抱怨之一是,我们花了很长时间并且涉及很多方法,应该将其分解为几种方法。好吧,这是我写的一个,是一个完美的例子。 :-D
public void buildBall(){
/* sets the x and y value for the center of the canvas */
double i = ((getWidth() / 2));
double j = ((getHeight() / 2));
/* randomizes the start speed of the ball */
vy = 3.0;
vx = rgen.nextDouble(1.0, 3.0);
if (rgen.nextBoolean(.05)) vx = -vx;
/* creates the ball */
GOval ball = new GOval(i,j,(2 *BALL_RADIUS),(2 * BALL_RADIUS));
ball.setFilled(true);
ball.setFillColor(Color.RED);
add(ball);
/* animates the ball */
while(true){
i = (i + (vx* 2));
j = (j + (vy* 2));
if (i > APPLICATION_WIDTH-(2 * BALL_RADIUS)){
vx = -vx;
}
if (j > APPLICATION_HEIGHT-(2 * BALL_RADIUS)){
vy = -vy;
}
if (i < 0){
vx = -vx;
}
if (j < 0){
vy = -vy;
}
ball.move(vx + vx, vy + vy);
pause(10);
/* checks the edges of the ball to see if it hits an object */
colider = getElementAt(i, j);
if (colider == null){
colider = getElementAt(i + (2*BALL_RADIUS), j);
}
if (colider == null){
colider = getElementAt(i + (2*BALL_RADIUS), j + (2*BALL_RADIUS));
}
if (colider == null){
colider = getElementAt(i, j + (2*BALL_RADIUS));
}
/* If the ball hits an object it reverses direction */
if (colider != null){
vy = -vy;
/* removes bricks when hit but not the paddle */
if (j < (getHeight() -(PADDLE_Y_OFFSET + PADDLE_HEIGHT))){
remove(colider);
}
}
}
从该方法的标题中可以看出,我的初衷是“构建球”。
我遇到了一些问题:
问题是我需要移动球,所以我创建了while循环。除了将其保持为“ true”,我看不到其他任何方式可以做到这一点,这意味着在此循环下创建的任何其他代码都不会发生。我没有使while循环成为其他函数,因为我正在使用那些变量
i and j
。因此,我看不到如何在此循环之外进行重构。
所以我的主要问题是:
如何将
i and j
的值传递给新方法:“ animateBall”以及如何使用如果在buildBall方法中已声明ball,则在该新方法中
ball.move(vx + vx, vy + vy);
?我知道这可能是更好地了解变量作用域和传递参数的简单事情,但是我还没有到那里...
最佳答案
可以重构为三种方法
a>构建球:创建球对象并设置初始位置:buildBall()
b>为整个while循环设置动画,除了对撞机部分进行动画处理(球形,vx,vy)
c>获取对撞机getCollider()
由于ball是一个对象,并且您已经将i,j设置为其字段,因此它们将被传递。 Java通过值传递所有参数。对象存在于堆中;对象引用按值作为方法参数传递。
编辑,添加伪代码
class Animator{
void animateBall(){
Ball ball = buildBall(); //Ball will have i,j,radius etc set by this method
int vx = randomNumber();
int vy = randomNumber();
moveIt(vx,vy, ball);
}
void moveIt(int vx, int vy, Ball ball){
while(true){
//move the ball, change i,j fields of ball
//check for collission etc
Collider collider = getCollider(ball);
//change direction based on collider etc.
}
}
Collider getCollider(Ball ball){
//collision code here
}
}