2 Tastatureingaben gleichzeitig verarbeiten

N302OO7

Mitglied
Sers,

hier mal ein Teil von meinem Programm:

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

  public class Rechtecke extends Applet implements Runnable, KeyListener {

    int x1=20;
    int x2=120;
    int y1=40;
    int y2=40;
    
    public void init(){
      setBackground (Color.WHITE);
      addKeyListener(this);
    }
    public void start (){
      Thread th = new Thread (this);
      th.start();
    }
    public void run (){
      this.resize(200,500);
    }
    public void paint (Graphics g){
      g.setColor(Color.red);
      g.fillRect(x1,y1,20,20);
      g.fillRect(x2,y2,20,20);
      repaint();
    }
    public void keyPressed(KeyEvent s) {
      if (s.getKeyCode() == 40) y1 = y1+10;
      if (s.getKeyCode() == 38) y1 = y1-10;
      if (s.getKeyCode() == 83) y2 = y2+10;
      if (s.getKeyCode() == 87) y2 = y2-10;

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

  }

In dem Programm kann man mit den Tasten W/S und Pfeiltaste hoch/runter ein Viereck bewegen. Aber man kann immer nur eins bewegen. d.h. ich kann nicht S gedrückt halten und gleichzeitig mit gedrückter Pfeiltaste down das andere Viereck bewegen! Das würde ich aber gerne :p Wie geht das
Ich habe gehört, man sollte ein weiteres Thread anlegen, aber wie verschiebe ich das da rein, oder wie löse ich mein Problem anderst


greetz
 
Oh, danke, zu nett :mad::mad: OMFG das kann ich auch selber. Zeig mir bitte mal einen konkreten Lösungsvorschalg Die meisten Themen enden i-wie im nichts

googeln kann ich auch selber
 
To check for two or more keys that aren't meta-keys you need to track their state. Create a boolean flag for each key you want to track. Then write a keyPressed handler to set the appropriate flag and a keyReleased handler to clear it. Within your keyPressed handler, you can check the state of the other flags and react accordingly.

Darunter kann ich mir aber leider überhaupt nichts vorstellen.
 
Was hast du denn daran nicht verstanden? Erklär doch mal was du verstanden hast?
 
Also ich soll ja für jede Taste einen boolean Flag schreiben. Das heißt zu boolean w = true.
Then write a keyPressed handler to set the appropriate flag and a keyReleased handler to clear it.
Da habe ich ka wie ich das machen, bzw. was ich da machen soll
 
Hi,
du definierst einfach für jede Taste eine Variable. In keyPressed setzt du die dann auf true:
Java:
public void keyPressed(KeyEvent e)
 if (e.getKeyCode() == KeyEvent.VK_LEFT)
     eftPressed = true;
  }
  if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
	rightPressed = true;
  }
  if (e.getKeyCode() == KeyEvent.VK_SPACE) {
	spacePressed = true;
  }
}
Dann eine keyReleased-Methode mit dem selben Inhalt wie oben, nur dass alles auf false gesetzt wird.

Zum Schluss noch ein Runnable:
Java:
class GameLoop implements Runnable
   
   @Override public void run(){
      while(true){
        if(spacePressed && leftPressed){
        }
        // usw.
    }
}
Und einen entprechenden Thread, der dieses Runnable startet.

Schönen Abend noch,
DosCoder
 
Ok, erstmal vielen Dank :D

Code:
    boolean pfd, pfu, w, s;

    public void keyPressed(KeyEvent e) {
      if (e.getKeyCode() == 40) pfd = true; //y1 = y1+10;
      if (e.getKeyCode() == 38 pfu = true; //y1 = y1-10;
      if (e.getKeyCode() == 83)s = true;   //y2 = y2+10;
      if (e.getKeyCode() == 87)w = true;   //y2 = y2-10;
    }
    public void keyTyped(KeyEvent e) { }
    public void keyReleased(KeyEvent e) {
      if (e.getKeyCode() == 40) pfd = false; //y1 = y1+10;
      if (e.getKeyCode() == 38) pfu = false; //y1 = y1-10;
      if (e.getKeyCode() == 83) s = false;   //y2 = y2+10;
      if (e.getKeyCode() == 87) w = false;   //y2 = y2-10;
    }

so, soweit bin ich jetzt erstmal.
Jetzt schreibe ich im selben Programm nochmal das:

Code:
class GameLoop implements Runnable
   
   @Override public void run(){
      while(true){
        if(spacePressed && leftPressed){
        }
        // usw.
    }
}

Das verstehe ich jetzt nicht so ganz, was ich da reinschreiben soll. Oben siehts du ja auskommentiert, was passieren soll.

Und einen entprechenden Thread, der dieses Runnable startet.
Wie meinst du das, mache ich da einen
Code:
Thread th = new Thread (this);
      th.start();
rein, oder mache ich in meiner anderen (Haupt-)Klasse neben
Code:
Thread th = new Thread (this);
      th.start();
noch einen
Thread th2 = new Thread (this);
th2.start();
und lasse in diesem th2 i-wie diese neue Klasse ablaufen


greetz
 
Hi,
deine Anweisungen kommen hier rein:
Java:
class GameLoop implements Runnable
   
   @Override public void run(){
      while(true){
        if(spacePressed && leftPressed){
             y1 = y1+10;
        }
        if(spacePressed && reightPressed(){
           y1 = y1-10;
        }
        // usw.
    }
}

Im 1. Post habe ich gesehen, dass deine Klasse Runnable schon implementiert, daraus folgt, dass du eine externe Klasse machen musst, die den obigen Code enthält.

Dann definierst du eine Schnittstelle Controlable:
Java:
public interface Controlable{
  public boolean spacePressed();
  public boolean reightPressed();
  //usw.

  public void walkRight();
  public void walkLeft();
  //usw.
//Die Methodenanzahl und -namen musst du natürlich selbst bestimmen.
}

Nun muss deine Hauptklasse noch Controlable implementieren, und entsprechend alle Methoden überschreiben:
Java:
public class Rechtecke extends Applet implements Runnable, KeyListener, Controlable

Nun musst du die Klasse GameLoop noch ein bisschen abändern:
Java:
class GameLoop implements Runnable

     Controllable c;  

    public GameLoop(Controlable c){
       this.c = c;
    }
 
   @Override public void run(){
      while(true){
        if(c.spacePressed() && c.leftPressed()){
             c.shotEnemy();
        }
        if(c.spacePressed() && c.reightPressed()){
           c.walkLeft();
        }
        // usw.
    }
}

Und in deinen Hauptkonstruktor schribst du dann:
Java:
public Rechtecke(){
   //Dein Code + dieser Code:
   new Thread(new GameLoop(this)).start();
}


Ciao
DosCoder

PS: Ich würde dir nahelegen, deine Grundplanung des Projektes abzuändern. Jede Klasse solte nur EINE Aufgabe haben; deine Verarbeitet Tastendrücke, Zeichnet und gibt einem Thread einen Job. Dadruch kann es bei größeren Projekten zur Verwirrung kommen.
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück