Ball->Wand Kollision - Ball bleibt an Decke und Boden hängen

Jack159

Bekanntes Mitglied
Ich habe ein Programm mit einer GUI, auf der ein Kreis (Ball) ist und an den 4 Seiten der GUI ist jeweils eine schwarze Wand (Rechteck). Der Kreis ist mit den Pfeiltasten steuerbar. Wenn der Kreis kann nicht durch die Wände durch gehen.
Das funktioniert an der linken und rechten Wand problemlos. An der oberen und unteren Wand allerdings, bleibt der Kreis ab und zu hängen. Mit "hängen bleiben" meine ich, dass ich den Kreis nicht mehr von der Wand wegbewegen kann. Am besten probiert ihr das Programm selbst aus, dann seht ihr wie ich das meine.
Ich weiß absolut nicht, wo der Fehler liegt, da es an den seitlichen Wänden ja perfekt funktioniert und ich es an der oberen+unteren Wand genauso gemacht habe :bahnhof:

Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.Ellipse2D;
 
import javax.swing.*;
 
public class Second extends JPanel implements ActionListener, KeyListener {
    
    Timer t = new Timer(5, this);
    int xk = 300, yk = 300, velx = 0, vely = 0;
    int xwl, ywl;
    int xwr = 775, ywr;
    int xwo, ywo;
    int xwu, ywu=555;
    boolean links = false;
    boolean rechts = false;
    boolean oben = false;
    boolean unten = false;
    boolean kollision = false;
    Rectangle kreisRec = new Rectangle(xk, yk, 40, 40);
    Rectangle wandLinksRec = new Rectangle(xwl, ywl, 10, 600);
    Rectangle wandRechtsRec = new Rectangle(xwr, ywr, 10, 600);
    Rectangle wandObenRec = new Rectangle(xwo, ywo, 800, 10);
    Rectangle wandUntenRec = new Rectangle(xwu, ywu, 800, 10);
    
    public Second() {
        t.start();
        addKeyListener(this);
        setFocusable(true);
        setFocusTraversalKeysEnabled(false);
    }
    
    // Die 4 Wände werden gezeichnet
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.fill(new Ellipse2D.Double(xk, yk, 40, 40));
        g2.fill(new Rectangle.Double(xwl, ywl, 10, 600));
        g2.fill(new Rectangle.Double(xwr, ywr, 10, 600));
        g2.fill(new Rectangle.Double(xwo, ywo, 800, 10));
        g2.fill(new Rectangle.Double(xwu, ywu, 800, 10));
    }
    
    // Game-Loop
    public void actionPerformed(ActionEvent e) {
        
    
        
        
        
        if(oben) {
            vely = -4;
            velx = 0;
            
        }
    
        if(unten) {
            vely = 4;
            velx = 0;
        }
        
        if (links) {
            vely = 0;
            velx = -4;
        }
        
        if (rechts) {
            vely = 0;
            velx = 4;
        }
        
   
      
        
        if (kreisRec.intersects(wandRechtsRec)){ 
        	
        	velx = 0;
        	
        	if (links) {
        		velx = -4;
        	}
        }
        
        if (kreisRec.intersects(wandLinksRec)){ 
        	
        	velx = 0;
        	
        	if (rechts) {
        		velx = 4;
        	}
        }
        
        if (kreisRec.intersects(wandObenRec)){ 
        	
        	vely = 0;
        	
        	if (oben) {
        		vely = 4;
        	}
        }
        
        if (kreisRec.intersects(wandUntenRec)){ 
        	
        	vely = 0;
        	
        	if (unten) {
        		vely = -4;
        	}
        }
        
        xk +=velx;
        yk +=vely;
        kreisRec.x = xk;
        kreisRec.y = yk;
        wandLinksRec.x = xwl;
        wandLinksRec.y = ywl;
        wandRechtsRec.x = xwr;
        wandRechtsRec.y = ywr;
        wandObenRec.x = xwo;
        wandObenRec.y = ywo;
        wandUntenRec.x = xwu;
        wandUntenRec.y = ywu;
        
        repaint();
        velx = 0;
        vely = 0;
    }
    

    
    
    
 
 
    public void keyTyped(KeyEvent e) {
        
        
        
    }
    
    // KeyListener Code
    public void keyReleased(KeyEvent e) {
        int code = e.getKeyCode();
        if(code == KeyEvent.VK_UP){
            oben = false;
        }
        
        
        if(code == KeyEvent.VK_DOWN){
            unten = false;
        }
        
        
        if(code == KeyEvent.VK_RIGHT){
            rechts = false;
        }
        
        
        if(code == KeyEvent.VK_LEFT){
            links = false;
        }
        
        
    }
    public void keyPressed(KeyEvent e) {
    	int code = e.getKeyCode();
        if(code == KeyEvent.VK_UP){
            oben = true;
        }
        
        
        if(code == KeyEvent.VK_DOWN){
            unten = true;
        }
        
        
        if(code == KeyEvent.VK_RIGHT){
            rechts = true;
        }
        
        
        if(code == KeyEvent.VK_LEFT){
            links = true;
        }
    	
    }
}

