# Kugel bewegen?



## 23 (9. Mrz 2009)

Hey,

ich möchte auf einem JPanel eine Kugel malen und diese bei jedem Mouseklick bewegen.

Ich weiß ungefähr wie dies funktioniert jedoch würde ich es gerne so schreiben, dass die Kugel einen eigene Klasse bekommt.

Kann ich Kugel von etwas ableiten?

Ich habe mir so gedacht die Kugel hat zwei int Werte für die Pos und setter und getter.

So kann ich in der JPanel Klasse genau alles festlegen bzw. malen aber ist dies der richtige bzw. beste Weg?

Vlg


----------



## raven (9. Mrz 2009)

leite sie doch von Point ab! der hat eine x- bzw. y-koordinate...
und deine Methoden kannst du auch so noch hinzufügen...
mfg raven


----------



## hdi (9. Mrz 2009)

> leite sie doch von Point ab!



Oh Gott bloss nicht...
Eine Kugel kannst du beschreiben durch die linke obere Ecke, also zwei int-Werte.
Ja, oder einen Punkt.

Aber eine Kugel *ist* kein Punkt, das ist ein Fehlgriff in Sachen Vererbung.
*Man leitet nicht ab, nur weil man ne Eigenschaft aus einer Klasse braucht!*


----------



## 23 (9. Mrz 2009)

Hey,

danke für den Tipp!

Aber wie mache ich das wenn ich eine Kugel möchte? Wenn ich eine eigene Klasse schreibe müsste ich aufwendig berechnen wo sich die Kugel auf dem JPanel befindet?

Geht das nicht einfacher?

Ich möchte einfach bei Klick/oder Tastendruck eine Methode aufrufen setNeuePos() oder setEinsweiter() + repaint()

und ich möchte auf einfache Weiße wissen wo dieses Objekt im JPanel ist. Diese Info soll aber in der Kugelklasse bekannt sein, nicht in der JPanel Klasse!


----------



## hdi (9. Mrz 2009)

Was willst du denn "berechnen"? Das geht recht einfach:

[HIGHLIGHT="Java"]public class Kugel {

	  private Point position;
	  private int durchmesser;

	  public Kugel(int startX, int startY){
	      position = new Point (startX, startY);
	      durchmesser = 20; // px
	  }

	  public void move(int xtrans, int ytrans){

	      position.translate(xtrans,ytrans);
	  }

	  public void paint(Graphics g) {
		  g.drawOval(position.x, position.y, durchmesser, durchmesser);
	  }
}[/HIGHLIGHT]

Die Position ist dem Panel jetzt nicht bekannt, das panel macht in seiner
paintComponent Methode nur:

[HIGHLIGHT="Java"]meineKugel.paint(g);[/HIGHLIGHT]

und die Kugel malt sich selbst.

Und verschieben tuste sie mit der move-Methode.


----------



## 23 (9. Mrz 2009)

Habe mal ein kleines Testprogramm erstellt.

[HIGHLIGHT="Java"]
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Panel extends JPanel {

	private Kugel mKugel;

	public Panel() {

		mKugel = new Kugel(10,10);

		setPreferredSize(new Dimension(400,400));

		addMouseListener(new MouseListener() {

			@Override
			public void mouseClicked(MouseEvent e) {

				mKugel.move(15, 15);

				repaint();

			}

			@Override
			public void mouseEntered(MouseEvent arg0) {
				// TODO Auto-generated method stub

			}

			@Override
			public void mouseExited(MouseEvent arg0) {
				// TODO Auto-generated method stub

			}

			@Override
			public void mousePressed(MouseEvent arg0) {
				// TODO Auto-generated method stub

			}

			@Override
			public void mouseReleased(MouseEvent arg0) {
				// TODO Auto-generated method stub

			}


		});

	}

	 public void paintComponent(Graphics g) {

	        super.paintComponent(g);

	        g.translate(super.getSize().width / 2, super.getSize().height / 2);

	        mKugel.paint(g);

	 }

	public static void main(String[] args) {

		JFrame a = new JFrame("as");

		a.add(new Panel());

		a.pack();

		a.setVisible(true);

	}

}
[/HIGHLIGHT]

Wie kann ich nun merken ob auf die Kugel geklickt wird oder ins Leere?

Soll ich nun alle Grafik Objekte wie deine aufbauen also per Point für die Position?

vlg


----------



## Marco13 (9. Mrz 2009)

Bei einem MouseEvent die Entfernung zwischen dem event.getPoint() und der Position der Kugel ausrechnen (dafür gibbt's Methoden in "Point") und dann schauen, ob die Entfernung kleiner ist als der Radius der Kugel.


----------



## hdi (9. Mrz 2009)

Also alle Objekte die du hast sollten so sein wie die Kugel, ja schon.
Sie haben einen Punkt der ihre Position beschreibt, und können sich selbt malen
wenn man ihnen ein Graphics-Objekt gibt (paint-Methode).



> Wie kann ich nun merken ob auf die Kugel geklickt wird oder ins Leere?




[HIGHLIGHT="Java"]public void mouseClicked(MouseEvent e) {
   Point clicked = e.getPoint();
   if( mKugel.contains(clicked) ){
            // es wurde auf die Kugel geklickt
   }
}

// in der Kugel-Klasse eine neue Methode:
/* returns whether the specified Point lies within this ball */
	public boolean contains(Point p) {
		int radius = durchmesser / 2;
		return (p.distance(position.x + radius, position.y + radius) <= radius);
	}[/HIGHLIGHT]


----------



## Marco13 (9. Mrz 2009)

Aaahho-wohoh, ja, sorry, ... hdi hat die "richtige" Version gepostet, aber nur in bezug auf die vorgeschlagene Art, die Kugel zu implementieren... : Ich würde eine Kugel (bzw einen Kreis) grundsätzlich über seinen _Mittelpunkt_ und seinen Radius beschreiben...


----------



## 23 (9. Mrz 2009)

Hey,

danke schonmal 

Kann mir mal jemand erklären wieso position.translate(position.x,--position.y);

Nach 2-4 Mouseklick rießige Abstände bringt?

Vlg


----------



## hdi (9. Mrz 2009)

Ja, "menschennäher" ist sicherlich Marco's Variante.
Im Endeffekt ist es egal für welche Version du dich entscheidest:
Entweder die Kollisions-Überprüfung wird intuitiver, oder der Aufruf von drawOval.


----------



## hdi (9. Mrz 2009)

translate(x,y) verschiebt den Punkt um x und y.
D.h. wenn du die Methode mit den Werte des Punktes selber aufrufst,
schleuderst du das Ding gleich mal paar hundert Pixel weiter.
(je nach Startposition)

... btw: negative Werte verschieben nach links/oben, positive nach rechts/unten.


----------



## 23 (9. Mrz 2009)

Hm und wie verschiebe ich es um eins weiter?


----------



## hdi (9. Mrz 2009)

> Hm und wie verschiebe ich es um eins weiter?



Äh... :noe:

Was verstehst du an 



> translate(x,y) verschiebt den Punkt um x und y.



nicht?


----------



## 23 (9. Mrz 2009)

Die Sprünge werden immer größer!

Auch wenn ich die Startwerte speichere und nur diese nutze!

position.translate(--mX,mY);

mX, mY hat die Startwerte aus dem Kon.


----------



## hdi (9. Mrz 2009)

Schau mal: translate(x,y) verschiebt den Punkt, auf den du das anwendest, um x und y.
Der Punkt, den das betrifft, ist ja die position von der Kugel.

Wenn du diese doofe Kugel also um eins (als Ziffer: *1*) nach rechts bewegen willst, machste

[HIGHLIGHT="Java"]translate(1,0); // und das bleibt so, egal wie oft du das machst.[/HIGHLIGHT]


----------



## 23 (9. Mrz 2009)

Achso dann muss x bzw y nicht die Koordinate sein sondern kann einfach 1 bzw 0 mit Vorzeichen? Sehs grad in der Api 

(x + dx, y + dy).

Ok Danke!!


----------



## hdi (9. Mrz 2009)

Genau, das ist einfach der Wert, um den es den Punkt verschiebt. Nicht die neue Position.

(Depp) Nein Spass sry, ich bin grad lustig drauf nich Ernst nehmen


----------

