J'apprends Java, et je sais que l'une des grandes plaintes concernant les programmeurs débutants est que nous faisons des méthodes très longues et complexes qui devraient être divisées en plusieurs. Eh bien, voici celui que j'ai écrit et est un exemple parfait. :-RÉ.refactorisation de cette fonction en Java
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);
}
}
}
Vous pouvez voir à partir du titre de la méthode que j'ai commencé avec de bonnes intentions de "construire la balle".
Il y a quelques questions que je courais contre:
Le problème est que je devais passer la balle, donc j'ai créé en boucle. Je ne vois pas d'autre moyen de le faire que de le garder "vrai", ce qui signifie que tout autre code que je crée en dessous de cette boucle ne se produira pas. Je n'ai pas fait la boucle while une fonction différente parce que j'utilisais ces variables i and j
. Donc, je ne vois pas comment je peux refactoriser au-delà de cette boucle.
Ma question principale est:
Comment pourrais-je transmettre les valeurs de i and j
à une nouvelle méthode: « animateBall » et comment pourrais-je utiliser ball.move(vx + vx, vy + vy);
dans cette nouvelle méthode si la balle a été déclarée dans la méthode buildBall ?
Je comprends ce qui est probablement une chose simple d'une meilleure compréhension et la portée des variables arguments qui passe, mais je ne suis pas encore tout à fait ...
Umm ... le mot est écrit "collisionneur" et non "colider". Et il y a beaucoup de problèmes de style avec votre code. –
umm-merci pour votre aide? – Joel
Pouvez-vous être un peu plus précis que ce que vous essayez de faire avec l'objet «boule»? Dites, par exemple, si vous avez un objet de balle, comment voulez-vous qu'il bahave, comme les méthodes devraient avoir un objet balle? De cette façon, il serait plus facile de fournir une solution. – Zaki