2016-07-27 2 views
1

Ich werde so schnell bleiben.Wie man einen Kreis springt von einer Ecke eines Rechtecks ​​- Verarbeitung

Nur ein Verarbeitungsprogramm machen, wo der Ball vom Rechteck springt.

Im Moment kann ich nur herausfinden, wie man die obere, linke, rechte und untere Seite macht, aber wenn der Ball in die Ecken des Rechtecks ​​geht, springt er nicht ab, sondern geht in das Rechteck und danach 1 oder 2 Bounces werden freigegeben.

Ich möchte nur wirklich wissen, wie ich darum, den Ball gehen sollte die Ecken des Rechtecks ​​ablenken weg, so dass es Glitch doens't

Hier ist mein Code:

float x = 100, y = 100, radius = 50; 
    float vx = 3, vy = 3; 
    float MX = 0; 
    float MY = 0; 


    void setup() { 
     size(500, 700); 
    } 

    void draw() { 
     background(0); 
     fill(255); 

     x += vx; 
     y += vy; 
     if (x + radius > width) { 
      vx = vx * -1; 
     } 
     //makes the ball bounce off the right 
     if (x - radius < 0) { 
      vx = vx * -1; 
     } 
     //makes the ball bounce off the left 
     if (y + radius > height) { 
      vy = vy * -1; 
      y = height - radius; 
     } 
     //make the ball bounce off the top 
     if (y - radius < 0) { 
      vy = vy * -1; 
      y = radius; 
     } 
     //makes the ball bounce off the top 
     if (y + radius > MY && x + radius > MX + 50 && x + radius < MX + 150 && 
      y + radius < MY + 20) { 
      vy *= -1; 
      y = MY - 3 - radius; 
     } //Top Side 
     if (x - radius < MX + 100 && y > MY - 10 && y < MY + 10 && x - radius > MX) { 
      vx *= -1; 
     } // Right Side 

     if (y - radius < MY + 20 && x + radius > MX + 50 && x + radius < MX + 150 && 
      y - radius > MY) { 
      vy *= -1; 
      y = MY + 20 + radius; 
     } //Bottom Side 

     if (x + radius > MX && y > MY - 10 && y < MY + 10 && x + radius < MX + 100) { 
      vx *= -1; 
     } // Left Side 

     ellipse(x, y, radius * 2, radius * 2); 
     rect(MX, MY, 100, 20); 

    } 

void mouseMoved() { 

     MX = mouseX - 50; 
     MY = mouseY - 10; 
     if (MX < 0) { 
      MX = 0; 
     } 
     if (MX > 400) { 
      MX = 400; 
     } 
     if (MY < 0) { 
      MY = 0; 
     } 
     if (MY > 680) { 
      MY = 680; 
    } 

Sorry, ich tun wissen, wissen, wie Sie den Code sehr gut einfügen, ich bin neu auf dieser Seite, bitte Gnade haha ​​:)

Prost

+0

Sind Sie in der gleichen Klasse wie diese Person? http://stackoverflow.com/questions/38559208/circle-and-rectangle-collision –

Antwort

0

Eine schnelle schmutzige Art und Weise i achie zuvor haben Dies wird dadurch erreicht, dass zuerst Begrenzungsboxen auf jeder Seite hinzugefügt werden und diese so positioniert werden, dass wenn der Ball zum Beispiel in der oberen rechten Ecke kollidiert, ich eine Bedingung hätte:

Wenn Ball Grenzen oben und rechts fängt: mach das;

Ich hoffe, das hilft!

1

Das Problem ist nicht, dass Sie eine Kollision der Ecke erkennen müssen. Sie haben zwei weitere Probleme:

Problem 1: Wenn Sie eine Kollision erkennen, müssen Sie den Ball so bewegen, dass er nicht mehr mit dem Rechteck kollidiert. Wenn Sie das nicht tun, dann multiplizieren Sie die vy Variable mit -1, wenn der Ball die Oberseite der Box schneidet Das veranlasst den Kreis sich zu bewegen. Aber beim nächsten Frame kollidiert der Kreis immer noch mit dem Rechteck, weil er noch nicht weit genug nach oben gerückt ist. So erkennt Ihr Code diese Kollision, multiples vy von -1 wieder, und der Ball bewegt sich zurück nach unten. Im nächsten Frame passiert dasselbe, bis der Ball schließlich nicht mehr mit dem Rechteck kollidiert.

die Framerate verlangsamen, um zu sehen, was ich rede:

bad collision

Um dies zu beheben, müssen Sie zu einem Ort des Ball zurück zu „Pop“, das länger ist nicht mit dem Rechteck schneidet. Auf diese Weise wissen Sie, dass es im nächsten Frame nicht kollidieren wird.

Problem 2: Sie sollten keine Kollision auf jeder Seite separat durchführen. Führen Sie Kollisionen zwischen dem gesamten Kreis und dem gesamten Rechteck durch und überprüfen Sie dann jeweils eine Bewegungsachse.

Die Überprüfung auf einer Seite zu einer Zeit wird zu vielen Kopfschmerzen führen, einschließlich des Problems, bei dem mehrere Seiten gleichzeitig getroffen werden. Ich würde auch wetten, dass Ihr Code nicht tut, was Sie denken, dass es ist: Versuchen Sie println() Anweisungen zu allen Ihren if Aussagen hinzuzufügen, um sicherzustellen, dass sie ausgeführt werden, wenn sie denken, dass sie sind.

um dieses Problem zu beheben, würde ich eine collides() Funktion erstellen, die Parameter für die nächsten Position der Kugel nimmt, und gibt zurück, ob der Ball mit jede Seite des Rechtecks ​​zu kollidieren wird. Dann geben Sie die nächsten X- und Y-Positionen ein und drehen Sie ihre Geschwindigkeiten um. Es wird in etwa so aussehen:

if (collides(circleX + vx, circleY)) { 
    vx*=-1; 
    } 
    else { 
    circleX += vx; 
    } 
    if (collides(circleX, circleY + vy)) { 
    vy*=-1; 
    } 
    else { 
    circleY += vy; 
    } 

Sie auch die Logik hinzufügen wollen würde für „Popping“ den Ball so dass es nicht mehr zu kollidieren.

good collision

PS: Haben Sie versucht, für Ihr Problem auf Google oder der Stack-Überlauf suchend? This question ist fast ein exaktes Duplikat Ihrer Frage, bis zu dem Punkt, wo ich ziemlich sicher bin, dass Sie in der gleichen Klasse sind!

Verwandte Themen