KeyListenerProblem

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Ich hab ein Problem mit einem KeyListener:
Ich möchte mit den Pfeiltasten eine Kugel steuern.
Hier erstmal mein Code(der meiner Meinung nach funktionieren sollte,es aber nicht tut.:
Code:
import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;
import java.awt.event.*;


public class Pong extends Applet implements KeyListener {
boolean up,down,left,right;
int x,y,vx,vy,a;



  public void init(){
  x=30;y=40;
  addKeyListener(this);
  boolean up=false;
  boolean down=false;
  boolean left=false;
  boolean right=false;
  requestFocus();}
  
    public void paint(Graphics g){
   x=x+vx;y=y+vy;
   g.fillOval(x,y,40,40);
   if(up==true){vy=-2;}
   repaint();}
  
  public void keyPressed(KeyEvent e)
  {a=e.getKeyCode();
   if(a==1004){
   boolean up=true;}}

  public void keyReleased(KeyEvent e)
  {a=e.getKeyCode();
   if(a==1004){boolean up=false;}}
  
  public void keyTyped(KeyEvent e)
  {}}

Ich weiss einfach nicht weiter.
Danke im Vorraus für eure Hilfe.
 

outbreaker

Bekanntes Mitglied
Dein erster Fehler ist das du überall wieder den Type vor deine Variablen geschrieben hast!

zb hier:
Code:
public void init(){
  x=30;y=40;
  addKeyListener(this);
  boolean up=false;
  boolean down=false;
  boolean left=false;
  boolean right=false;
  requestFocus();}

somit sind diese Variablen nur in der Methode init() sichtbar und sonst nirgendwo im Code
wenn du deine Globalen Variablen ändert willst dann lasse das boolean weg

das betrifft alles in deinem Code du hast das glaube an allen Stellen so gemacht
 

anfänger15

Bekanntes Mitglied
versuch ma mit System.out.println auszugeben ob er überhaupt in die Schleife von KeyPressed geht und diese ausführt.

Meiner Meinung nach sollte in keyPressed noch ein repaint aufgerufen werden.

Ich würde dies auch nicht so kompliziert mit einerm boolschen Wert lösen. Es sollte auch gehen, wenn du bei keyPressed vy um 2 verringerst und dann ein repaint aufrufst, das die Kugel mit vy und vx zeichnet.
 

Niki

Top Contributor
Das funktioniert, muss du nur noch für all die anderen Richtungen machen:

Code:
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JApplet;
import javax.swing.JComponent;
import javax.swing.KeyStroke;

public class Pong extends JApplet{
	boolean up, down, left, right;
	int x, y, vx, vy, a;

	public void init() {
		x = 30;
		y = 40;
	
		boolean up = false;
		boolean down = false;
		boolean left = false;
		boolean right = false;
		requestFocus();

		addKeyStrokes();

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

	private void addKeyStrokes() {
		JComponent c = (JComponent) getContentPane();
		InputMap im = c.getInputMap();
		ActionMap am = c.getActionMap();
		im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "up");
		am.put("up", new AbstractAction() {
			public void actionPerformed(ActionEvent e) {
				up = true;
				down = false;
				repaint();			

			}
		});
		
		im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "down");
		am.put("down", new AbstractAction() {
			public void actionPerformed(ActionEvent e) {
				up = false;
				down = true;
				repaint();
			}
		});
	}

	public void paint(Graphics g) {
		super.paint(g);
		x = x + vx;
		y = y + vy;
		g.fillOval(x, y, 40, 40);
		if (up == true) {
			vy = -2;			
		} else if(down == true){
			vy = 2;
		}
		
	}	
}

Du musst halt bei dieser Lösung nur einmal drücken und der Ball bleibt in Bewegung
 

outbreaker

Bekanntes Mitglied
So ich habe mal deinen Ansatz etwas modifiziert aber halt ohne Threads und co
nur erstmal dein Ansatz so das er funktioniert
in die eine Richtung jedenfalls ;-)