Java:
import javax.swing.JFrame;

public class Macheads {

	public static void main(String[] args) {
		JFrame f = new JFrame();
		Second s = new Second();
		f.add(s);
		f.setVisible(true);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setSize(800, 600);
	}
}
 
G

Gast2

Gast
Deine Kollisionsüberprüfung ist nicht ganz korrekt.
Du bewegst den Ball auf die Wand und im nächsten durchlauf prüfst du erst ob es eine Kollision gibt, wenn ja dann setzt du die Geschwindigkeit auf 0.
Prüfe VOR dem Bewegen ob es dann zu einer Kollision kommt, wenn ja, dann bewegst du den Ball nicht.
Und das "Abprallen" würde ich auch raus nehmen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Jxhnny.lpz bouncing Ball (Brick-Breaker-Game) Java Basics - Anfänger-Themen 1
Jxhnny.lpz bouncing ball / abprallender Ball Java Basics - Anfänger-Themen 11
K BlueJ Ball an Rand Reflektieren Java Basics - Anfänger-Themen 2
dome385 Ball Ball Kollision physikalisch korrekt Java Basics - Anfänger-Themen 5
A Breakout-Spiel , Ball mit Platten abprallen lassen Java Basics - Anfänger-Themen 1
A Ball kollidiert nicht mit Rand Java Basics - Anfänger-Themen 5
J Ball (unendlich) Java Basics - Anfänger-Themen 12
A Bouncing Ball bis er ruht Java Basics - Anfänger-Themen 6
T Processing: Quecksilberartiger Ball Java Basics - Anfänger-Themen 2
K Animation: Ball fällt herunter Java Basics - Anfänger-Themen 2
J Das schöne Bouncing Ball Beispiel. Java Basics - Anfänger-Themen 20
P Ball auf Panel hüpfen lassen Java Basics - Anfänger-Themen 4
G Ball-Bewegung Java Basics - Anfänger-Themen 19
F Ball soll auf Mausklick farbe ändern. Java Basics - Anfänger-Themen 10
T Kollision von 2 Objekten Java Basics - Anfänger-Themen 2
C Kollision zweier Rechtecke, Schnittpunkte bestimmen Java Basics - Anfänger-Themen 25
L Grafik Kollision Detektierung Java Basics - Anfänger-Themen 4
J Kollision eines Kreises mit einem 270° Winkel im 2D-Raum Java Basics - Anfänger-Themen 29
S Problem bei Kollision zwischen Array-objekten! Java Basics - Anfänger-Themen 2
B Kollision tritt nie ein ? Java Basics - Anfänger-Themen 15
D Frage zu Kollision Java Basics - Anfänger-Themen 3
T Kleines Game mit Kollision Java Basics - Anfänger-Themen 2
J Tilemap Kollision Java Basics - Anfänger-Themen 25
T Kollision bei Wänden Java Basics - Anfänger-Themen 2
M OOP Kollision entdecken Java Basics - Anfänger-Themen 4
TheKing Tile Map - Kollision Java Basics - Anfänger-Themen 2
V Rennspiel, Kollision Java Basics - Anfänger-Themen 19
I Kollision zweier Rechtecke Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben