KeyAdapter registrieren

Status
Nicht offen für weitere Antworten.

Fridolin

Bekanntes Mitglied
Hallo mich würde es nur interessieren ob ich meinen KeyAdapter beim Fenster richtig registriert
habe denn es wird nicht neugezeichnet, damit meine ich aber nicht repaint sondern einfach darüber zeichnen
würde mir für den Anfang reichen, in meinem Applet hab ich noch die methode keyDown verwendet aber die soll
ja seit JDK 1.1 veraltet sein und wird bei mir auch nimmer erkannt
boardx2 und boardy2 sind die anfangsposition der figur xspeed und yspeed sind die bewegungsrichtungen
und in meiner paint soll dann regelmäßig xspeed und yspeed zu boardx2 und boardy2 dazugezählt werden und
nochmal(!) gezeichnet werden

lg Fridolin

Code:
public VersuchPacman()
{
	setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
	addKeyListener(new KeyAdapter()
	{
		public void keyPressed(KeyEvent e)
		{
			int key = e.getKeyCode();
			if(key == KeyEvent.VK_LEFT)
			{
			zflag = true;
			xspeed = -1;
			yspeed = 0;
			paint(dbg);
			}
			
			else if(key == KeyEvent.VK_RIGHT)
			{
			zflag = true;
			xspeed = 1;
			yspeed = 0;
			paint(dbg);
			}
			
			else if(key == KeyEvent.VK_UP)
			{
			zflag = true;
			xspeed = 0;
			yspeed = -1;
			paint(dbg);
			}
			
			else if(key == KeyEvent.VK_DOWN)
			{
			zflag = true;
			xspeed = 0;
			yspeed = 1;
			paint(dbg);
			}
		}
	});
}

Code:
public void paint(Graphics g)
{
		
	while(zflag == true)
	{
	boardx2+=xspeed;
	boardy2+=yspeed;
	g.setColor(Color.yellow);
	g.drawArc(boardx2,boardy2 + 4, 7, 7, 150, -280);
                g.fillArc(boardx2,boardy2 + 4, 7, 7, 150, -280);
	}
}
 
B

Beni

Gast
Dein KeyListener sieht schon gut aus, deine paint-Methode finde ich komisch.

Mach doch einfach einen Thread, der alle paar Millisekunden ein repaint verlangt. Die Position deiner Figur (oder was auch immer) wird einfach bei jedem Tastenschlag neu berechnet:

Code:
public class Pacman extends JComponent{
  private int x;

  public Pacman(){
    addKeyListener( new KeyAdapter(){
       public void keyPressed( KeyEvent e ){
          x++;
       }
    });

    new Thread(){
      public void run(){
        while( true ){
           repaint();
           try{
              Thread.sleep( 100 );
           }
           catch( InterruptedException ex ){}
        }
      }
    }.start();
  }

  public void paint( Graphics g ){
     g.drawLine( x, 0, x, 3 );
  }
}
 

Fridolin

Bekanntes Mitglied
Hallo Beni,
ich schreib es so weil ich mehrere paint zeichenmethoden darin stehen habe
dann weiß ich nicht warum deine version nicht geht dabei scheint sie so logisch wie meine
und dann hab ich noch eine Frage wieso schreibst du .start() für den Thread
Die if Anweisung muss drinnen bleiben denn sonst werden die Felder für die Mappe
an anderen Stellen nochmal neu gezeichnet, also mit falschen überschrieben


lg Fridolin

Code:
public VersuchPacman()
{
	this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
	this.setFocusable(true);
	this.requestFocusInWindow();
	//addKeyListener(this);
	this.addKeyListener(new KeyAdapter()
	{
		public void keyPressed(KeyEvent e)
		{
			int key = e.getKeyCode();
			if(key == KeyEvent.VK_LEFT)
			{
			zflag = true;
			xspeed = -1;
			yspeed = 0;
			paint(dbg);
			}
			
			else if(key == KeyEvent.VK_RIGHT)
			{
			zflag = true;
			xspeed = 1;
			yspeed = 0;
			paint(dbg);
			}
			
			else if(key == KeyEvent.VK_UP)
			{
			zflag = true;
			xspeed = 0;
			yspeed = -1;
			paint(dbg);
			}
			
			else if(key == KeyEvent.VK_DOWN)
			{
			zflag = true;
			xspeed = 0;
			yspeed = 1;
			paint(dbg);
			}
		}
	});
	
	new Thread()
	{
		public void run()
		{
			while(true)
			{
			repaint();
			try
				{
				Thread.sleep(100);
				}
				catch(InterruptedException e) { }
			}
		}
	}
	.start();
}

Code:
public void paint(Graphics g)
	{
		if(i == 798)
		{
			nflag = 5;
			boardx2+=xspeed;
			boardy2+=yspeed;
			g.setColor(Color.yellow);
			g.drawArc(boardx2,boardy2 + 4, 7, 7, 0, -340);
		}
		
		if(nflag == 0)
		{
		g.drawRect(boardx,boardy,blocksizex,blocksizey);
		g.fillRect(boardx,boardy,blocksizex,blocksizey);
		}
		
		else if(nflag == 1)
		{
		g.drawRect(boardx,boardy,blocksizex,blocksizey);
		g.fillRect(boardx,boardy,blocksizex,blocksizey);
		g.setColor(Color.red);
		g.drawArc(boardx,boardy + 4, 7, 7, 0, -340);
		}
		
		else if(nflag == 2)
		{
		g.drawRect(boardx,boardy,blocksizex,blocksizey);
		g.fillRect(boardx,boardy,blocksizex,blocksizey);
		g.setColor(Color.pink);
		g.drawOval(boardx + 1,boardy + 3,blocksizex - 2,blocksizey - 6);
		g.fillOval(boardx + 1,boardy + 3,blocksizex - 2,blocksizey - 6);
		}
		
		else if(nflag == 3)
		{
		g.drawRect(boardx,boardy,blocksizex,blocksizey);
		g.fillRect(boardx,boardy,blocksizex,blocksizey);
		g.setColor(Color.white);
		g.drawOval(boardx + 1,boardy + 4,blocksizex - 2,blocksizey - 8);
		g.fillOval(boardx + 1,boardy + 4,blocksizex - 2,blocksizey - 8);
		}
		
		else if(nflag == 4)
		{
		g.drawRect(boardx,boardy,blocksizex,blocksizey);
		g.fillRect(boardx,boardy,blocksizex,blocksizey);
		g.setColor(Color.yellow);
		g.drawArc(boardx,boardy + 4, 7, 7, 0, -340);
		boardx2 = boardx;
		boardy2 = boardy;
		}
		
			
	}
 

Fridolin

Bekanntes Mitglied
Hab mal die Postings so durchstöbert leider nichts richtiges gefunden aber dein 3D programm schaut cool aus
Wie lange lernst du schon? Ich könnt das in ein paar Jahren nicht schreiben
Und dann hab ich noch zwei Fragen:

1) Wie kann man Bilder (Graphics Objekte wenn sie einmal gezeichnet sind)
in einem Image abspeichern so das ich immer eine Vorlage habe die ich dann nur zu Schirm bringen muss?
Das könnt ich dann für mein Fenster brauchen wenn ich es größer machen will

2) Wie bring ich sie dann zu Schirm?

lg Fridolin

Es ist mir jetzt gelungen ich hab nur die update methode überschreiben müssen
Aber ich brauch noch etwas Hilfe wie mach ich es das nur die Anteile neu gezeichnet werden
die ich wirklich brauche also das die kugel keine schlieren zieht? Ich glaube ich habe mal gelesen
man macht das mit Offscreen Images indem man den Hintergrund löscht den Vordergrund als
Image zeichnet und dann nur noch die veränderten Teile neu darauf zeichnet
 
B

Beni

Gast
schreibst du .start() für den Thread
Um ihn zu starten? :bae:
Ansonsten wäre dort halt ein neuer Thread der aber überhaupt nix tut.

Zu deinen Bildern: du musst direkt auf ein Bild zeichnen.
Guck mal unter BufferedImage nach. Da gibts auch eine Methode "createGraphics" das ein Graphics-Objekt herstellt, um zu zeichnen.

Und Bilder zeichnen: Graphics#drawImage( ... ). :wink:

Wenn ich das richtig sehe:
Code:
public void paint(Graphics g)
   [...]
   boardx2+=xspeed;
   boardy2+=yspeed;
das geht doch um die Bewegung irgendeiner Kugel oder so?
Dann sollte das nicht in der paint-Methode sein, denn dann könnte ein Fiesling die paint-Methode ein paar mal aufrufen und schwups...
Wenn ich das falsch interpretiere, vergiss es :wink:

Zum Offscreen: wenn du Swing verwendest, sollte das nicht nötig sein, weil das schon eingebaut ist. Wenn ich mich recht entsinne wird mit der update-Methode der Hintergrund gelöscht.
Erb doch von einem JPanel (dann kannst du das Spiel auch mal auf ein Applet packen...), dann kannst du "paintComponent" überschreiben, dort alles zeichnen, und das wars.

P.S. ~5 Jahre Training und ein paar wunde Finger für das 3D-Progi.
 

Fridolin

Bekanntes Mitglied
Hallo,
ich hab noch ein paar Fragen zum Zeichnen Wie benutze ich das BufferedImage wenn ich sein
Graphics2D Objekt auf dem ich zeichne nicht anzeigen kann? Dazu kann ich eigentlich kein drawImage
verwenden denn das bildet nur Images ab und ist leer wenn ich auf das createGraphics zeichne, und wie
kann ich Bilder zwischenspeichern, so das beim aufruf der update methode nicht meine ganze anzeige gelöscht
wird, die nur einmal beim ersten aufruf von paint gezeichnet wird. Ich hoffe das hat jemand verstehen können

lg Fridolin
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben