Kugel bewegen?

  • Themenstarter Themenstarter 23
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.

23

Bekanntes Mitglied
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
 
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
 
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!
 
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!
 
Zuletzt bearbeitet:
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.
 
Zuletzt bearbeitet:
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
 
Zuletzt bearbeitet:
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.
 
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]
 
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...
 
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
 
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.
 
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.
 
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.
 
Zuletzt bearbeitet:
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]
 
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!!
 
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 😉
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben