2010-04-20 5 views
4

J'ai une simple applet Java qui a deux boules contrôlées par l'utilisateur, dessinées en utilisant java.awt. J'ai besoin d'un moyen de détecter une collision entre eux. Je un algorithme de détection de collision avec les parois:Détection de collision pour les cercles

if (xPosition > (300 - radius)){ 
    xSpeed = -xSpeed; 
} 
else if (xPosition < radius){ 
    xSpeed = -xSpeed; 
} 
else if (yPosition > (300 - radius)) { 
    ySpeed = -ySpeed; 
} 
else if (yPosition < radius){ 
    ySpeed = -ySpeed; 
} 
xPosition += xSpeed; 
yPosition += ySpeed; 

et pour la deuxième bille:

if (xPosition2 > (300 - radius)){ 
    xSpeed2 = -xSpeed2; 
} 
else if (xPosition2 < radius){ 
    xSpeed2 = -xSpeed2; 
} 
else if (yPosition2 > (300 - radius)) { 
    ySpeed2 = -ySpeed2; 
} 
else if (yPosition2 < radius){ 
    ySpeed2 = -ySpeed2; 
} 
xPosition2 += xSpeed2; 
yPosition2 += ySpeed2; 
  • L'applet est de 300 pixels par 300 pixels.
  • radius stocke le rayon des cercles.
  • xPosition et xPosition2 stocker les coordonnées x pour les deux balles.
  • yPositionyPosition et stocker les coordonnées Y pour les deux billes,
  • xSpeedxSpeed2 et stocker les vitesses de x pour les deux billes.
  • ySpeed et ySpeed2 stocker les vitesses y pour les deux balles.
+0

Bienvenue sur SO, Bob. C'est vraiment plus une question mathématique qu'une question de programmation, car il n'y a aucun moyen de faire ce que vous voulez construit dans le langage Java. Pour commencer, cependant, pensez-y de la façon suivante: détecter des collisions signifie détecter quand les balles vont se chevaucher ou se toucher, n'est-ce pas? Et vous connaissez leurs positions et leurs tailles ... – Pops

+0

Ya, mais je ne peux rien penser. J'ai essayé de le faire à travers les maths et je me suis retrouvé avec des balles qui se croisaient et environ 30 lignes de code inutile –

Répondre

5

Utilisez http://java.sun.com/j2se/1.5.0/docs/api/java/awt/geom/Point2D.html, il existe une méthode de distance, si elle est inférieure au rayon de collision.

EDIT: Err, inférieur au rayon * 2, désolé

+0

Kool merci!J'avais entendu parler d'une commande qui se croisait ... mais apparemment, cela ne fonctionne qu'avec des rectangles. –

+0

Je voudrais +1 vous mais je ne peux pas –

+0

Dans la mémoire de Bob Twinkles, j'avais +1 –

1

Il y a Point2D en Java ou vous pouvez le faire vous-même, il est trivialement facile pour les collisions cercle/cercle ou collisions sphère/sphère.

int distXX = (xPosition1 - xPosition2) * (xPosition1 - xPosition2); 
int distYY = (yPosition1 - yPosition2) * (yPosition1 - yPosition2); 
if (radius*radius > distXX * distYY) { 
    ... // There's a collision 
} 
+1

Notez que l'erreur typique de débutant de développeur de jeu serait de commencer à utiliser des "racines carrées" pour calculer la distance et vérifier avec le rayon, au lieu de ne pas carrément rooter et vérifier avec le * rayon x rayon *. La solution ci-dessus n'utilise qu'une correspondance discrète et en fait * est * ce qui est utilisé dans un * lot * de jeux (il y a des décennies que nous écrivions des jeux, c'était * la * manière de le faire). – SyntaxT3rr0r

+0

oooh grâce à vous! –

+0

ok Je viens de compiler et j'ai couru et la balle a coché avec tout mais l'autre balle –

-1
public boolean colliding(Ball anotherBall) { 
    double xDelta = (this.x + this.ballSize/2 + this.dx) - (anotherBall.x + anotherBall.ballSize/2 + anotherBall.dx); 
    double YDelta = (this.y + this.ballSize/2 + this.dy) - (anotherBall.y + anotherBall.ballSize/2 + anotherBall.dy); 
    double distance = Math.sqrt(Math.pow(xDelta, 2) + Math.pow(YDelta, 2)); 

    return (distance <= this.ballSize/2 + anotherBall.ballSize/2); 

} 
+0

erm c'est sympa mais je cours l'application entière d'une classe –

-1

Ce lien est très utile!

Circle-Circle Collisions

Il est très détaillé et didatic


Au bas de cette page il y a un autre lien, même à des choses plus détaillées!


J'utilisé la distance entre les centres méthode --- Circles

En mesurant la distance entre chaque centre, vous pouvez dire si elles sont en collision. La distance ne doit jamais être supérieure à la somme des 2 rayons.

Voici ce que je l'ai fait:

private boolean checkDrawContains(ShapeDrawable newHole) 
{ 
    long newCenterX = newHole.getBounds().left + (newHole.getBounds().width()/2); //Get the center of my shapes 
    long newCenterY = newHole.getBounds().top + (newHole.getBounds().height()/2); 

    for(ShapeDrawable hole: mHoles) // I was storing the circles in an ArrayList 
    { 
     long centerX = hole.getBounds().left + (hole.getBounds().width()/2); //Get the center of my shapes 
     long centerY = hole.getBounds().top + (hole.getBounds().height()/2); 
     long x = centerX - newCenterX; 
     long y = centerY - newCenterY; 
     long aux = (long) ((Math.pow(Math.abs(x),2)) + (Math.pow(Math.abs(y),2))); //Pythagoras the hard way :P 
     long distance = (long) Math.sqrt(aux); 
     long sRads = (newHole.getBounds().width()/2) + (hole.getBounds().width()/2); 

     if(distance <= sRads) { 
      return true; //Is Colliding! 
     } 
    } 
    return false; // Is not Colliding! 
} 
Questions connexes