同步密钥监听器(Java)

时间:2016-02-14 21:58:02

标签: java swing keylistener

我目前正在尝试与朋友一起为炸弹人编程。我们使用Javascool编程,这是Java的简化版本。

所以我们在一个JFrame中的Paint组件中创建了一个棋盘。然后我们创建了两个可以使用WASD和箭头键在棋盘上移动的方块。

我们的问题是第二个按下按键的玩家将获得优先权,另一个玩家的方格将停止移动。我们尝试使用Threads,但它没有用。如果两个玩家疯狂地按下按键移动他们的方块(但是如果我们这样做就不可能有一个干净的游戏),这是有效的,这就是为什么我们需要你的帮助:你知道一个有助于我们制作的命令同时处理两个keyListeners。

编辑:这是我们的代码:

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


int largeurFenetre = 1500;
int hauteurFenetre = 600;
int posX;
int posY;
int taillecarreau=30; // taille des carreau en pixel
int OrigX;
int OrigY;
int NbCarreauX=16; // 1 carreau sur 2
int NbCarreauY=6; // 1 carreau sur 2
int depX1; // dep joueur 1 en x
int depY1; // dep joueur 1 en y
int depX2; // dep joueur 2 en x
int depY2; // dep joueur 2 en y

boolean test = true;

boolean execute = false;
//----------------------Creation d'une nouvelle fenetre  ----------------------

JFrame f = new JFrame(); // la nouvelle fenetre s'appelle f
Dessin cadre = new Dessin();    // Ce cadre pourra contenir des dessins
//----------------------------------------------------------------------------

public class thread_depJ1 extends Thread {
    public void run(){
f.addKeyListener(new depJ1());

/*Ce qui suit permet de ralentir le joueur sauf qui si on reste appuyer le sleep se cumule et bloque le programme (ralenti les 2 joueurs aussi)
 * 
            try{ // sert a faire un sleep
                this.sleep(75); // le sleep en question
            }
            catch(InterruptedException e) {} // sert encore pour le sleep
    */
    }
}

public class thread_depJ2 extends Thread {
    public void run(){
f.addKeyListener(new depJ2());
    }
}

void main(){
depX1=0;
depY1=0;
depX2=0;
depY2=0;
clear();
afficheFenetre();

OrigX=cadre.getWidth()/2-(taillecarreau*2*NbCarreauX)/2;
OrigY=cadre.getHeight()/2-(taillecarreau*2*NbCarreauY)/2;

println(OrigX);
println(OrigY);

Thread process_depJ1 = new thread_depJ1();
process_depJ1.start();// lance le thread de la neige

Thread process_depJ2 = new thread_depJ2();
process_depJ2.start();// lance le thread de la neige

if(execute){
    process_depJ1.stop();
    process_depJ2.stop();
}
execute=true;
}

void afficheFenetre(){
     f.setTitle("Couleur Aleatoire");             // titre
    f.setSize(largeurFenetre, hauteurFenetre);      //taille
     f.setLocation(0,0);                   //position
    f.add(cadre);                 // insertion du cadre dans la fenetre
    f.setVisible(true);           // affichage de la fenetre    
}
public class Dessin extends JPanel{
    public void paint(Graphics g){

for(int x=0; x<NbCarreauX;x++){
    posX=x*2*taillecarreau;
    for(int y=0; y<NbCarreauY;y++){
        g.setColor(Color.BLACK);
        posX=x*(2*taillecarreau)+OrigX;
        posY=y*(2*taillecarreau)+OrigY;
        g.fillRect(posX,posY,taillecarreau,taillecarreau);


        posX=x*2*taillecarreau+taillecarreau+OrigX;
        posY=y*2*taillecarreau+taillecarreau+OrigY;
        g.fillRect(posX,posY,taillecarreau,taillecarreau);

        g.setColor(Color.RED);

        posX=x*2*taillecarreau+taillecarreau+OrigX;
        posY=y*2*taillecarreau+OrigY;
        g.fillRect(posX,posY,taillecarreau,taillecarreau);


        posX=x*2*taillecarreau+OrigX;
        posY=y*2*taillecarreau+taillecarreau+OrigY;
        g.fillRect(posX,posY,taillecarreau,taillecarreau);


}
}

        g.setColor(Color.GREEN);
        g.fillRect(OrigX+depX1,OrigY+depY1,taillecarreau,taillecarreau);

        g.setColor(Color.YELLOW);
        g.fillRect(OrigX+NbCarreauX*2*taillecarreau-taillecarreau+depX2,OrigY+NbCarreauY*2*taillecarreau-taillecarreau+depY2,taillecarreau,taillecarreau);
    }
}


