mode 2 joueurs

This commit is contained in:
MOISOIU Stefan-Mihai
2026-03-26 20:08:52 +01:00
parent e1e0ef5054
commit ba78c22e91
6 changed files with 316 additions and 210 deletions

View File

@@ -8,6 +8,8 @@ import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JLabel;
@@ -18,43 +20,34 @@ public class Jeu implements KeyListener, ActionListener, MouseListener {
protected ZoneDessin ecran = new ZoneDessin();
protected Cercle demiCercleAvant = new Cercle(90, -180); // celui qui est sur la ligne
protected Cercle demiCercleArriere = new Cercle(90, 180); // celui qui est derrière la ligne
protected GestionnaireNiveau gestionnaireNiveau = new GestionnaireNiveau();
protected Ligne lili = new Ligne(new NoiseGenerator(0), gestionnaireNiveau);
protected List<Joueur> joueurs = new ArrayList<>();
protected boolean deuxJoueurs = false;
protected Timer horloge;
protected double score = 1;
protected JLabel labScore;
protected int vies = 3;
protected GestionnaireScore gestionnaireBDD = new GestionnaireScore();
protected GestionnaireFinDePartie gestionnaireFinDePartie;
protected int compteurFrames = 0;
protected boolean enCollision = false;
protected boolean estGameOver = false;
protected JLabel labGameOver;
protected int compteurInvincible = 0;
public int typeInvincibilite = 0;
public boolean invincibiliteRouge = false;
protected boolean bonusTailleActif = false;
protected int compteurBonusTaille = 0;
protected String pseudo = "";
protected JFrame fenetre;
protected MenuPrincipal menu;
public Jeu() {
labScore = new JLabel();
labScore.setForeground(Color.WHITE);
labScore.setText("<html><h3>" + (int) score + "</h3></html>");
labScore.setBounds(20, 0, 200, 50);
labScore.setBounds(20, 0, 600, 50);
ecran.add(labScore);
labGameOver = new JLabel("GAME OVER", SwingConstants.CENTER);
@@ -70,31 +63,31 @@ public class Jeu implements KeyListener, ActionListener, MouseListener {
ecran.traiterBoucleAnimation();
}
private Joueur creerJoueur1() {
return new Joueur(
new Color(0.0f, 0.5f, 0.0f), new Color(0.8f, 0.0f, 0.0f),
KeyEvent.VK_UP, KeyEvent.VK_DOWN
);
}
private Joueur creerJoueur2() {
return new Joueur(
new Color(0.0f, 0.3f, 0.8f), new Color(0.6f, 0.0f, 0.6f),
KeyEvent.VK_Z, KeyEvent.VK_S
);
}
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if (keyCode == 38) { // flèche haut
demiCercleAvant.Monter();
demiCercleArriere.Monter();
}
if (keyCode == 40) { // flèche bas
demiCercleAvant.Descendre();
demiCercleArriere.Descendre();
for (Joueur joueur : joueurs) {
joueur.appliquerTouche(e.getKeyCode(), true);
}
}
@Override
public void keyReleased(KeyEvent e) {
int keyCode = e.getKeyCode();
if (keyCode == 38) { // flèche haut
demiCercleAvant.ArreterMonter();
demiCercleArriere.ArreterMonter();
}
if (keyCode == 40) { // flèche bas
demiCercleAvant.ArreterDescendre();
demiCercleArriere.ArreterDescendre();
for (Joueur joueur : joueurs) {
joueur.appliquerTouche(e.getKeyCode(), false);
}
}
@@ -115,20 +108,29 @@ public class Jeu implements KeyListener, ActionListener, MouseListener {
fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void lancerPartie(String pseudoSaisi) {
public void lancerPartie(String pseudoSaisi, boolean modeDeuxJoueurs) {
pseudo = pseudoSaisi;
deuxJoueurs = modeDeuxJoueurs;
// lignes pour ajouter les bonus
ecran.ajouterObjet(new Bonus(lili, demiCercleAvant, this));
ecran.ajouterObjet(new Malus(lili, demiCercleAvant, this));
ecran.ajouterObjet(new BonusTaille(lili, demiCercleAvant, this));
joueurs.clear();
joueurs.add(creerJoueur1());
if (deuxJoueurs) {
joueurs.add(creerJoueur2());
}
for (Joueur joueur : joueurs) {
ecran.ajouterObjet(joueur.demiCercleArriere);
}
// A FAIRE : placer dans l'écran tous les objets graphiques nécessaires
ecran.ajouterObjet(demiCercleArriere);
ecran.ajouterObjet(lili);
ecran.ajouterObjet(demiCercleAvant);
demiCercleArriere.setCouleur(new Color(0.8f, 0.0f, 0.0f));
demiCercleAvant.setCouleur(new Color(0.0f, 0.5f, 0.0f));
for (Joueur joueur : joueurs) {
ecran.ajouterObjet(joueur.demiCercleAvant);
}
ecran.ajouterObjet(new Bonus(lili, joueurs, this));
ecran.ajouterObjet(new Malus(lili, joueurs, this));
ecran.ajouterObjet(new BonusTaille(lili, joueurs, this));
ecran.addKeyListener(this);
ecran.setFocusable(true);
@@ -140,124 +142,78 @@ public class Jeu implements KeyListener, ActionListener, MouseListener {
score = 1;
compteurFrames = 0;
vies = 3;
enCollision = false;
estGameOver = false;
compteurInvincible = 0;
invincibiliteRouge = false;
bonusTailleActif = false;
compteurBonusTaille = 0;
gestionnaireNiveau.reinitialiser();
gestionnaireFinDePartie.reinitialiser();
double posY = deuxJoueurs ? 250 : 200;
for (int i = 0; i < joueurs.size(); i++) {
joueurs.get(i).reinitialiser(posY + i * 100);
}
ecran.demarrer();
if (horloge == null) {
horloge = new Timer(40, this);
}
horloge.start();
}
public void activerBonusTaille() {
bonusTailleActif = true;
// A 40ms par tick d'horloge, 150 frames = environ 6 secondes de bonus
compteurBonusTaille = 150;
}
@Override
public void actionPerformed(ActionEvent e) {
if (estGameOver == true) {
return;
}
if (estGameOver) return;
gestionnaireNiveau.mettreAJour();
if (gestionnaireNiveau.aChangéDeNiveau()) {
compteurInvincible = 0;
invincibiliteRouge = false;
for (Joueur joueur : joueurs) {
joueur.resetInvincibilite();
}
}
ecran.setCouleurFond(gestionnaireNiveau.getCouleurFondInterpolee());
double rayon = gestionnaireNiveau.getRayonCercle();
double rayonBase = gestionnaireNiveau.getRayonCercle();
if (bonusTailleActif == true) {
rayon = rayon + 30;
compteurBonusTaille = compteurBonusTaille - 1;
if (compteurBonusTaille <= 0) {
bonusTailleActif = false;
}
for (Joueur joueur : joueurs) {
joueur.mettreAJourRayon(rayonBase);
joueur.mettreAJourInvincibilite();
joueur.verifierCollisionLigne(lili);
joueur.resterDansLigne(lili);
}
demiCercleAvant.setRayon(rayon);
demiCercleArriere.setRayon(rayon);
ecran.traiterBoucleAnimation();
compteurFrames = compteurFrames + 1;
compteurFrames++;
if (compteurFrames >= 25) {
score = score + 1;
score++;
compteurFrames = 0;
}
if (compteurInvincible < 75) {
compteurInvincible = compteurInvincible + 1;
// clignotement
if (compteurInvincible % 10 < 5) {
if (invincibiliteRouge) {
// degats = rouge
demiCercleArriere.setCouleur(new Color(1f, 0f, 0f));
demiCercleAvant.setCouleur(new Color(1f, 0f, 0f));
} else {
// niveau/debut = blanc
demiCercleArriere.setCouleur(new Color(255, 255, 255, 150));
demiCercleAvant.setCouleur(new Color(255, 255, 255, 150));
}
} else {
// Couleurs normales entre deux clignotements
demiCercleArriere.setCouleur(new Color(0.8f, 0.0f, 0.0f));
demiCercleAvant.setCouleur(new Color(0.0f, 0.5f, 0.0f));
}
} else {
//couleur normale a la fin
demiCercleArriere.setCouleur(new Color(0.8f, 0.0f, 0.0f));
demiCercleAvant.setCouleur(new Color(0.0f, 0.5f, 0.0f));
if (demiCercleArriere.VerifierCollision(lili)) {
if (enCollision == false) {
vies = vies - 1;
enCollision = true;
compteurInvincible = 0;
invincibiliteRouge = true; // On a touché la ligne : on déclenche le ROUGE !
}
} else {
enCollision = false;
}
if (demiCercleArriere.VerifierCollision(lili)) {
if (enCollision == false) {
vies = vies - 1; // La nouvelle logique : on perd 1 vie
enCollision = true;
compteurInvincible = 0;
}
} else {
enCollision = false;
boolean tousMotrs = true;
for (Joueur joueur : joueurs) {
if (!joueur.estMort) {
tousMotrs = false;
break;
}
}
if (vies <= 0) {
vies = 0;
if (tousMotrs) {
estGameOver = true;
// Le gestionnaire s'occupe d'arrêter l'écran, afficher le label et sauvegarder
gestionnaireFinDePartie.declencherGameOver(ecran, pseudo, (int) score);
}
labScore.setText("<html><h3>Score : " + (int) score + " | Vies : " + vies + " | Niv. " + gestionnaireNiveau.getNumeroNiveau() + "</h3></html>");
mettreAJourLabel();
}
demiCercleArriere.ResterDansLigne(lili);
demiCercleAvant.ResterDansLigne(lili);
private void mettreAJourLabel() {
StringBuilder sb = new StringBuilder("<html><h3>Score : " + (int) score + " | ");
if (deuxJoueurs) {
sb.append("J1 : ").append(joueurs.get(0).vies).append(" | ");
sb.append("J2 : ").append(joueurs.get(1).vies).append(" | ");
} else {
sb.append("Vies : ").append(joueurs.get(0).vies).append(" | ");
}
sb.append("Niv. ").append(gestionnaireNiveau.getNumeroNiveau()).append("</h3></html>");
labScore.setText(sb.toString());
}
private void retourMenu() {
@@ -267,11 +223,7 @@ public class Jeu implements KeyListener, ActionListener, MouseListener {
gestionnaireNiveau.reinitialiser();
lili = new Ligne(new NoiseGenerator(0), gestionnaireNiveau);
demiCercleAvant.y = 200;
demiCercleAvant.vitesse = -1.0;
demiCercleArriere.y = 200;
demiCercleArriere.vitesse = -1.0;
joueurs.clear();
ecran.viderObjets();
menu.afficher(pseudo);
@@ -283,7 +235,7 @@ public class Jeu implements KeyListener, ActionListener, MouseListener {
@Override
public void mousePressed(MouseEvent e) {
if (estGameOver == true) {
if (estGameOver) {
retourMenu();
}
}