我目前正在尝试与朋友一起为炸弹人编程。我们使用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();
}
}
}