2016-06-22 12 views
0

Ich bin ziemlich neu in Java und ich verwende die ACM-Bibliothek für Grafiken. Was ich versuche mit diesem Code zu tun ist:Java Glitchy Collision Detection mit ACM Graphics

  1. Führen Sie zwei Kugeln, eine auf der linken Seite und eine in der Mitte. Beide sind in der Mitte, y-Koordinaten.
  2. Machen Sie den ersten Ball, bis Sie den zweiten Ball treffen. Stoppen Sie dann und geben Sie der zweiten Kugel eine Geschwindigkeit proportional zu ihrer Größe (ähnlich einer Impulserhaltung).
  3. Den zweiten Ball von der Wand springen lassen und bewegen, bis der erste Ball getroffen wird. Stoppen Sie dann und geben Sie der ersten Kugel wieder eine ihrer Größe proportionale Geschwindigkeit.
  4. Machen Sie diese Aktion unendlich.

Mein Code ist als solche:

import java.awt.Color; 

import acm.graphics.*; 
import acm.program.*; 
import acm.util.RandomGenerator; 

public class Collision extends GraphicsProgram { 

    private static final double RADIUS_ONE = 35; 
    private static final double RADIUS_TWO = 65; 

    public void run() { 

     GOval ballOne = new GOval(0, (getHeight() - RADIUS_ONE)/2, RADIUS_ONE, RADIUS_ONE); 
     ballOne.setFilled(true); 
     ballOne.setColor(Color.GREEN); 
     add(ballOne); 

     GOval ballTwo = new GOval((getWidth() - RADIUS_TWO)/2, (getHeight() - RADIUS_TWO)/2, RADIUS_TWO, RADIUS_TWO); 
     ballTwo.setFilled(true); 
     ballTwo.setColor(Color.ORANGE); 
     add(ballTwo); 

     double velocityOne = 3; 
     double velocityTwo = 0; 

     while (true) { 

      ballOne.move(velocityOne, 0); 
      ballTwo.move(velocityTwo, 0); 

      if (ballOne.getX() >= getWidth() - RADIUS_ONE || ballOne.getX() <= 0) { 
       velocityOne = -velocityOne; 
      } 
      if (ballTwo.getX() >= getWidth() - RADIUS_TWO || ballTwo.getX() <= 0) { 
       velocityTwo = -velocityTwo; 
      } 

      if (ballOne.getX() + RADIUS_ONE >= ballTwo.getX()) { 

       if (velocityTwo == 0) { 
        velocityTwo = (velocityOne * RADIUS_ONE * RADIUS_ONE)/(RADIUS_TWO * RADIUS_TWO); 
        velocityOne = 0; 
       } else if (velocityOne == 0) { 
        velocityOne = (velocityTwo * RADIUS_TWO * RADIUS_TWO)/(RADIUS_ONE * RADIUS_ONE); 
        velocityTwo = 0; 
       } 

      } 

      pause(10); 
     } 
    } 
} 

Wenn Sie diesen Code ausführen, sehen Sie es nicht richtig funktioniert. Beim Treffen des zweiten Balls hört der erste Ball nicht auf, sich zu bewegen und bewegt sich mit dem zweiten Ball mit. Aber wenn Sie velocityOne zu 2 anstelle von 3 ändern, funktioniert alles in Ordnung. Oder wenn Sie RADIUS_TWO auf 45 statt 65, funktioniert der Code, wie es für jeden Wert von velocityOne sollte.

Könnte mir jemand erklären, warum dieser Code für die meisten Werte nicht funktioniert, während er so arbeitet, wie er es mit so wenig tun soll? Danke vielmals.

Antwort

0

Wenn es darum geht, Kollisionen zu entdecken, werden Sie viele Bugs bekommen! Es ist eine sehr häufige Sache.

Der Grund, warum Sie diese Fehler erhalten, ist, dass wenn Sie versuchen, Kollisionen zu entdecken, Ihr Code jedes Intervall aktualisiert (Sie können normalerweise die Zeit zwischen den Intervallen wählen) und prüfen, ob sich zwei Dinge schneiden. In diesem Fall gehe ich davon aus, dass dein Ball zu schnell an dem anderen vorbeifährt, damit dein "Kollisionsprüfer" ihn aufheben kann.

ein paar Dinge, die Sie tun können:

-Slow den Ball

unten -Abnahme der Zeit zwischen „prüft, ob Kollision“

-Erhöhung der Kollisionsbereich (dies bedeutet, dass selbst wenn die Checker sieht die Kanten nicht kollidieren, wenn die beiden Bereiche sich überschneiden, weiß er, dass sie schon kollidiert haben)

+0

Danke für die Klarstellung :) Wie ich schon erwähnt habe, bin ich recht neu in Java. Wie könnte ich die Zeit zwischen den Kollisionskontrollen verkürzen? – Glycerius

+0

Was macht das "pause (10)" Linie tun ??? –

+0

Wenn ich die Pause nicht hinzufüge, ist der Ball schwer zu beobachten. Da dies alles in einer Zeitschleife ist, geschieht die Bewegung natürlich ziemlich schnell. Aber selbst wenn ich die Pause entferne, passiert der Fehler in bestimmten Fällen. Was soll ich machen? – Glycerius