PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : (JAVA) MouseMotionListener auf painted Rect


Tiamat
2008-08-12, 15:45:44
Hi,
ich krieg das irgendwie nicht hin.

Also ich habe auf einem JFrame ein JPanel, auf welches mit der Methode paint(Graphics g) ein Rechteck gezeichnet wird. Jetzt würde ich gerne den MouseMotionListener auf Graphics g loslassen, funktioniert aber leider nicht.
Habe dann aus Verzweiflung den MouseMotionListener auf das Panel losgelassen, auch ohne Erfolg.
Wie bekomm ich das hin, das ich das gezeichnete Viereck mit der Mouse bewegen kann ?


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.Graphics;

public class Pong extends JFrame {

int x = 0;
int y = 0;

public Pong() {
super();
setTitle("Pong");
setSize(1000,500);
setBackground(Color.BLACK);
setForeground(Color.WHITE);

JPanel panel = new JPanel();


panel.addMouseMotionListener(new MouseMotionListener(){
public void mouseDragged(MouseEvent e) {

}

public void mouseMoved(MouseEvent e) {
e.getY();
repaint();
}
});

add(panel);

setVisible(true);
}



public void paint(Graphics f) {

f.fillRect(20, 200, 20, 100);
f.setColor(Color.WHITE);


}

public static void main(String[]args) {
Pong game = new Pong();

}
}

Dr.Doom
2008-08-12, 15:50:49
public void mouseMoved(MouseEvent e) {
e.getY();
repaint();
}

public void paint(Graphics f) {

f.fillRect(20, 200, 20, 100);
f.setColor(Color.WHITE);


}

e.getY() liefert was zurück, was du fortan auch irgendwie benutzen solltest... ;)

f.fillRect(20, 200, 20, 100); du zeichnest ein Rechteck - immer an eine fest Position.

Tiamat
2008-08-12, 16:05:41
Oha, alles klar danke, dann weiß ich, was los ist.
Jetzt fehlt mir noch eine Sache zu meinem vorläufigen Glück.
Jetzt malt er mir ja bei jeder neuen Mausbewegung ein neues Rechteck hin, mit was kann ich das alte sozusagen ersetzen.
Gruß
Tiamat

Shink
2008-08-12, 16:13:27
Mach das nicht. Du wirst früher oder später nicht rumkommen eine Gameloop zu machen.
Also:
- in einer Schleife den Bildschirm jedesmal von Hinten (Hintergrund) nach vorne (spielrelevanten Objekte) zeichnen.
- der MouseMotionListener ändert nur die Objekte, aus denen beim Zeichnen die Position gezogen wird.

Folgenden Link hab ich dir dazu schon gegeben und ich würde ihn wirklich empfehlen:
http://www.brackeen.com/javagamebook/

Ganon hat mal ein sehr einfaches Tetris gepostet, das könntest du dir auch ansehen:
http://www.forum-3dcenter.org/vbulletin/showpost.php?p=6592164&postcount=35

Dr.Doom
2008-08-12, 16:22:27
Jetzt malt er mir ja bei jeder neuen Mausbewegung ein neues Rechteck hin, mit was kann ich das alte sozusagen ersetzen.Indem du ganz äffe die beiden Zeilen
setBackground(Color.BLACK);
setForeground(Color.WHITE);
an den Anfang der paint-Methode verschiebst. ;)

EDIT: Wobei mir gerade auffällt, dass du die paint-Methode des Panels, auf das du ja zeichnest, überschreiben solltest. Das Frame ist ja quasi nur der Container für dein "PongPanel".

Tiamat
2008-08-12, 16:32:43
Mach das nicht. Du wirst früher oder später nicht rumkommen eine Gameloop zu machen.
Also:
- in einer Schleife den Bildschirm jedesmal von Hinten (Hintergrund) nach vorne (spielrelevanten Objekte) zeichnen.
- der MouseMotionListener ändert nur die Objekte, aus denen beim Zeichnen die Position gezogen wird.

Folgenden Link hab ich dir dazu schon gegeben und ich würde ihn wirklich empfehlen:
http://www.brackeen.com/javagamebook/

Ganon hat mal ein sehr einfaches Tetris gepostet, das könntest du dir auch ansehen:
http://www.forum-3dcenter.org/vbulletin/showpost.php?p=6592164&postcount=35

Ja der ist echt super, den wollt ich auch auf jeden Fall vorknöpfen, wenn ich mal so was einfaches wie Pong hinbekommen habe.
Weil so von Konsolenprogrammen auf Tetris oder gar Jump-Run alla Super-Nintendo hab ich da echten Respekt muss ich sagen.
Ich fang erstmal ganz klein an :)

Dr.Doom
2008-08-12, 16:48:38
Ich fang erstmal ganz klein an :)Naja, bin auch nciht viel grösser, ich hätt's so gemacht ;) :
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.Graphics;

public class Pong extends JPanel implements MouseMotionListener {

private Point mousePos;

public Pong() {
mousePos = new Point( 0,0 );
addMouseMotionListener( this );
}

public void mouseDragged( MouseEvent e ) { }

public void mouseMoved( MouseEvent e ) {
mousePos = new Point( mousePos.x, e.getY() );
repaint();
}

public void paint( Graphics g ) {
super.paintComponent( g );
setBackground( Color.BLACK );
g.setColor( Color.WHITE );
g.fillRect( mousePos.x, mousePos.y, 20, 100 );
}

public static void main( String[]args ) {
JFrame f = new JFrame();
f.setTitle( "Pong" );
f.setSize( 1000,500 );
f.getContentPane().add( new Pong() );
f.setVisible( true );
}
}

instinct
2008-08-12, 19:23:18
Für Swing Komponenten sollte man "protected void paintComponent(Graphics g)" verwenden und nicht paint(Graphics g).