I'm currently trying to program a Bomberman with a friend. We program in Javascool, which is a simplified version of Java.
So we created a checkerboard in a Paint component which is in a JFrame. Then we created two squares that may move on the checkerboard by using WASD and arrow keys.
Our problem is that the second player to push a key will have priority, and the square of the other player will stop moving. We tried to put Threads, but it didn't worked. It works if the two players move their square by pushing madly on the keys (but this is not possible to have a clean game if we do this), that's why we need your help : do you know a command that would help us to make work the two keyListeners simultaneously.
Edit : here is our code :
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();
}
}
}