[Java podstawy] Prosta animacja - kulka

0

Witam,
Dopiero się uczę tego języka i mam nadzieje otrzymać kilka podpowiedzi...
Chciałbym, żeby kulki odbijały się od siebie i od ścian ale nie wiem jaki warunek muszę postawić lub jakiej metody użyć.
Podaje swój kod:

import java.awt.Color;

import acm.graphics.GOval;
import acm.program.GraphicsProgram;


public class kula extends GraphicsProgram{
private static final double BALL_SIZE = 50;
private static final double SPEED=2.0;    
private static final double GRAVITY=0.125;    
private static final double ELASICITY=1;
private static final double PAUSE = 1000/48.0;    
 


public void run(){
    GOval ball = makeBall();
    GOval pilka = makePilka();
    GOval kolo = makeKolo();
    add(kolo);
    add(ball);
    add(pilka);
    bounce(ball,pilka,kolo);
   
}

   private void bounce (GOval ball,GOval pilka,GOval kolo){
       double dx = SPEED;
       double dy = 0.0;
       
       double fx = SPEED+2;
       double fy = 0.0;
       
       double gx=-SPEED*2;
       double gy= 0.0;
       
       double xm = getSize().width;
       double ym = getSize().height;

       
       while(true){
           ball.move(dx,dy);
           dy += GRAVITY;
           
        
           
           pilka.move(fx, fy);
           fy += GRAVITY;
           
           kolo.move(gx, gy);
           gy -=GRAVITY;
           
           
           
           if(hasBallHitBottom(pilka) && fy>=0){
               fy+=-ELASICITY;
               fx=2;
               pilka.move(fx, fy);         	   
               }
           
        
           if(hasBallHitBottom(ball) && dy>=0){
               dy+=-ELASICITY;
           }
           

                      pause(PAUSE);
           
       }
       
       
   }

   
   private boolean hasBallHitBottom(GOval ball){
       double bottomY=ball.getHeight();
       return bottomY>=getHeight();
   }
   
   private boolean hasBallHitTop(GOval ball){
	   double topY=ball.getHeight();
	   return topY>getHeight();
   }
   
    private GOval makeBall(){
        GOval result = new GOval (0,0,BALL_SIZE,BALL_SIZE);
        result.setFilled(true);
        result.setColor(Color.RED);
        return result;
    }
    
    private GOval makePilka(){
    	  GOval result = new GOval (0,0,BALL_SIZE,BALL_SIZE);
          result.setFilled(true);
          result.setColor(Color.BLUE);
          return result;
    }
    
    private GOval makeKolo(){
    	   double xm = getSize().width;
           double ym = getSize().height;
  	  GOval result = new GOval (xm,ym,BALL_SIZE,BALL_SIZE);
        result.setFilled(true);
        result.setColor(Color.GREEN);
        return result;
  }
    
}
0

Dla odbicia się od ścian to po prostu przy osiągnięciu granicy x zmień prędkość wektorową x np:

if((ball.getX()+25)>500 || (ball.getX()-25)<0) gx*=-1;

//przyjąłem że że promień kuli to 25.

Zaś jeśli chodzi o kolizje kulek to bardziej skomplikowana sprawa :D. Kolizje sprawdzasz przez wzięcie pozycji dwóch kul (od ich środków) oraz porównanie ich odległości do sumy promieni oby dwóch kul.
Z internetu na szybko przykład:

if ( Math.sqrt( ( x2-x1 ) * ( x2-x1 )  + ( y2-y1 ) * ( y2-y1 ) ) < ( radius1 + radius2 ) ) 
{
    Console.WriteLine("The 2 circles are colliding!");
}

gdzie ixy i igerki to parametry środków zaś radius to promienie.

A teraz się zastanów czy one mają być bardziej sprężyste czy niesprężyste i poszukaj w internecie algorytmów na
"odbicie sprężyste (bądź niesprężyste) niecentralne kul".

1 użytkowników online, w tym zalogowanych: 0, gości: 1