Phase 11 : déplacement des personnages

This commit is contained in:
Erwann PHILIPPE 2025-04-03 17:44:30 +02:00
parent 0abf597984
commit 80e4fd53fd
6 changed files with 145 additions and 25 deletions

View file

@ -41,7 +41,7 @@ public class Controle implements AsyncResponse {
//
new ServeurSocket(this, GLOBAL.PORT);
this.frmArene = new Arene(this);
this.frmArene = new Arene(this, "serveur");
this.frmArene.setVisible(true);
this.leJeu = new JeuServeur(this);
@ -65,7 +65,7 @@ public class Controle implements AsyncResponse {
this.leJeu = new JeuClient(this);
this.leJeu.connexion(connection);
this.frmArene = new Arene(this);
this.frmArene = new Arene(this, "client");
this.frmChoixJoueur = new ChoixJoueur(this);
this.frmChoixJoueur.setVisible(true);
}else {
@ -106,6 +106,10 @@ public class Controle implements AsyncResponse {
case "ajout joueurs":
leJeu.envoi((Connection)info, this.frmArene.getJpnJeu());
break;
case "ajout phrase":
this.frmArene.ajoutTchat((String)info);
((JeuServeur)this.leJeu).envoi(this.frmArene.getMessage());
break;
}
}
@ -117,14 +121,16 @@ public class Controle implements AsyncResponse {
case "modif panel jeu":
this.frmArene.setJpnJeu((JPanel)info);
break;
case "modif tchat":
frmArene.setMessage((String)info);
}
}
public void evenementArene(String ordre, Object info) {
switch(ordre) {
case "tchat":
public void evenementArene(Object info) {
if(info instanceof String) {
((JeuClient)this.leJeu).envoi("tchat" + GLOBAL.separateur + info);
break;
}else if(info instanceof Integer) {
((JeuClient)this.leJeu).envoi("action" + GLOBAL.separateur + info);
}
}

View file

@ -18,4 +18,7 @@ public interface GLOBAL {
int largeurPerso = 39;
int hauteurPerso = 44;
int hauteurMessage = 8;
int droite = 0;
int gauche = 1;
}

View file

@ -34,6 +34,8 @@ public class JeuClient extends Jeu {
mursOk = true;
}else if(info instanceof JPanel && mursOk) {
this.controle.evenementJeuClient("modif panel jeu", info);
}else if(info instanceof String) {
controle.evenementJeuClient("modif tchat", info);
}
}

View file

@ -48,6 +48,17 @@ public class JeuServeur extends Jeu {
int numPerso = Integer.parseInt(splitted[2]);
System.out.println(info);
this.lesJoueurs.get(connection).initPerso(pseudo, numPerso, lesMurs, lesJoueurs.values());
String connexionMessage = "** " + pseudo + " vient de se connecter ! **";
this.controle.evenementJeuServeur("ajout phrase", connexionMessage);
break;
case "tchat":
String pseudo2 = this.lesJoueurs.get(connection).getSpeudo();
String STALINE = pseudo2 + " > " + splitted[1];
JeuServeur.this.controle.evenementJeuServeur("ajout phrase", STALINE);
break;
case "action":
Integer action = Integer.parseInt(splitted[1]);
this.lesJoueurs.get(connection).action(action, this.lesJoueurs.values(), this.lesMurs);
}
}
@ -59,7 +70,10 @@ public class JeuServeur extends Jeu {
* Envoi d'une information vers tous les clients
* fais appel plusieurs fois à l'envoi de la classe Jeu
*/
public void envoi() {
public void envoi(Object info) {
for(Connection connection : this.lesJoueurs.keySet()) {
super.envoi(connection, info);
}
}
/**

View file

@ -101,7 +101,6 @@ public class Joueur extends Objet {
do {
posX = (int) Math.round(Math.random() * (GLOBAL.tailleXArene - GLOBAL.largeurPerso)) ;
posY = (int) Math.round(Math.random() * (GLOBAL.tailleYArene - GLOBAL.hauteurPerso - GLOBAL.hauteurMessage)) ;
System.out.println(posX + " " + posY);
} while(this.toucheJoueur(joueurs) || this.toucheMur(listeMurs));
}
@ -115,7 +114,7 @@ public class Joueur extends Objet {
URL ressource = getClass().getClassLoader().getResource(chemin);
super.label.setIcon(new ImageIcon(ressource));
System.out.println(super.label.getBounds());
//System.out.println(super.label.getBounds());
this.message.setBounds(posX-10, posY+GLOBAL.hauteurPerso, GLOBAL.largeurPerso+10, GLOBAL.hauteurMessage);
this.message.setText(pseudo + " : " + vie);
@ -125,13 +124,67 @@ public class Joueur extends Objet {
/**
* Gère une action reçue et qu'il faut afficher (déplacement, tire de boule...)
*/
public void action() {
public void action(int action, Collection joueurs, ArrayList<Mur> murs) {
switch(action) {
case 38:
// touche : flèche haut
deplace("bas", joueurs, murs);
break;
case 40:
// touche : flèche bas
deplace("haut", joueurs, murs);
break;
case 37:
//touche flèche gauche
deplace("droite", joueurs, murs);
break;
case 39:
//touche : flèche droite
deplace("gauche", joueurs, murs);
break;
}
}
/**
* Gère le déplacement du personnage
*/
private void deplace() {
private void deplace(String cote, Collection joueurs, ArrayList<Mur> murs) {
int oldPosX = posX;
int oldPosY = posY;
switch(cote) {
case "haut":
posY += 10;
break;
case "bas":
posY -= 10;
break;
case "gauche":
posX += 10;
orientation = GLOBAL.gauche;
break;
case "droite":
posX -= 10;
orientation = GLOBAL.droite;
}
if(this.toucheJoueur(joueurs) || this.toucheMur(murs)) {
posY = oldPosY;
posX = oldPosX;
}
if(etape+1 > 4) {
etape = 1;
}else {
etape += 1;
}
// Condition si le personnage sort du cadre
if(posX > 770 || posX < 0 || posY > 545 || posY < 0) {
posY = oldPosY;
posX = oldPosX;
}
this.affiche("marche", this.etape);
}
/**

View file

@ -32,6 +32,8 @@ public class Arene extends JFrame {
public JPanel jpnJeu;
public JTextArea txtChat;
private Controle controle;
private boolean isServer;
private int touche;
/**
* Launch the application.
@ -40,7 +42,8 @@ public class Arene extends JFrame {
/**
* Create the frame.
*/
public Arene(Controle controle) {
public Arene(Controle controle, String typeJeu) {
this.controle = controle;
setTitle("Arene");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.getContentPane().setPreferredSize(new Dimension(800, 729));
@ -48,11 +51,44 @@ public class Arene extends JFrame {
this.setResizable(false);
setBounds(100, 100, 808, 757);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
if(typeJeu.equals("client")) {
isServer = false;
}else {
isServer = true;
}
if(!isServer) {
contentPane.setFocusable(true);
contentPane.addKeyListener(new KeyAdapter() {
int touche = -1;
public void keyPressed(KeyEvent e) {
switch(e.getKeyCode()) {
case KeyEvent.VK_LEFT:
touche = e.getKeyCode();
break;
case KeyEvent.VK_RIGHT:
touche = e.getKeyCode();
break;
case KeyEvent.VK_UP:
touche = e.getKeyCode();
break;
case KeyEvent.VK_DOWN:
touche = e.getKeyCode();
break;
}
if(touche != -1) {
Arene.this.controle.evenementArene(touche);
}
}
});
}
JLabel lblNewLabel = new JLabel("");
String chemin = GLOBAL.cheminFonds + "fondarene.jpg";
URL ressourceURL = getClass().getClassLoader().getResource(chemin);
@ -82,6 +118,7 @@ public class Arene extends JFrame {
lblNewLabel.setBounds(0, 0, 792, 590);
contentPane.add(lblNewLabel);
if(!isServer) {
txtSaisie = new JTextField();
txtSaisie.setBounds(0, 591, 800, 30);
contentPane.add(txtSaisie);
@ -91,10 +128,13 @@ public class Arene extends JFrame {
@Override
public void keyPressed(KeyEvent e) {
if(!Arene.this.txtSaisie.equals("") && e.getKeyCode() == KeyEvent.VK_ENTER) {
controle.evenementArene("tchat", Arene.this.getMessage());
controle.evenementArene(Arene.this.txtSaisie.getText());
Arene.this.txtSaisie.setText("");
}
Arene.this.contentPane.requestFocus();
}
});
}
JScrollPane scrollPane = new JScrollPane();
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
@ -132,12 +172,14 @@ public class Arene extends JFrame {
this.jpnJeu.repaint();
}
public String getMessage() {
return this.txtSaisie.getText();
return this.txtChat.getText();
}
public void setMessage(String msg) {
this.txtChat.setText(msg);
this.txtChat.setCaretPosition(this.txtChat.getDocument().getLength());
}
public void ajoutTchat(String Staline) {
this.txtChat.setText(this.txtChat.getText() + Staline + "\r\n");
this.txtChat.setCaretPosition(this.txtChat.getDocument().getLength());
}
}