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

@@ -2,6 +2,7 @@ package linea;
import java.awt.Color; import java.awt.Color;
import java.awt.Graphics; import java.awt.Graphics;
import java.util.List;
public class Bonus extends ObjetGraphique { public class Bonus extends ObjetGraphique {
@@ -10,14 +11,13 @@ public class Bonus extends ObjetGraphique {
protected int compteurFrames = 0; protected int compteurFrames = 0;
protected boolean dejaCapture = false; protected boolean dejaCapture = false;
protected Ligne maLigne; protected Ligne maLigne;
protected Cercle monCercle; protected List<Joueur> joueurs;
protected Jeu monJeu; protected Jeu monJeu;
public Bonus(Ligne l, Cercle c, Jeu j) { public Bonus(Ligne l, List<Joueur> joueurs, Jeu j) {
this.maLigne = l; this.maLigne = l;
this.monCercle = c; this.joueurs = joueurs;
this.monJeu = j; this.monJeu = j;
this.couleur = Color.GREEN; this.couleur = Color.GREEN;
} }
@@ -25,11 +25,7 @@ public class Bonus extends ObjetGraphique {
@Override @Override
void Afficher(Graphics g) { void Afficher(Graphics g) {
if (actif) { if (actif) {
if (dejaCapture) { g.setColor(dejaCapture ? Color.BLUE : this.couleur);
g.setColor(Color.BLUE);
} else {
g.setColor(this.couleur);
}
g.fillRect((int)Math.round(x), (int)Math.round(y), (int)taille, (int)taille); g.fillRect((int)Math.round(x), (int)Math.round(y), (int)taille, (int)taille);
} }
} }
@@ -40,12 +36,9 @@ public class Bonus extends ObjetGraphique {
compteurFrames++; compteurFrames++;
} }
if (compteurFrames >= 220 && !actif) { if (compteurFrames >= 220 && !actif) {
actif = true; actif = true;
dejaCapture = false; dejaCapture = false;
x = 800; x = 800;
double hauteurLigne = 300; double hauteurLigne = 300;
@@ -69,23 +62,16 @@ public class Bonus extends ObjetGraphique {
double vitesseLigne = monJeu.gestionnaireNiveau.getVitesseScroll(); double vitesseLigne = monJeu.gestionnaireNiveau.getVitesseScroll();
x -= vitesseLigne; x -= vitesseLigne;
double centreX = x + (taille / 2.0); if (!dejaCapture) {
for (Joueur joueur : joueurs) {
if (centreX <= monCercle.x && centreX > monCercle.x - vitesseLigne) { if (joueur.verifierCollisionCollectible(x, y, taille, vitesseLigne)) {
joueur.ajouterVie();
double hautCercle = monCercle.y - monCercle.getRayon();
double basCercle = monCercle.y + monCercle.getRayon();
if (y > hautCercle && (y + taille) < basCercle) {
if (!dejaCapture) {
monJeu.vies += 1;
dejaCapture = true; dejaCapture = true;
break;
} }
} }
} }
// 2. Quand il sort de l'écran, on le désactive pour relancer le chrono !
if (x + taille < 0) { if (x + taille < 0) {
actif = false; actif = false;
} }

View File

@@ -2,21 +2,22 @@ package linea;
import java.awt.Color; import java.awt.Color;
import java.awt.Graphics; import java.awt.Graphics;
import java.util.List;
public class BonusTaille extends ObjetGraphique { public class BonusTaille extends ObjetGraphique {
protected double taille = 12; protected double taille = 12;
protected boolean actif = false; protected boolean actif = false;
protected int compteurFrames = 200; // pour avoir une position differente des autres bonuss protected int compteurFrames = 200;
protected boolean dejaCapture = false; protected boolean dejaCapture = false;
protected Ligne maLigne; protected Ligne maLigne;
protected Cercle monCercle; protected List<Joueur> joueurs;
protected Jeu monJeu; protected Jeu monJeu;
public BonusTaille(Ligne l, Cercle c, Jeu j) { public BonusTaille(Ligne l, List<Joueur> joueurs, Jeu j) {
this.maLigne = l; this.maLigne = l;
this.monCercle = c; this.joueurs = joueurs;
this.monJeu = j; this.monJeu = j;
this.couleur = Color.CYAN; this.couleur = Color.CYAN;
} }
@@ -24,11 +25,7 @@ public class BonusTaille extends ObjetGraphique {
@Override @Override
void Afficher(Graphics g) { void Afficher(Graphics g) {
if (actif) { if (actif) {
if (dejaCapture) { g.setColor(dejaCapture ? new Color(255, 255, 255, 100) : this.couleur);
g.setColor(new Color(255, 255, 255, 100));
} else {
g.setColor(this.couleur);
}
g.fillOval((int)Math.round(x), (int)Math.round(y), (int)taille, (int)taille); g.fillOval((int)Math.round(x), (int)Math.round(y), (int)taille, (int)taille);
} }
} }
@@ -39,7 +36,6 @@ public class BonusTaille extends ObjetGraphique {
compteurFrames++; compteurFrames++;
} }
if (compteurFrames >= 320 && !actif) { if (compteurFrames >= 320 && !actif) {
actif = true; actif = true;
dejaCapture = false; dejaCapture = false;
@@ -66,16 +62,12 @@ public class BonusTaille extends ObjetGraphique {
double vitesseLigne = monJeu.gestionnaireNiveau.getVitesseScroll(); double vitesseLigne = monJeu.gestionnaireNiveau.getVitesseScroll();
x -= vitesseLigne; x -= vitesseLigne;
double centreX = x + (taille / 2.0); if (!dejaCapture) {
for (Joueur joueur : joueurs) {
if (centreX <= monCercle.x && centreX > monCercle.x - vitesseLigne) { if (joueur.verifierCollisionCollectible(x, y, taille, vitesseLigne)) {
double hautCercle = monCercle.y - monCercle.getRayon(); joueur.activerBonusTaille();
double basCercle = monCercle.y + monCercle.getRayon();
if (y > hautCercle && (y + taille) < basCercle) {
if (!dejaCapture) {
monJeu.activerBonusTaille();
dejaCapture = true; dejaCapture = true;
break;
} }
} }
} }

View File

@@ -8,6 +8,8 @@ import java.awt.event.KeyEvent;
import java.awt.event.KeyListener; import java.awt.event.KeyListener;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.awt.event.MouseListener; import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame; import javax.swing.JFrame;
import javax.swing.JLabel; import javax.swing.JLabel;
@@ -18,43 +20,34 @@ public class Jeu implements KeyListener, ActionListener, MouseListener {
protected ZoneDessin ecran = new ZoneDessin(); 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 GestionnaireNiveau gestionnaireNiveau = new GestionnaireNiveau();
protected Ligne lili = new Ligne(new NoiseGenerator(0), gestionnaireNiveau); protected Ligne lili = new Ligne(new NoiseGenerator(0), gestionnaireNiveau);
protected List<Joueur> joueurs = new ArrayList<>();
protected boolean deuxJoueurs = false;
protected Timer horloge; protected Timer horloge;
protected double score = 1; protected double score = 1;
protected JLabel labScore; protected JLabel labScore;
protected int vies = 3;
protected GestionnaireScore gestionnaireBDD = new GestionnaireScore(); protected GestionnaireScore gestionnaireBDD = new GestionnaireScore();
protected GestionnaireFinDePartie gestionnaireFinDePartie; protected GestionnaireFinDePartie gestionnaireFinDePartie;
protected int compteurFrames = 0; protected int compteurFrames = 0;
protected boolean enCollision = false;
protected boolean estGameOver = false; protected boolean estGameOver = false;
protected JLabel labGameOver; 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 String pseudo = "";
protected JFrame fenetre; protected JFrame fenetre;
protected MenuPrincipal menu; protected MenuPrincipal menu;
public Jeu() { public Jeu() {
labScore = new JLabel(); labScore = new JLabel();
labScore.setForeground(Color.WHITE); labScore.setForeground(Color.WHITE);
labScore.setText("<html><h3>" + (int) score + "</h3></html>"); labScore.setText("<html><h3>" + (int) score + "</h3></html>");
labScore.setBounds(20, 0, 200, 50); labScore.setBounds(20, 0, 600, 50);
ecran.add(labScore); ecran.add(labScore);
labGameOver = new JLabel("GAME OVER", SwingConstants.CENTER); labGameOver = new JLabel("GAME OVER", SwingConstants.CENTER);
@@ -70,31 +63,31 @@ public class Jeu implements KeyListener, ActionListener, MouseListener {
ecran.traiterBoucleAnimation(); 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 @Override
public void keyPressed(KeyEvent e) { public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode(); for (Joueur joueur : joueurs) {
joueur.appliquerTouche(e.getKeyCode(), true);
if (keyCode == 38) { // flèche haut
demiCercleAvant.Monter();
demiCercleArriere.Monter();
}
if (keyCode == 40) { // flèche bas
demiCercleAvant.Descendre();
demiCercleArriere.Descendre();
} }
} }
@Override @Override
public void keyReleased(KeyEvent e) { public void keyReleased(KeyEvent e) {
int keyCode = e.getKeyCode(); for (Joueur joueur : joueurs) {
joueur.appliquerTouche(e.getKeyCode(), false);
if (keyCode == 38) { // flèche haut
demiCercleAvant.ArreterMonter();
demiCercleArriere.ArreterMonter();
}
if (keyCode == 40) { // flèche bas
demiCercleAvant.ArreterDescendre();
demiCercleArriere.ArreterDescendre();
} }
} }
@@ -115,20 +108,29 @@ public class Jeu implements KeyListener, ActionListener, MouseListener {
fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} }
public void lancerPartie(String pseudoSaisi) { public void lancerPartie(String pseudoSaisi, boolean modeDeuxJoueurs) {
pseudo = pseudoSaisi; pseudo = pseudoSaisi;
deuxJoueurs = modeDeuxJoueurs;
// lignes pour ajouter les bonus joueurs.clear();
ecran.ajouterObjet(new Bonus(lili, demiCercleAvant, this)); joueurs.add(creerJoueur1());
ecran.ajouterObjet(new Malus(lili, demiCercleAvant, this)); if (deuxJoueurs) {
ecran.ajouterObjet(new BonusTaille(lili, demiCercleAvant, this)); 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(lili);
ecran.ajouterObjet(demiCercleAvant);
demiCercleArriere.setCouleur(new Color(0.8f, 0.0f, 0.0f)); for (Joueur joueur : joueurs) {
demiCercleAvant.setCouleur(new Color(0.0f, 0.5f, 0.0f)); 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.addKeyListener(this);
ecran.setFocusable(true); ecran.setFocusable(true);
@@ -140,124 +142,78 @@ public class Jeu implements KeyListener, ActionListener, MouseListener {
score = 1; score = 1;
compteurFrames = 0; compteurFrames = 0;
vies = 3;
enCollision = false;
estGameOver = false; estGameOver = false;
compteurInvincible = 0;
invincibiliteRouge = false;
bonusTailleActif = false;
compteurBonusTaille = 0;
gestionnaireNiveau.reinitialiser(); gestionnaireNiveau.reinitialiser();
gestionnaireFinDePartie.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(); ecran.demarrer();
if (horloge == null) { if (horloge == null) {
horloge = new Timer(40, this); horloge = new Timer(40, this);
} }
horloge.start(); horloge.start();
}
public void activerBonusTaille() {
bonusTailleActif = true;
// A 40ms par tick d'horloge, 150 frames = environ 6 secondes de bonus
compteurBonusTaille = 150;
} }
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
if (estGameOver == true) { if (estGameOver) return;
return;
}
gestionnaireNiveau.mettreAJour(); gestionnaireNiveau.mettreAJour();
if (gestionnaireNiveau.aChangéDeNiveau()) { if (gestionnaireNiveau.aChangéDeNiveau()) {
compteurInvincible = 0; for (Joueur joueur : joueurs) {
invincibiliteRouge = false; joueur.resetInvincibilite();
}
} }
ecran.setCouleurFond(gestionnaireNiveau.getCouleurFondInterpolee()); ecran.setCouleurFond(gestionnaireNiveau.getCouleurFondInterpolee());
double rayon = gestionnaireNiveau.getRayonCercle(); double rayonBase = gestionnaireNiveau.getRayonCercle();
for (Joueur joueur : joueurs) {
if (bonusTailleActif == true) { joueur.mettreAJourRayon(rayonBase);
rayon = rayon + 30; joueur.mettreAJourInvincibilite();
compteurBonusTaille = compteurBonusTaille - 1; joueur.verifierCollisionLigne(lili);
joueur.resterDansLigne(lili);
if (compteurBonusTaille <= 0) {
bonusTailleActif = false;
}
} }
demiCercleAvant.setRayon(rayon);
demiCercleArriere.setRayon(rayon);
ecran.traiterBoucleAnimation(); ecran.traiterBoucleAnimation();
compteurFrames = compteurFrames + 1; compteurFrames++;
if (compteurFrames >= 25) { if (compteurFrames >= 25) {
score = score + 1; score++;
compteurFrames = 0; compteurFrames = 0;
} }
if (compteurInvincible < 75) { boolean tousMotrs = true;
compteurInvincible = compteurInvincible + 1; for (Joueur joueur : joueurs) {
if (!joueur.estMort) {
// clignotement tousMotrs = false;
if (compteurInvincible % 10 < 5) { break;
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;
} }
} }
if (vies <= 0) { if (tousMotrs) {
vies = 0;
estGameOver = true; estGameOver = true;
// Le gestionnaire s'occupe d'arrêter l'écran, afficher le label et sauvegarder
gestionnaireFinDePartie.declencherGameOver(ecran, pseudo, (int) score); gestionnaireFinDePartie.declencherGameOver(ecran, pseudo, (int) score);
} }
labScore.setText("<html><h3>Score : " + (int) score + " | Vies : " + vies + " | Niv. " + gestionnaireNiveau.getNumeroNiveau() + "</h3></html>"); mettreAJourLabel();
}
demiCercleArriere.ResterDansLigne(lili); private void mettreAJourLabel() {
demiCercleAvant.ResterDansLigne(lili); 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() { private void retourMenu() {
@@ -267,11 +223,7 @@ public class Jeu implements KeyListener, ActionListener, MouseListener {
gestionnaireNiveau.reinitialiser(); gestionnaireNiveau.reinitialiser();
lili = new Ligne(new NoiseGenerator(0), gestionnaireNiveau); lili = new Ligne(new NoiseGenerator(0), gestionnaireNiveau);
joueurs.clear();
demiCercleAvant.y = 200;
demiCercleAvant.vitesse = -1.0;
demiCercleArriere.y = 200;
demiCercleArriere.vitesse = -1.0;
ecran.viderObjets(); ecran.viderObjets();
menu.afficher(pseudo); menu.afficher(pseudo);
@@ -283,7 +235,7 @@ public class Jeu implements KeyListener, ActionListener, MouseListener {
@Override @Override
public void mousePressed(MouseEvent e) { public void mousePressed(MouseEvent e) {
if (estGameOver == true) { if (estGameOver) {
retourMenu(); retourMenu();
} }
} }

187
src/Joueur.java Normal file
View File

@@ -0,0 +1,187 @@
package linea;
import java.awt.Color;
public class Joueur {
protected Cercle demiCercleAvant;
protected Cercle demiCercleArriere;
protected int vies = 3;
protected boolean enCollision = false;
protected int compteurInvincible = 0;
protected boolean invincibiliteRouge = false;
protected boolean bonusTailleActif = false;
protected int compteurBonusTaille = 0;
protected boolean estMort = false;
protected Color couleurAvant;
protected Color couleurArriere;
protected int toucheHaut;
protected int toucheBas;
public Joueur(Color couleurAvant, Color couleurArriere, int toucheHaut, int toucheBas) {
this.demiCercleAvant = new Cercle(90, -180);
this.demiCercleArriere = new Cercle(90, 180);
this.couleurAvant = couleurAvant;
this.couleurArriere = couleurArriere;
this.toucheHaut = toucheHaut;
this.toucheBas = toucheBas;
appliquerCouleurs();
}
public void appliquerTouche(int keyCode, boolean pressed) {
if (estMort) return;
if (keyCode == toucheHaut) {
if (pressed) {
demiCercleAvant.Monter();
demiCercleArriere.Monter();
} else {
demiCercleAvant.ArreterMonter();
demiCercleArriere.ArreterMonter();
}
}
if (keyCode == toucheBas) {
if (pressed) {
demiCercleAvant.Descendre();
demiCercleArriere.Descendre();
} else {
demiCercleAvant.ArreterDescendre();
demiCercleArriere.ArreterDescendre();
}
}
}
public void mettreAJourRayon(double rayonBase) {
double rayon = rayonBase;
if (bonusTailleActif) {
rayon += 30;
compteurBonusTaille--;
if (compteurBonusTaille <= 0) {
bonusTailleActif = false;
}
}
demiCercleAvant.setRayon(rayon);
demiCercleArriere.setRayon(rayon);
}
public void mettreAJourInvincibilite() {
if (estMort) {
demiCercleAvant.setCouleur(new Color(0, 0, 0, 0));
demiCercleArriere.setCouleur(new Color(0, 0, 0, 0));
return;
}
if (compteurInvincible < 75) {
compteurInvincible++;
if (compteurInvincible % 10 < 5) {
if (invincibiliteRouge) {
demiCercleArriere.setCouleur(new Color(1f, 0f, 0f));
demiCercleAvant.setCouleur(new Color(1f, 0f, 0f));
} else {
demiCercleArriere.setCouleur(new Color(255, 255, 255, 150));
demiCercleAvant.setCouleur(new Color(255, 255, 255, 150));
}
} else {
appliquerCouleurs();
}
} else {
appliquerCouleurs();
}
}
public boolean estInvincible() {
return compteurInvincible < 75;
}
public void verifierCollisionLigne(Ligne li) {
if (estMort || estInvincible()) return;
if (demiCercleArriere.VerifierCollision(li)) {
if (!enCollision) {
vies--;
enCollision = true;
compteurInvincible = 0;
invincibiliteRouge = true;
}
} else {
enCollision = false;
}
if (vies <= 0) {
vies = 0;
estMort = true;
}
}
public boolean verifierCollisionCollectible(double itemX, double itemY, double itemTaille, double vitesseLigne) {
if (estMort) return false;
double centreX = itemX + (itemTaille / 2.0);
if (centreX <= demiCercleAvant.x && centreX > demiCercleAvant.x - vitesseLigne) {
double hautCercle = demiCercleAvant.y - demiCercleAvant.getRayon();
double basCercle = demiCercleAvant.y + demiCercleAvant.getRayon();
return itemY > hautCercle && (itemY + itemTaille) < basCercle;
}
return false;
}
public void resterDansLigne(Ligne li) {
if (estMort) return;
demiCercleArriere.ResterDansLigne(li);
demiCercleAvant.ResterDansLigne(li);
}
public void activerBonusTaille() {
bonusTailleActif = true;
compteurBonusTaille = 150;
}
public void ajouterVie() {
vies++;
}
public void retirerVie() {
vies--;
invincibiliteRouge = true;
compteurInvincible = 0;
if (vies <= 0) {
vies = 0;
estMort = true;
}
}
public void resetInvincibilite() {
compteurInvincible = 0;
invincibiliteRouge = false;
}
public void appliquerCouleurs() {
demiCercleArriere.setCouleur(couleurArriere);
demiCercleAvant.setCouleur(couleurAvant);
}
public void ajouterDansEcran(ZoneDessin ecran) {
ecran.ajouterObjet(demiCercleArriere);
ecran.ajouterObjet(demiCercleAvant);
}
public void reinitialiser(double posY) {
vies = 3;
enCollision = false;
compteurInvincible = 0;
invincibiliteRouge = false;
bonusTailleActif = false;
compteurBonusTaille = 0;
estMort = false;
demiCercleAvant.y = posY;
demiCercleAvant.vitesse = -1.0;
demiCercleArriere.y = posY;
demiCercleArriere.vitesse = -1.0;
appliquerCouleurs();
}
}

View File

@@ -2,6 +2,7 @@ package linea;
import java.awt.Color; import java.awt.Color;
import java.awt.Graphics; import java.awt.Graphics;
import java.util.List;
public class Malus extends ObjetGraphique { public class Malus extends ObjetGraphique {
@@ -11,12 +12,12 @@ public class Malus extends ObjetGraphique {
protected boolean dejaCapture = false; protected boolean dejaCapture = false;
protected Ligne maLigne; protected Ligne maLigne;
protected Cercle monCercle; protected List<Joueur> joueurs;
protected Jeu monJeu; protected Jeu monJeu;
public Malus(Ligne l, Cercle c, Jeu j) { public Malus(Ligne l, List<Joueur> joueurs, Jeu j) {
this.maLigne = l; this.maLigne = l;
this.monCercle = c; this.joueurs = joueurs;
this.monJeu = j; this.monJeu = j;
this.couleur = Color.RED; this.couleur = Color.RED;
} }
@@ -24,11 +25,7 @@ public class Malus extends ObjetGraphique {
@Override @Override
void Afficher(Graphics g) { void Afficher(Graphics g) {
if (actif) { if (actif) {
if (dejaCapture) { g.setColor(dejaCapture ? Color.BLACK : this.couleur);
g.setColor(Color.black);
} else {
g.setColor(this.couleur);
}
g.fillRect((int)Math.round(x), (int)Math.round(y), (int)taille, (int)taille); g.fillRect((int)Math.round(x), (int)Math.round(y), (int)taille, (int)taille);
} }
} }
@@ -40,10 +37,8 @@ public class Malus extends ObjetGraphique {
} }
if (compteurFrames >= 250 && !actif) { if (compteurFrames >= 250 && !actif) {
actif = true; actif = true;
dejaCapture = false; dejaCapture = false;
x = 800; x = 800;
double hauteurLigne = 300; double hauteurLigne = 300;
@@ -67,20 +62,12 @@ public class Malus extends ObjetGraphique {
double vitesseLigne = monJeu.gestionnaireNiveau.getVitesseScroll(); double vitesseLigne = monJeu.gestionnaireNiveau.getVitesseScroll();
x -= vitesseLigne; x -= vitesseLigne;
double centreX = x + (taille / 2.0); if (!dejaCapture) {
for (Joueur joueur : joueurs) {
if (centreX <= monCercle.x && centreX > monCercle.x - vitesseLigne) { if (joueur.verifierCollisionCollectible(x, y, taille, vitesseLigne)) {
joueur.retirerVie();
double hautCercle = monCercle.y - monCercle.getRayon();
double basCercle = monCercle.y + monCercle.getRayon();
if (y > hautCercle && (y + taille) < basCercle) {
if (!dejaCapture) {
monJeu.vies -= 1;
dejaCapture = true; dejaCapture = true;
monJeu.invincibiliteRouge = true; break;
monJeu.compteurInvincible = 0;
} }
} }
} }

View File

@@ -13,7 +13,6 @@ import javax.swing.JPanel;
import javax.swing.JTextField; import javax.swing.JTextField;
import javax.swing.SwingConstants; import javax.swing.SwingConstants;
// Classe qui représente le menu principal du jeu (affiché au lancement).
public class MenuPrincipal { public class MenuPrincipal {
private JFrame fenetre; private JFrame fenetre;
@@ -25,33 +24,36 @@ public class MenuPrincipal {
this.jeu = jeu; this.jeu = jeu;
} }
// Construit et affiche le panneau du menu dans la fenêtre
public void afficher(String pseudoActuel) { public void afficher(String pseudoActuel) {
JPanel panneau = new JPanel(new GridLayout(6, 1, 10, 10)); JPanel panneau = new JPanel(new GridLayout(7, 1, 10, 10));
JLabel titre = new JLabel("LINEA", SwingConstants.CENTER); JLabel titre = new JLabel("LINEA", SwingConstants.CENTER);
champPseudo = new JTextField(pseudoActuel, 15); champPseudo = new JTextField(pseudoActuel, 15);
JButton boutonJouer = new JButton("Jouer"); JButton bouton1Joueur = new JButton("1 Joueur");
JButton bouton2Joueurs = new JButton("2 Joueurs");
JButton boutonClassement = new JButton("Classement"); JButton boutonClassement = new JButton("Classement");
JButton boutonQuitter = new JButton("Quitter"); JButton boutonQuitter = new JButton("Quitter");
boutonJouer.addActionListener(new ActionListener() { bouton1Joueur.addActionListener(new ActionListener() {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
jeu.lancerPartie(champPseudo.getText()); jeu.lancerPartie(champPseudo.getText(), false);
}
});
bouton2Joueurs.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
jeu.lancerPartie(champPseudo.getText(), true);
} }
}); });
boutonClassement.addActionListener(new ActionListener() { boutonClassement.addActionListener(new ActionListener() {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
// 1. On récupère les scores depuis la BDD via l'objet 'jeu'
String scores = jeu.getGestionnaireBDD().getTopScores(); String scores = jeu.getGestionnaireBDD().getTopScores();
// 2. On affiche le résultat dans la petite fenêtre popup
JOptionPane.showMessageDialog(fenetre, scores, "Meilleurs Scores", JOptionPane.INFORMATION_MESSAGE); JOptionPane.showMessageDialog(fenetre, scores, "Meilleurs Scores", JOptionPane.INFORMATION_MESSAGE);
} }
}); });
@@ -65,12 +67,12 @@ public class MenuPrincipal {
panneau.add(titre); panneau.add(titre);
panneau.add(champPseudo); panneau.add(champPseudo);
panneau.add(boutonJouer); panneau.add(bouton1Joueur);
panneau.add(bouton2Joueurs);
panneau.add(boutonClassement); panneau.add(boutonClassement);
panneau.add(boutonQuitter); panneau.add(boutonQuitter);
// panneau centré dans la fenêtre JPanel conteneur = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 130));
JPanel conteneur = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 150));
conteneur.add(panneau); conteneur.add(panneau);
fenetre.setContentPane(conteneur); fenetre.setContentPane(conteneur);