我正在学习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
    }
}

09-11 19:23