class depJ1 extends KeyAdapter { // Creation class du KeyListener
  public void keyPressed(KeyEvent evt_depJ1) { // definition de la variable keylistener pour quand la touche est appuye

    if (evt_depJ1.getKeyCode() == KeyEvent.VK_LEFT) { // si c'est la touche gauche qui est appuye
      println("TOUCHE GAUCHE " + evt_depJ1.getKeyCode()); // faire ...
      depX1=depX1+taillecarreau*(-1);
      if(depX1<0){
        depX1=0;
      }
      cadre.repaint();
    }

    if (evt_depJ1.getKeyCode() == KeyEvent.VK_UP) {
      println("TOUCHE HAUT " + evt_depJ1.getKeyCode());
      depY1=depY1+taillecarreau*(-1);
      if(depY1<0){
        depY1=0;
      }
      cadre.repaint();
    }

    if (evt_depJ1.getKeyCode() == KeyEvent.VK_RIGHT) {
      println("TOUCHE DROITE " + evt_depJ1.getKeyCode());
      depX1=depX1+taillecarreau;
      if(depX1>NbCarreauX*taillecarreau*2-taillecarreau){ // nbcarreaux correspond a la moitie du nombre de carreau, taillecarreau c'est la taille des carreau et on en enleve 1 car les objets sont positionne en haut a gauche
        depX1=NbCarreauX*taillecarreau*2-taillecarreau;
      }
      cadre.repaint();
    }

    if (evt_depJ1.getKeyCode() == KeyEvent.VK_DOWN) {
      println("TOUCHE BAS APPUYE " + evt_depJ1.getKeyCode());
      depY1=depY1+taillecarreau;
      if(depY1>NbCarreauY*2*taillecarreau-taillecarreau){
        depY1=NbCarreauY*2*taillecarreau-taillecarreau;
      }
      cadre.repaint();
    }
  }
}

class depJ2 extends KeyAdapter { // Creation class du KeyListener
  public void keyPressed(KeyEvent evt_depJ2) { // definition de la variable keylistener pour quand la touche est appuye

    if (evt_depJ2.getKeyChar() == 'q') { // si c'est la touche gauche qui est appuye
      println(evt_depJ2.getKeyChar()); // faire ...
      depX2=depX2+taillecarreau*(-1);
      if(depX2<-2*NbCarreauX*taillecarreau+taillecarreau){
      depX2=-2*NbCarreauX*taillecarreau+taillecarreau;
      }
      cadre.repaint();
    }

    if (evt_depJ2.getKeyChar() == 'z') {
      println(evt_depJ2.getKeyChar());
      depY2=depY2+taillecarreau*(-1);
      if(depY2<-2*NbCarreauY*taillecarreau+taillecarreau){
        depY2=-2*NbCarreauY*taillecarreau+taillecarreau;
      }
      cadre.repaint();
    }

    if (evt_depJ2.getKeyChar() == 'd') {
      println(evt_depJ2.getKeyChar());
      depX2=depX2+taillecarreau;
      if(depX2>0){
        depX2=0;
      }
      cadre.repaint();
    }

    if (evt_depJ2.getKeyChar() == 's') {
      println(evt_depJ2.getKeyChar());
      depY2=depY2+taillecarreau;
      if(depY2>0){
        depY2=0;
      }
      cadre.repaint();
    }
  }
}

0 个答案:

没有答案