2 Tastatureingaben gleichzeitig verarbeiten

Vielen Dank --> neues Problem ;)
Jetzt wird i-wie nur processKeys ausgeführt, d.h. wenn ich einmal eine von den 4 Tasten drücke, ist das Viereck weg ^^

Nochmal meinen aktuellen Quellcode:

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


  public class Rechtecke extends Applet implements Runnable, KeyListener {
    int x1=20;
    int x2=120;
    int y1=40;
    int y2=40;
    boolean keyUpPressed;
    boolean keyDownPressed;
    boolean keywPressed;
    boolean keysPressed;

    public void init(){
      setBackground (Color.WHITE);
      addKeyListener(this);
    }
    public void start (){
      Thread th = new Thread (this);
      th.start();
    }
    private boolean running = true;
    public void run (){

      while(running) {

          this.resize(200,500);
          processKeys();

     }
    }

    public void paint (Graphics g){
      g.setColor(Color.red);
      g.fillRect(x1,y1,20,20);
      g.fillRect(x2,y2,20,20);
    }
    public void keyPressed(KeyEvent s) {
              switch (s.getKeyCode()) {
                case 40:
                    keyDownPressed = true;
                    break;
                case 38:
                    keyUpPressed = true;
                    break;
                case 83:
                    keysPressed = true;
                    break;
                case 87:
                    keywPressed = true;
                    break;
               }
               System.out.println("keyPressed");


//      if (s.getKeyCode() == 40)x2=x2+10;
//      if (s.getKeyCode() == 38)y2=y2-10;
//      if (s.getKeyCode() == 83)x1=x1+10;
//      if (s.getKeyCode() == 87)y1=y1-10;
//      }

    }
    public void keyTyped(KeyEvent s) { }
    public void keyReleased(KeyEvent s) {
              switch (s.getKeyCode()) {
                case 40:
                    keyDownPressed = false;
                    break;
                case 38:
                    keyUpPressed = false;
                    break;
                case 83:
                    keysPressed = false;
                    break;
                case 87:
                    keywPressed = false;
                    break;
                }
                System.out.println("keyReleased");

                
     }
     
     protected void processKeys() {
        if (keyDownPressed) {
            x2=x2+1;

        }

        if (keyUpPressed) {
            y2=y2-1;

        }

        if (keysPressed) {
            x1=x1+1;
        }

        if (keywPressed) {
            y1=y1-1;
        }
        System.out.println("TEST");
        repaint();

    }

  }
 
Du hast so schoene System.out. da drin, schau doch ma ob er noch in die anderen Methoden kommt. Du wirst net immer jemanden haben der deinen ganzen Code durchschaut, durch System.out oder halt durch einen Debugger kommt man dann dem Problem immer Naeher, bis man es loesen kann.
 
Wenn du etwas kopierst, solltest du darauf achten es auch richtig zu kopieren.

Java:
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class Rechtecke extends Applet implements Runnable, KeyListener {

	int x1 = 20;
	int x2 = 120;
	int y1 = 40;
	int y2 = 40;
	boolean keyUpPressed;
	boolean keyDownPressed;
	boolean keywPressed;
	boolean keysPressed;

	public void init() {

		setBackground(Color.WHITE);
		addKeyListener(this);

		this.resize(200, 500);

	}

	public void start() {

		Thread th = new Thread(this);
		th.start();

	}

	private boolean running = true;

	public void run() {

		while (running) {

			this.processKeys();

			try {

				Thread.sleep(10);

			} catch (InterruptedException e) {

				e.printStackTrace();

			}

		}

	}

	public void paint(Graphics g) {

		g.setColor(Color.red);
		g.fillRect(this.x1, this.y1, 20, 20);
		g.fillRect(this.x2, this.y2, 20, 20);

	}

	public void keyPressed(KeyEvent s) {

		switch (s.getKeyCode()) {

		case KeyEvent.VK_DOWN:
			this.keyDownPressed = true;
			break;
		case KeyEvent.VK_UP:
			this.keyUpPressed = true;
			break;
		case KeyEvent.VK_S:
			this.keysPressed = true;
			break;
		case KeyEvent.VK_W:
			this.keywPressed = true;
			break;

		}

	}

	public void keyTyped(KeyEvent s) {
	}

	public void keyReleased(KeyEvent s) {

		switch (s.getKeyCode()) {

		case KeyEvent.VK_DOWN:
			this.keyDownPressed = false;
			break;
		case KeyEvent.VK_UP:
			this.keyUpPressed = false;
			break;
		case KeyEvent.VK_S:
			this.keysPressed = false;
			break;
		case KeyEvent.VK_W:
			this.keywPressed = false;
			break;
		}

	}

	protected void processKeys() {

		if (this.keyDownPressed) {
			this.x2 = this.x2 + 1;
			this.repaint();
		}

		if (this.keyUpPressed) {
			this.y2 = this.y2 - 1;
			this.repaint();
		}

		if (this.keysPressed) {
			this.x1 = this.x1 + 1;
			this.repaint();
		}

		if (this.keywPressed) {
			this.y1 = this.y1 - 1;
			this.repaint();
		}

	}

}

Hammet sagte auch, dass du ein Sleep einbauen sollst, das hast du nicht getan. Daher auch der Fehler. Zudem rufst du zu oft repaint auf, wie MiMi schon des Öfteren sagte.
 
Danke 00d4vid

Nochmal eine andere Frage:
Das war natürlich nicht mein richtiges Programm. In meinem richten Programm habe ich in der Run Methode schon 4 while Schleifen, aber das ist nicht das Problem. Ich habe in meine run Methode einen Ball, der sich ich mit x++ bzw. y++ bewegt und danach muss ich ja auch einen Thread.sleep legen sonst wäre der Ball ja auch gleich weg. Jetzt zum Problem: Die Zeit im Thread.sleep von dem Programm, das ihr mir geschrieben habt, muss größer sein, als die vom Ball, sonst ist entweder der Ball viel zu langsam oder die Vierecke sind zu schnell...

greetz
 
Zuletzt bearbeitet:
Danke 00d4vid

Nochmal eine andere Frage:
Das war natürlich nicht mein richtiges Programm. In meinem richten Programm habe ich in der Run Methode schon 4 while Schleifen, aber das ist nicht das Problem. Ich habe in meine run Methode einen Ball, der sich ich mit x++ bzw. y++ bewegt und danach muss ich ja auch einen Thread.sleep legen sonst wäre der Ball ja auch gleich weg. Jetzt zum Problem: Die Zeit im Thread.sleep von dem Programm, das ihr mir geschrieben habt, muss größer sein, als die vom Ball, sonst ist entweder der Ball viel zu langsam oder die Vierecke sind zu schnell...

greetz

Und wo ist in dem Textblock deine Frage?
Und bei Pong, ist die Bewegung der Klötze das einfachste ;)
 
Jetzt zum Problem: Die Zeit im Thread.sleep von dem Programm, das ihr mir geschrieben habt, muss größer sein, als die vom Ball, sonst ist entweder der Ball viel zu langsam oder die Vierecke sind zu schnell...

Wie ich das Problem löse ist meine Frage ;) Ja ich habe jetzt alles. Also das Programm an sich funktioniert halt mit dem oben geschilderten Problem :D


greetz
 
Die habe ich für die Begrenzung des Spielfelds, also wenn der ball rechts/links/oben/unten ankommt, wird halt je nach dem wo die eine auf false gesetzt und die andere startet mit anderen x++ bzw y++ Werten. Wäre viel. einfacher gegangen aber ich habs nun mal so. Gibt es für das Thread.slepp i-eine Möglichekeit das zu ändern
 

Neue Beiträge

Zurück