Code:
import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;
import java.awt.event.*;


public class Pong extends Applet implements KeyListener {
boolean up,down,left,right;
int x,y,vx,vy;


  public void init()
  {
    x=30;
    y=40;
    addKeyListener(this);
    up=false;
    down=false;
    left=false;
    right=false;
    vy = 0;
    vx = 0;
    requestFocus();
  }
 
    public void paint(Graphics g)
    {
    	x =x+vx;
    	y =y+vy;
    	g.fillOval(x,y,40,40);
    	if(up == true)
    	{
    	   vy=-1;
    	   up = false;
    	}
    	else
    	{
    	   vy = 0;
    	}
    }
 
  public void keyPressed(KeyEvent e)
  {	
   	  if(e.getKeyCode() == 38)
   	  {
	   up = true;
           repaint();
	  }
   }

  public void keyReleased(KeyEvent e)
  {
  }
 
  public void keyTyped(KeyEvent e)
  {}}
 

outbreaker

Bekanntes Mitglied
das was anfänger15 Vorschlägt müsste auch gehen und wohl noch um einiges einfacher als der Ansatz mit den Variablen je nachdem was du erreichen willst

Weil bei dem was ich da jetzt an Code gebastelt habe bewegt sich der Ball nur wenn du die Taste drückst so wäre es auch beim Ansatz von anfänger15 und das was Niki geschrieben hat ist halt einmal drücken und so lange bewegen bis eine neue Eingabe kommt

nun musst du entscheiden was du erreichen willst :wink:
 

Niki

Top Contributor
Soda, jetzt bewegt sich die Scheibe in alle Richtungen und kommt bei der anderen Seite wieder raus falls sie aus dem Sichtfeld wandern sollte:
Code:
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JApplet;
import javax.swing.JComponent;
import javax.swing.KeyStroke;

public class Pong extends JApplet{
	boolean up, down, left, right;
	int x, y, vx, vy, a;

	public void init() {
		x = 30;
		y = 40;
	
		boolean up = false;
		boolean down = false;
		boolean left = false;
		boolean right = false;
		requestFocus();

		addKeyStrokes();

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

	private void addKeyStrokes() {
		JComponent c = (JComponent) getContentPane();
		InputMap im = c.getInputMap();
		ActionMap am = c.getActionMap();
		im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "up");
		am.put("up", new AbstractAction() {
			public void actionPerformed(ActionEvent e) {
				up = true;
				down = false;
				left = false;
				right = false;
				repaint();			

			}
		});
		
		im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "down");
		am.put("down", new AbstractAction() {
			public void actionPerformed(ActionEvent e) {
				up = false;
				down = true;
				left = false;
				right = false;
				repaint();
			}
		});
		
		im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "left");
		am.put("left", new AbstractAction() {
			public void actionPerformed(ActionEvent e) {
				up = false;
				down = false;
				left = true;
				right = false;
				repaint();
			}
		});
		
		im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "right");
		am.put("right", new AbstractAction() {
			public void actionPerformed(ActionEvent e) {
				up = false;
				down = false;
				left = false;
				right = true;
				repaint();
			}
		});
	}

	public void paint(Graphics g) {	
		super.paint(g);
		x = x + vx;
		y = y + vy;
		g.fillOval(x, y, 40, 40);
		if (up == true) {
			vy = -2;			
			vx = 0;
			if(y+40 < 0){
				y = getHeight();				
			}
		} else if(down == true){
			vy = 2;
			vx = 0;
			if(y > getHeight()){
				y = -40;			
			}
		} else if(right == true){
			vx = 2;
			vy = 0;
			
			if(x > getWidth()){
				x = -40;			
			}
		} else{
			vx = -2;
			vy = 0;
			if(x+40 < 0){
				x = getWidth();				
			}
		}
		
	}	
}
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben