Ball rollen lassen

safin23

Grünschnabel
Hallo!
Ich versuche nun seit Stunden meinen Denkfehler zu finden.
Dem Ball wird eine Richtung gegeben und danach soll er weiter rollen.
Wenn er auf die Bande kommt - prallt er ab ( Einfallswinkel = Ausfallswinkel).
Das Problem bei mir - er wird an der Bande immer mitgeschoben...
Was mache ich falsch
Code:
import javax.swing.*;
import java.awt.*;

public class Table extends JPanel implements Runnable{
	
	
	private Ball ball = new Ball(0,0);
	private int x,y;
	private int zähler=0;
	
	
	public void setNewBallPos(){
		ball.setPx(0);
		ball.setPy(getHeight()/2);
		repaint();
	}
	
	public void setX(int Px){
		x = Px;
	}
	
	public void setY(int Py){
		y = Py;
	}
	
	
	public void paint(Graphics g){
		g.setColor(Color.pink);
		g.fillRect(0, 0, getWidth(), getHeight());
		ball.displayMe(g);

		
	}
	
	public void run(){
						
		while(zähler<11)
		{

			// if für x-Koordinate
			if (ball.getPx()+x < 0 || ball.getPx()+x+20 > getWidth()){
				if(ball.getPx()+x < 0){
					ball.setPx(0);
				}
				else{
					ball.setPx(getWidth()-20);
					ball.changePosY(y);
				}
				
				x = -x;
				zähler++;
			}
			else{
				ball.changePosX(x);
			}
			// if für y-Koordinate
			if(ball.getPy()+y < 0 || ball.getPy()+y+20 > getHeight()){
				if(ball.getPy()+y < 0){
					ball.setPy(0);
				}
				else{
					ball.setPy(getHeight()-20);
					ball.changePosX(x);
				}
				y = -y;
				zähler++;
			}
			else{
				ball.changePosY(y);
			}
			
			
			repaint();
			try{
				Thread.sleep(800);
			}
			catch(InterruptedException e){}
		}
		
	}
	
	Ball getBall(){
		return ball;
	}
	
}
Code:
import java.awt.*;
//import javax.swing.*;

public class Ball {
	
	private int Px, Py;
	
	
	Ball(int x, int y){
		Px = x;
		Py = y;
		
	}
	
	
	void changePosX(int x){
		Px += x;
	}
	
	void changePosY(int y){
		Py += y;
	}
	
	
	void displayMe(Graphics g){
		g.setColor(Color.cyan);
		
		//variabel machen
		g.fillOval(Px, Py, 20, 20);
	}

	public int getPx() {
		return Px;
	}
	
	public int getPy() {
		return Py;
	}

	public void setPy(int py) {
		Py = py;
	}

	public void setPx(int px) {
		Px = px;
	}
	
}

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Billiard extends JApplet implements ActionListener, MouseListener{

	private static final long serialVersionUID = 1L;
	private JTextField textUnten, textRechts;
	private JButton start;
	private JLabel unten, rechts;
	private Table tisch = new Table();
	private int zahlUnten, zahlRechts;
	
	
	public void threadstart(){
		Thread thread = new Thread(tisch);
		thread.start();
	}
	
	public int getZahlunten(){
		return zahlUnten;
	}

	public int getZahlrechts(){
		return zahlRechts;
	}
	
	
	public void actionPerformed(ActionEvent e){
		if(e.getActionCommand().equals("Start")){
			
			zahlUnten = Integer.parseInt(textRechts.getText());
			zahlRechts = Integer.parseInt(textUnten.getText());
			tisch.setX(zahlUnten);
			tisch.setY(zahlRechts);
			this.threadstart();
			
		}
	}
	
	
	public void init(){

		JPanel panelunten = new JPanel();
		this.setSize(800, 400);
		this.setLayout(null);
		
		// Objekte erzeugen
		textUnten = new JTextField("2",5);
		textRechts = new JTextField("3",5);
		unten = new JLabel("unten:");
		rechts = new JLabel("rechts:");
		start = new JButton("Start");

		
		//Tisch zeichnen
		getContentPane().add(tisch);
		tisch.setBounds(getWidth()/4, getHeight()/4, getWidth()/2, getHeight()/2);
		start.addActionListener(this);
		
		panelunten.add(textUnten);
		panelunten.add(unten);
		panelunten.add(textRechts);
		panelunten.add(rechts);
		panelunten.add(start);
		
		panelunten.setLayout(new FlowLayout());
		panelunten.setBounds(0,getHeight()-40,getWidth(),40);
		getContentPane().add(panelunten);
		
		
	}
	public void mouseClicked(MouseEvent e) {
		// TODO Auto-generated method stub	
	}
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub		
	}
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub	
	}
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
	}
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub	
	}
}
 
Was meinst du? Dass der Ball an der Bande immer einmal langwandert bevor er wieder abprallt?

Hab mal deine Ball-Klasse ein wenig verändert:
Java:
package de.tutorials;
import java.awt.*;
//import javax.swing.*;

public class Ball {
	
	private int Px, Py;
	
	
	Ball(int x, int y){
		setPx(x);
		setPy(y);
	}
	
	
	void changePosX(int x){
		setPx(getPx()+x);
	}
	
	void changePosY(int y){
		setPy(getPy()+y);
	}
	
	
	void displayMe(Graphics g){
		g.setColor(Color.cyan);
		
		//variabel machen
		g.fillOval(Px, Py, 20, 20);
	}

	public int getPx() {
		return Px;
	}
	
	public int getPy() {
		return Py;
	}

	public void setPy(int py) {
		Py = py;
		System.out.println("y: " + py);
	}

	public void setPx(int px) {
		Px = px;
		System.out.println("x: " + px);
	}
	
}

Schau mal auf die Koordinaten-Angaben.. auch in deinem Code sieht man das ganz gut:
Java:
if(ball.getPy()+y < 0){
    ball.setPy(0);
}

Ich denke richtig müßte es heißen:
Java:
int newY = ball.getPy()+y;
if(newY < 0){
    ball.setPy(y-Math.abs(newY));
}

Er soll ja abprallen sobald er auftrifft und nicht erst einen Schritt später.
 
Irgendwie verstehe ich es nicht... An welcher Stelle soll ich deinen Code plazieren?
Soll ich es überall neu machen oder nur an einer bestimmten Stelle?
Wäre nett, wenn du es mir gena zeigst...

lg
 
Zurück