Probleme affichage java
EMBK
Messages postés
2
Date d'inscription
Statut
Membre
Dernière intervention
-
EMBK Messages postés 2 Date d'inscription Statut Membre Dernière intervention -
EMBK Messages postés 2 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je rencontre un problème dans l'exécution de mon code java qui a pour but la conception d'un jeu de type tower-defense, alors mon problème est que lorsque je compile mon code, les cases ne s'affichent pas automatiquement, je suis obligé de déplacer mon curseur sur chaque case pour les afficher, de même lorsqu'une fenêtre de dialogue s'affiche, les cases derrières elles partent et je dois redéplacer le curseur sur elles pour les afficher. J'ai tenter plusieurs choses en essayent d'intégrer un invokelater pour voir si le problème venait du temps de chargement, j'ai utilisé des fonctions repaint() et modifier l'ordre de mon code, mais rien n'y fait j'ai toujours ce probleme, pouvez-vous m'indiquer si vous le savez la marche à suivre s'il vous plait, je vous met ci-joint les classes entierements ecrites qui semblent poser probleme vu que je suis bloqué depuis deux semaines sur le meme probleme, sachant qu'il reste des classes assaillants et defenseurs mais qui ne semblent pas etre le probleme, MERCI
Classe fenetre:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Fenetre extends JFrame
{
private static final long serialVersionUID = 1L;
public static Case[][] cases;
public static boolean treve = false;
public static char vie = 'a';
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("Menu");
JMenuItem aide = new JMenuItem("Aide");
JMenuItem fermer = new JMenuItem("Fermer");
public Fenetre()
{
super("Tower Defense");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JFrame.setDefaultLookAndFeelDecorated(true);
this.setPreferredSize(new Dimension(1200, 800));
this.setResizable(false);
this.menu.add(fermer);
this.menu.add(aide);
this.menuBar.add(menu);
this.setJMenuBar(menuBar);
fermer.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
System.exit(0);
}
});
aide.addActionListener(new ActionListener(){
@SuppressWarnings("static-access")
public void actionPerformed(ActionEvent arg0) {
JOptionPane regle = new JOptionPane();
regle.showMessageDialog(null, "Caracteristiques des Defenseurs:\n\n- Ravageur: a une grande porté de dégat.\n- Saboteur: Donne des malus aux ennemies.\n- Attaquant: a un grand taux de dégat.\n\n\nCaracteristiques des Assaillants:\n\n- Mage Blanc: Peut se régénérer.\n- Mercenaire: Assailant standard avec plus de points de vie.\n- Ninja: Se déplace plus rapidement.\n ", "Aide", JOptionPane.INFORMATION_MESSAGE);
}
});
JPanel panBoutons = new JPanel();
GridLayout gl = new GridLayout(13, 7);
panBoutons.setLayout(gl);
Fenetre.cases = TerrainDeJeu.creationTerrain();
TerrainDeJeu.afficheTerrain(Fenetre.cases, panBoutons);
this.add(panBoutons, BorderLayout.CENTER);
JPanel goPan = new JPanel();
JButton goBouton = new JButton("Commencer");
goBouton.addActionListener(new ActionListener(){
@SuppressWarnings("static-access")
public void actionPerformed(ActionEvent arg0)
{
final int XP = 2;
Fenetre.treve = false;
if(Defenseur.temps == -1)
{
((JButton)arg0.getSource()).setText("Suivant");
JOptionPane jop1 = new JOptionPane();
jop1.showMessageDialog(null, " Bienvenue dans Tower Defense!\n Il vous faut placer deux défenseurs sur le terrain avant de commencer.\n Veuillez cliquer sur un case du terrain pour ajouter un défenseur.", "Lancement du jeu", JOptionPane.INFORMATION_MESSAGE);
}
else
{
if(Defenseur.temps %25 == 0 && Defenseur.temps != 0)
{
Fenetre.vie += 2 ; // grosse augmentation du niveau de vie des assaillants tous les 25 tours
}
if(Assaillant.assaillant.isEmpty())
{
// on remplit l'ArrayList D'assaillants = création d'une nouvelle vague
Fenetre.vie += 1;
Assaillant.numeroZero(); // sert à réinitialiser la variable statique 'numero' (et donc la variable id) de la classe Assaillant ---> sert pour plus loin dans le code...
for(int i = 0; i < 4; i++)
{
double type = Math.random();
if(type < 0.33)
{
Mercenaire mercenaire = new Mercenaire(Fenetre.vie);
Assaillant.assaillant.add(mercenaire);
}
if(type > 0.33 && type < 0.66)
{
MageBlanc mageBlanc = new MageBlanc(Fenetre.vie);
Assaillant.assaillant.add(mageBlanc);
}
if(type > 0.66)
{
Ninja ninja = new Ninja(Fenetre.vie);
Assaillant.assaillant.add(ninja);
}
}
if(Defenseur.temps != 0)
{
Fenetre.treve = true;
JOptionPane pause = new JOptionPane();
pause.showMessageDialog(null, "Phase de trève, vous possédez " + Defenseur.getBourse() + " gils, vous pouvez au choix:\n Acheter un défenseur (200 gils)\n Augmenter le niveau d'un défenseur (100 gils)\n Déblayer une case encombrée (100 gils)\n\n Pour reprendre le jeu, il vous suffit de cliquer sur 'suivant'", "Trève", JOptionPane.INFORMATION_MESSAGE);
}
}
if(Fenetre.treve == false) // sinon, si ArrayList non vide,
{
Assaillant assFin = Assaillant.assaillantFin(Assaillant.assaillant, Fenetre.cases); // on regarde si un Assaillant s'apprête à se trouver sur la sortie lors du prochain déplacement.
if(Assaillant.assaillant.contains(assFin)) // si oui,
{
Fenetre.cases[assFin.getAbsX()][assFin.getOrdY()].setText(" "); // on met un "espace libre" à la place du caractère vie de l'assaillant,
Assaillant.assaillant.remove(assFin); // on le supprime de l'ArrayList,
Defenseur.ptsDeVieJoueur -= 1; // et on retire 1 point de vie au joueur.
if(Defenseur.ptsDeVieJoueur <= 0) // si plus de points de vie, on sort la boucle de condition 'tant que points de vie joueur > 0'
{
JOptionPane perdu = new JOptionPane();
perdu.showMessageDialog(null, " Vous avez perdu!", "Game Over", JOptionPane.INFORMATION_MESSAGE);
System.exit(0);
}
}
for(Assaillant assaillant : Assaillant.assaillant)
{
int timedeplace = 0;
int vitDeplace = assaillant.getVitDeplace(); // retourne la vitesse de déplacement de l'assaillant en question
if(assaillant instanceof Ninja)
{
if(assaillant.getEtat() != "boulet")
{
vitDeplace *= 2;
}
}
while(vitDeplace > timedeplace) // cette condition est nécessaire car elle évite des déplacements hors zone ou des "colisions" entre deux vagues d'assaillants de type différent.
{ // car la variable vitDeplace va varier plus tard selon le type d'assaillants
assaillant.changeDirection(); // on vérifie si l'assaillant doit changer de direction de déplacement
if(Fenetre.cases[assaillant.getAbsX() + assaillant.getVecteurX()][assaillant.getOrdY() + assaillant.getVecteurY()].getText() == " ") // vérifie qu'il n'y a pas un autre assaillant devant lui
{
if(Fenetre.cases[assaillant.getAbsX()][assaillant.getOrdY()].getText() != "+") // pour ne pas effacer le '+' du terrain, les assaillants apparaissent véritablement sur la 2nde case de déplacement
{
Fenetre.cases[assaillant.getAbsX()][assaillant.getOrdY()].setText(" "); // mets un espace là où l'assaillant se trouve
}
assaillant.deplaceAssaillant(); // déplace l'assaillant
if(assaillant instanceof Mercenaire)
{
Fenetre.cases[assaillant.getAbsX()][assaillant.getOrdY()].setText("Mercenaire (" + Character.toString(assaillant.vieAssaillant()) + ")"); // place l'assaillant (son caractère) sur la terrain (tableau de caractères)
}
if(assaillant instanceof MageBlanc)
{
Fenetre.cases[assaillant.getAbsX()][assaillant.getOrdY()].setText("Mage Blanc (" + Character.toString(assaillant.vieAssaillant()) + ")"); // place l'assaillant (son caractère) sur la terrain (tableau de caractères)
}
if(assaillant instanceof Ninja)
{
Fenetre.cases[assaillant.getAbsX()][assaillant.getOrdY()].setText("Ninja (" + Character.toString(assaillant.vieAssaillant()) + ")"); // place l'assaillant (son caractère) sur la terrain (tableau de caractères)
}
}
vitDeplace--; // décrémentation jusqu'à atteindre 0;
}
}
for(Defenseur defenseur : Defenseur.defenseur)
{
int latence = defenseur.getLatence(); // récupère la latence du défenseur
Assaillant choixAssaillant = defenseur.bonChoix(Assaillant.assaillant); // retourne les caractéristiques de l'assaillant à attaquer (ou assaillant(' ') si aucun assaillant à portée)
if((choixAssaillant.vieAssaillant() == ' ') || (latence > 0)) // s'il n'y pas d'assaillants à portée du défenseur, ou si le temps de latence n'est pas arrivé à 0
{
defenseur.setLatenceDown(); // on diminue le temps de latence
continue; // et on passe directement à l'autre défenseur
}
int objet = 0;
for(Assaillant assaillant : Assaillant.assaillant)
{
if(assaillant == choixAssaillant)
{
Assaillant.assaillant.set(objet, choixAssaillant); // on change le bon assaillant par choixAssaillant,
break; // et on quitte la boucle dès qu'on a trouvé le bon assaillant
}
objet++;
}
defenseur.attaqueAssaillant(Fenetre.cases, choixAssaillant); // attaque le bon assaillant
defenseur.setLatenceUp(); // on remet le temps de latence à 2 (fixe...)
if(choixAssaillant.tue())
{
Defenseur.gagneArgent(); // le joueur gagne 50 gils,
defenseur.modifExp(XP); // le défenseur qui a tué l'assailant gagne 2 points d'expérience,
Fenetre.cases[choixAssaillant.getAbsX()][choixAssaillant.getOrdY()].setText(" "); // on met un espace là où se trouve l'assaillant,
Assaillant.assaillant.remove(choixAssaillant); // et on le supprime de l'ArrayList Assaillant.
}
}
if(Defenseur.temps >= 199) // si le joueur tient 200 tours (pour info, il faut environ 15 tours pour qu'un assaillant puisse atteindre la sortie et donc réduire les points de vie de 1)
{
JOptionPane gagne = new JOptionPane();
gagne.showMessageDialog(null, "Bravo! Vous avez gagne!", "Felicitations!", JOptionPane.INFORMATION_MESSAGE); // alors il a gagné!
System.exit(0);
}
}
}
Defenseur.temps++; // incrémentation du tour de jeu
}
});
goPan.add(goBouton);
this.add(goPan, BorderLayout.PAGE_END);
this.pack();
this.setVisible(true);
}
}
------------------------------------------------------------------------------------------------------
Classe Case:
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class Case extends JButton implements ActionListener
{
private static final long serialVersionUID = 1L;
private int x;
private int y;
public Case(String s, int x, int y, Color color)
{
super(s);
this.x = x;
this.y = y;
addActionListener(this);
setBackground(color);
}
public int getX()
{
return x;
}
public int getY()
{
return y;
}
public String toString()
{
return "Case de coordonnees (" + x + ", " + y + ")";
}
@SuppressWarnings("static-access")
public void actionPerformed(ActionEvent e)
{
if(Fenetre.treve == true || Defenseur.temps == 0)
{
if(Defenseur.bourse >= 100)
{
if(((Case) e.getSource()).getText() == ".")
{
if(Defenseur.bourse >= 200)
{
int x = ((Case) e.getSource()).getX();
int y = ((Case) e.getSource()).getY();
String[] type = {"Attaquant", "Ravageur", "Saboteur"};
JOptionPane jopType = new JOptionPane();
String nom = (String)jopType.showInputDialog(null, "Veuillez indiquer le type du défenseur", "Choix du type", JOptionPane.QUESTION_MESSAGE, null, type, type[0]);
if(nom == "Attaquant")
{
Attaquant attaquant0 = new Attaquant(x, y);
((Case) e.getSource()).setText("Attaquant Niveau" + attaquant0.niveauDefenseur());
Defenseur.bourse -= 200;
Defenseur.defenseur.add(attaquant0);
jopType.showMessageDialog(null, "Vous venez de créer un " + nom + "!", "Et hop!", JOptionPane.INFORMATION_MESSAGE);
}
if(nom == "Ravageur")
{
Ravageur ravageur0 = new Ravageur(x, y);
((Case) e.getSource()).setText("Ravageur Niveau" + ravageur0.niveauDefenseur());
Defenseur.bourse -= 200;
Defenseur.defenseur.add(ravageur0);
jopType.showMessageDialog(null, "Vous venez de créer un " + nom + "!", "Et hop!", JOptionPane.INFORMATION_MESSAGE);
}
if(nom == "Saboteur")
{
Saboteur saboteur0 = new Saboteur(x, y);
((Case) e.getSource()).setText("Saboteur Niveau" + saboteur0.niveauDefenseur());
Defenseur.bourse -= 200;
Defenseur.defenseur.add(saboteur0);
jopType.showMessageDialog(null, "Vous venez de créer un " + nom + "!", "Et hop!", JOptionPane.INFORMATION_MESSAGE);
}
}
else
{
JOptionPane jop = new JOptionPane();
jop.showMessageDialog(null, "Bourse insuffisante pour effectuer cette action", "Erreur", JOptionPane.ERROR_MESSAGE);
}
}
else
{
if(((Case) e.getSource()).getText() == "#")
{
if(Defenseur.temps > 0)
{
((Case) e.getSource()).setText(".");
((Case) e.getSource()).setBackground(Color.ORANGE);
Defenseur.bourse -= 100;
}
}
else
{
if(Defenseur.temps > 0)
{
int x = ((Case) e.getSource()).getX();
int y = ((Case) e.getSource()).getY();
if(Fenetre.cases[x][y].getText() != "$" && Fenetre.cases[x][y].getText() != "#" && Fenetre.cases[x][y].getText() != " " && Fenetre.cases[x][y].getText() != ".")
{
Defenseur defenseur1 = new Defenseur(x, y);
Defenseur.numero --;
for(Defenseur def: Defenseur.defenseur)
{
if(def.getAbsX() == defenseur1.getAbsX() && def.getOrdY() == defenseur1.getOrdY())
{
if(def.getExperience() >= 6)
{
if(def instanceof Attaquant)
{
def.monteeNiveau();
((Case) e.getSource()).setText("Attaquant Niveau" + def.niveauDefenseur());
}
if(def instanceof Ravageur)
{
def.monteeNiveau();
((Case) e.getSource()).setText("Ravageur Niveau" + def.niveauDefenseur());
}
if(def instanceof Saboteur)
{
((Case) e.getSource()).setText("Saboteur Niveau" + def.niveauDefenseur());
}
break;
}
else
{
JOptionPane jop0 = new JOptionPane();
jop0.showMessageDialog(null, "Votre défenseur n'a pas assez d'expérience pour augmenter de niveau", "Erreur", JOptionPane.ERROR_MESSAGE);
}
}
}
}
}
else
{
JOptionPane jop1 = new JOptionPane();
jop1.showMessageDialog(null, "action de votre part non valable", "Erreur", JOptionPane.ERROR_MESSAGE);
}
}
}
}
else
{
JOptionPane jop2 = new JOptionPane();
jop2.showMessageDialog(null, "Bourse insufisante ou action de votre part non valable", "Erreur", JOptionPane.ERROR_MESSAGE);
}
}
else
{
JOptionPane jop3 = new JOptionPane();
jop3.showMessageDialog(null, "action de votre part non valable", "Erreur", JOptionPane.ERROR_MESSAGE);
}
}
}
---------------------------------------------------------------------------------------------------------
Classe Test:
import javax.swing.SwingUtilities;
public class Test
{
static Runnable tache = new Runnable()
{
@SuppressWarnings("unused")
public void run()
{
Fenetre fen = new Fenetre();
}
};
public static void main(String[] args)
{
SwingUtilities.invokeLater(tache);
}
}
Je rencontre un problème dans l'exécution de mon code java qui a pour but la conception d'un jeu de type tower-defense, alors mon problème est que lorsque je compile mon code, les cases ne s'affichent pas automatiquement, je suis obligé de déplacer mon curseur sur chaque case pour les afficher, de même lorsqu'une fenêtre de dialogue s'affiche, les cases derrières elles partent et je dois redéplacer le curseur sur elles pour les afficher. J'ai tenter plusieurs choses en essayent d'intégrer un invokelater pour voir si le problème venait du temps de chargement, j'ai utilisé des fonctions repaint() et modifier l'ordre de mon code, mais rien n'y fait j'ai toujours ce probleme, pouvez-vous m'indiquer si vous le savez la marche à suivre s'il vous plait, je vous met ci-joint les classes entierements ecrites qui semblent poser probleme vu que je suis bloqué depuis deux semaines sur le meme probleme, sachant qu'il reste des classes assaillants et defenseurs mais qui ne semblent pas etre le probleme, MERCI
Classe fenetre:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Fenetre extends JFrame
{
private static final long serialVersionUID = 1L;
public static Case[][] cases;
public static boolean treve = false;
public static char vie = 'a';
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("Menu");
JMenuItem aide = new JMenuItem("Aide");
JMenuItem fermer = new JMenuItem("Fermer");
public Fenetre()
{
super("Tower Defense");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JFrame.setDefaultLookAndFeelDecorated(true);
this.setPreferredSize(new Dimension(1200, 800));
this.setResizable(false);
this.menu.add(fermer);
this.menu.add(aide);
this.menuBar.add(menu);
this.setJMenuBar(menuBar);
fermer.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
System.exit(0);
}
});
aide.addActionListener(new ActionListener(){
@SuppressWarnings("static-access")
public void actionPerformed(ActionEvent arg0) {
JOptionPane regle = new JOptionPane();
regle.showMessageDialog(null, "Caracteristiques des Defenseurs:\n\n- Ravageur: a une grande porté de dégat.\n- Saboteur: Donne des malus aux ennemies.\n- Attaquant: a un grand taux de dégat.\n\n\nCaracteristiques des Assaillants:\n\n- Mage Blanc: Peut se régénérer.\n- Mercenaire: Assailant standard avec plus de points de vie.\n- Ninja: Se déplace plus rapidement.\n ", "Aide", JOptionPane.INFORMATION_MESSAGE);
}
});
JPanel panBoutons = new JPanel();
GridLayout gl = new GridLayout(13, 7);
panBoutons.setLayout(gl);
Fenetre.cases = TerrainDeJeu.creationTerrain();
TerrainDeJeu.afficheTerrain(Fenetre.cases, panBoutons);
this.add(panBoutons, BorderLayout.CENTER);
JPanel goPan = new JPanel();
JButton goBouton = new JButton("Commencer");
goBouton.addActionListener(new ActionListener(){
@SuppressWarnings("static-access")
public void actionPerformed(ActionEvent arg0)
{
final int XP = 2;
Fenetre.treve = false;
if(Defenseur.temps == -1)
{
((JButton)arg0.getSource()).setText("Suivant");
JOptionPane jop1 = new JOptionPane();
jop1.showMessageDialog(null, " Bienvenue dans Tower Defense!\n Il vous faut placer deux défenseurs sur le terrain avant de commencer.\n Veuillez cliquer sur un case du terrain pour ajouter un défenseur.", "Lancement du jeu", JOptionPane.INFORMATION_MESSAGE);
}
else
{
if(Defenseur.temps %25 == 0 && Defenseur.temps != 0)
{
Fenetre.vie += 2 ; // grosse augmentation du niveau de vie des assaillants tous les 25 tours
}
if(Assaillant.assaillant.isEmpty())
{
// on remplit l'ArrayList D'assaillants = création d'une nouvelle vague
Fenetre.vie += 1;
Assaillant.numeroZero(); // sert à réinitialiser la variable statique 'numero' (et donc la variable id) de la classe Assaillant ---> sert pour plus loin dans le code...
for(int i = 0; i < 4; i++)
{
double type = Math.random();
if(type < 0.33)
{
Mercenaire mercenaire = new Mercenaire(Fenetre.vie);
Assaillant.assaillant.add(mercenaire);
}
if(type > 0.33 && type < 0.66)
{
MageBlanc mageBlanc = new MageBlanc(Fenetre.vie);
Assaillant.assaillant.add(mageBlanc);
}
if(type > 0.66)
{
Ninja ninja = new Ninja(Fenetre.vie);
Assaillant.assaillant.add(ninja);
}
}
if(Defenseur.temps != 0)
{
Fenetre.treve = true;
JOptionPane pause = new JOptionPane();
pause.showMessageDialog(null, "Phase de trève, vous possédez " + Defenseur.getBourse() + " gils, vous pouvez au choix:\n Acheter un défenseur (200 gils)\n Augmenter le niveau d'un défenseur (100 gils)\n Déblayer une case encombrée (100 gils)\n\n Pour reprendre le jeu, il vous suffit de cliquer sur 'suivant'", "Trève", JOptionPane.INFORMATION_MESSAGE);
}
}
if(Fenetre.treve == false) // sinon, si ArrayList non vide,
{
Assaillant assFin = Assaillant.assaillantFin(Assaillant.assaillant, Fenetre.cases); // on regarde si un Assaillant s'apprête à se trouver sur la sortie lors du prochain déplacement.
if(Assaillant.assaillant.contains(assFin)) // si oui,
{
Fenetre.cases[assFin.getAbsX()][assFin.getOrdY()].setText(" "); // on met un "espace libre" à la place du caractère vie de l'assaillant,
Assaillant.assaillant.remove(assFin); // on le supprime de l'ArrayList,
Defenseur.ptsDeVieJoueur -= 1; // et on retire 1 point de vie au joueur.
if(Defenseur.ptsDeVieJoueur <= 0) // si plus de points de vie, on sort la boucle de condition 'tant que points de vie joueur > 0'
{
JOptionPane perdu = new JOptionPane();
perdu.showMessageDialog(null, " Vous avez perdu!", "Game Over", JOptionPane.INFORMATION_MESSAGE);
System.exit(0);
}
}
for(Assaillant assaillant : Assaillant.assaillant)
{
int timedeplace = 0;
int vitDeplace = assaillant.getVitDeplace(); // retourne la vitesse de déplacement de l'assaillant en question
if(assaillant instanceof Ninja)
{
if(assaillant.getEtat() != "boulet")
{
vitDeplace *= 2;
}
}
while(vitDeplace > timedeplace) // cette condition est nécessaire car elle évite des déplacements hors zone ou des "colisions" entre deux vagues d'assaillants de type différent.
{ // car la variable vitDeplace va varier plus tard selon le type d'assaillants
assaillant.changeDirection(); // on vérifie si l'assaillant doit changer de direction de déplacement
if(Fenetre.cases[assaillant.getAbsX() + assaillant.getVecteurX()][assaillant.getOrdY() + assaillant.getVecteurY()].getText() == " ") // vérifie qu'il n'y a pas un autre assaillant devant lui
{
if(Fenetre.cases[assaillant.getAbsX()][assaillant.getOrdY()].getText() != "+") // pour ne pas effacer le '+' du terrain, les assaillants apparaissent véritablement sur la 2nde case de déplacement
{
Fenetre.cases[assaillant.getAbsX()][assaillant.getOrdY()].setText(" "); // mets un espace là où l'assaillant se trouve
}
assaillant.deplaceAssaillant(); // déplace l'assaillant
if(assaillant instanceof Mercenaire)
{
Fenetre.cases[assaillant.getAbsX()][assaillant.getOrdY()].setText("Mercenaire (" + Character.toString(assaillant.vieAssaillant()) + ")"); // place l'assaillant (son caractère) sur la terrain (tableau de caractères)
}
if(assaillant instanceof MageBlanc)
{
Fenetre.cases[assaillant.getAbsX()][assaillant.getOrdY()].setText("Mage Blanc (" + Character.toString(assaillant.vieAssaillant()) + ")"); // place l'assaillant (son caractère) sur la terrain (tableau de caractères)
}
if(assaillant instanceof Ninja)
{
Fenetre.cases[assaillant.getAbsX()][assaillant.getOrdY()].setText("Ninja (" + Character.toString(assaillant.vieAssaillant()) + ")"); // place l'assaillant (son caractère) sur la terrain (tableau de caractères)
}
}
vitDeplace--; // décrémentation jusqu'à atteindre 0;
}
}
for(Defenseur defenseur : Defenseur.defenseur)
{
int latence = defenseur.getLatence(); // récupère la latence du défenseur
Assaillant choixAssaillant = defenseur.bonChoix(Assaillant.assaillant); // retourne les caractéristiques de l'assaillant à attaquer (ou assaillant(' ') si aucun assaillant à portée)
if((choixAssaillant.vieAssaillant() == ' ') || (latence > 0)) // s'il n'y pas d'assaillants à portée du défenseur, ou si le temps de latence n'est pas arrivé à 0
{
defenseur.setLatenceDown(); // on diminue le temps de latence
continue; // et on passe directement à l'autre défenseur
}
int objet = 0;
for(Assaillant assaillant : Assaillant.assaillant)
{
if(assaillant == choixAssaillant)
{
Assaillant.assaillant.set(objet, choixAssaillant); // on change le bon assaillant par choixAssaillant,
break; // et on quitte la boucle dès qu'on a trouvé le bon assaillant
}
objet++;
}
defenseur.attaqueAssaillant(Fenetre.cases, choixAssaillant); // attaque le bon assaillant
defenseur.setLatenceUp(); // on remet le temps de latence à 2 (fixe...)
if(choixAssaillant.tue())
{
Defenseur.gagneArgent(); // le joueur gagne 50 gils,
defenseur.modifExp(XP); // le défenseur qui a tué l'assailant gagne 2 points d'expérience,
Fenetre.cases[choixAssaillant.getAbsX()][choixAssaillant.getOrdY()].setText(" "); // on met un espace là où se trouve l'assaillant,
Assaillant.assaillant.remove(choixAssaillant); // et on le supprime de l'ArrayList Assaillant.
}
}
if(Defenseur.temps >= 199) // si le joueur tient 200 tours (pour info, il faut environ 15 tours pour qu'un assaillant puisse atteindre la sortie et donc réduire les points de vie de 1)
{
JOptionPane gagne = new JOptionPane();
gagne.showMessageDialog(null, "Bravo! Vous avez gagne!", "Felicitations!", JOptionPane.INFORMATION_MESSAGE); // alors il a gagné!
System.exit(0);
}
}
}
Defenseur.temps++; // incrémentation du tour de jeu
}
});
goPan.add(goBouton);
this.add(goPan, BorderLayout.PAGE_END);
this.pack();
this.setVisible(true);
}
}
------------------------------------------------------------------------------------------------------
Classe Case:
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class Case extends JButton implements ActionListener
{
private static final long serialVersionUID = 1L;
private int x;
private int y;
public Case(String s, int x, int y, Color color)
{
super(s);
this.x = x;
this.y = y;
addActionListener(this);
setBackground(color);
}
public int getX()
{
return x;
}
public int getY()
{
return y;
}
public String toString()
{
return "Case de coordonnees (" + x + ", " + y + ")";
}
@SuppressWarnings("static-access")
public void actionPerformed(ActionEvent e)
{
if(Fenetre.treve == true || Defenseur.temps == 0)
{
if(Defenseur.bourse >= 100)
{
if(((Case) e.getSource()).getText() == ".")
{
if(Defenseur.bourse >= 200)
{
int x = ((Case) e.getSource()).getX();
int y = ((Case) e.getSource()).getY();
String[] type = {"Attaquant", "Ravageur", "Saboteur"};
JOptionPane jopType = new JOptionPane();
String nom = (String)jopType.showInputDialog(null, "Veuillez indiquer le type du défenseur", "Choix du type", JOptionPane.QUESTION_MESSAGE, null, type, type[0]);
if(nom == "Attaquant")
{
Attaquant attaquant0 = new Attaquant(x, y);
((Case) e.getSource()).setText("Attaquant Niveau" + attaquant0.niveauDefenseur());
Defenseur.bourse -= 200;
Defenseur.defenseur.add(attaquant0);
jopType.showMessageDialog(null, "Vous venez de créer un " + nom + "!", "Et hop!", JOptionPane.INFORMATION_MESSAGE);
}
if(nom == "Ravageur")
{
Ravageur ravageur0 = new Ravageur(x, y);
((Case) e.getSource()).setText("Ravageur Niveau" + ravageur0.niveauDefenseur());
Defenseur.bourse -= 200;
Defenseur.defenseur.add(ravageur0);
jopType.showMessageDialog(null, "Vous venez de créer un " + nom + "!", "Et hop!", JOptionPane.INFORMATION_MESSAGE);
}
if(nom == "Saboteur")
{
Saboteur saboteur0 = new Saboteur(x, y);
((Case) e.getSource()).setText("Saboteur Niveau" + saboteur0.niveauDefenseur());
Defenseur.bourse -= 200;
Defenseur.defenseur.add(saboteur0);
jopType.showMessageDialog(null, "Vous venez de créer un " + nom + "!", "Et hop!", JOptionPane.INFORMATION_MESSAGE);
}
}
else
{
JOptionPane jop = new JOptionPane();
jop.showMessageDialog(null, "Bourse insuffisante pour effectuer cette action", "Erreur", JOptionPane.ERROR_MESSAGE);
}
}
else
{
if(((Case) e.getSource()).getText() == "#")
{
if(Defenseur.temps > 0)
{
((Case) e.getSource()).setText(".");
((Case) e.getSource()).setBackground(Color.ORANGE);
Defenseur.bourse -= 100;
}
}
else
{
if(Defenseur.temps > 0)
{
int x = ((Case) e.getSource()).getX();
int y = ((Case) e.getSource()).getY();
if(Fenetre.cases[x][y].getText() != "$" && Fenetre.cases[x][y].getText() != "#" && Fenetre.cases[x][y].getText() != " " && Fenetre.cases[x][y].getText() != ".")
{
Defenseur defenseur1 = new Defenseur(x, y);
Defenseur.numero --;
for(Defenseur def: Defenseur.defenseur)
{
if(def.getAbsX() == defenseur1.getAbsX() && def.getOrdY() == defenseur1.getOrdY())
{
if(def.getExperience() >= 6)
{
if(def instanceof Attaquant)
{
def.monteeNiveau();
((Case) e.getSource()).setText("Attaquant Niveau" + def.niveauDefenseur());
}
if(def instanceof Ravageur)
{
def.monteeNiveau();
((Case) e.getSource()).setText("Ravageur Niveau" + def.niveauDefenseur());
}
if(def instanceof Saboteur)
{
((Case) e.getSource()).setText("Saboteur Niveau" + def.niveauDefenseur());
}
break;
}
else
{
JOptionPane jop0 = new JOptionPane();
jop0.showMessageDialog(null, "Votre défenseur n'a pas assez d'expérience pour augmenter de niveau", "Erreur", JOptionPane.ERROR_MESSAGE);
}
}
}
}
}
else
{
JOptionPane jop1 = new JOptionPane();
jop1.showMessageDialog(null, "action de votre part non valable", "Erreur", JOptionPane.ERROR_MESSAGE);
}
}
}
}
else
{
JOptionPane jop2 = new JOptionPane();
jop2.showMessageDialog(null, "Bourse insufisante ou action de votre part non valable", "Erreur", JOptionPane.ERROR_MESSAGE);
}
}
else
{
JOptionPane jop3 = new JOptionPane();
jop3.showMessageDialog(null, "action de votre part non valable", "Erreur", JOptionPane.ERROR_MESSAGE);
}
}
}
---------------------------------------------------------------------------------------------------------
Classe Test:
import javax.swing.SwingUtilities;
public class Test
{
static Runnable tache = new Runnable()
{
@SuppressWarnings("unused")
public void run()
{
Fenetre fen = new Fenetre();
}
};
public static void main(String[] args)
{
SwingUtilities.invokeLater(tache);
}
}
A voir également:
- Probleme affichage java
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel - Télécharger - Jeux vidéo
- Eclipse java - Télécharger - Langages
- Java apk - Télécharger - Langages
- Waptrick java voiture - Télécharger - Jeux vidéo
2 réponses
À quoi ça sert de nous donner autant de code alors qu'il en manque encore !?
Soit tu donnes tout pour qu'on compile chez nous, soit tu donnes juste ce qu'il faut pour regarder le problème, mais là c'est fouillis !
"les cases ne s'affichent pas automatiquement, je suis obligé de déplacer mon curseur sur chaque case pour les afficher, de même lorsqu'une fenêtre de dialogue s'affiche, les cases derrières elles partent et je dois redéplacer le curseur sur elles pour les afficher."
Je pense à deux types d'erreurs (mais il peut y en avoir d'autres)
1) tu modifies tes fenêtres (en ajoutant des composants) sans les réactualiser, ce qui arrive lorsque le setVisible(true) intervient trop tôt, pour cela tu peux utiliser la méthode updateUI()
2) tu as redéfinis des méthodes héritées (paint par exemple) sans faire à la méthode de la super-classe.
Exemples :
Soit tu donnes tout pour qu'on compile chez nous, soit tu donnes juste ce qu'il faut pour regarder le problème, mais là c'est fouillis !
"les cases ne s'affichent pas automatiquement, je suis obligé de déplacer mon curseur sur chaque case pour les afficher, de même lorsqu'une fenêtre de dialogue s'affiche, les cases derrières elles partent et je dois redéplacer le curseur sur elles pour les afficher."
Je pense à deux types d'erreurs (mais il peut y en avoir d'autres)
1) tu modifies tes fenêtres (en ajoutant des composants) sans les réactualiser, ce qui arrive lorsque le setVisible(true) intervient trop tôt, pour cela tu peux utiliser la méthode updateUI()
2) tu as redéfinis des méthodes héritées (paint par exemple) sans faire à la méthode de la super-classe.
Exemples :
public void ajout(JPanel panel, JComponent component) { panel.add(component); panel.updateUI(); // nécessaire si "panel" est déjà affiché } public void paint(Graphics g) { super.paint(g); // Important dans la plupart des méthodes redéfinies ... }
J'ai largement bien expliqué ce qui se passait lors de l'affichage de la fenêtre, mon problème concerne juste l'affichage du début, pas le jeu en lui même (qui marche très bien); Je suis juste là pour demander conseil et essayer vos solutions, vous n'avez pas besoin du code pour compiler.
Concernant votre première solution, je n'ai jamais utilisé de updateUI(); mais j'ai déjà essayé de rendre mon panel de boutons visible à la toute fin en mettant un setVisible(false) avant de rajouter les boutons à mon panel.
Je n'ai jamais redéfini paint() en fait, j'ai juste tenté de l'utiliser vite fait pour un test mais sans succès.
Les seules méthodes redéfinies dans mon jeu sont des méthodes pour des soustypes d'assaillant et des soustypes de défenseurs, mais mon problème d'affichage était là bien avant.
Je précise également que les deux lignes suivantes:
Fenetre.cases = TerrainDeJeu.creationTerrain();
TerrainDeJeu.afficheTerrain(Fenetre.cases, panBoutons);
remplissent le tableau cases d'objets de type Case et que afficheTerrain ajoute ces objets au panel panBoutons.
Concernant votre première solution, je n'ai jamais utilisé de updateUI(); mais j'ai déjà essayé de rendre mon panel de boutons visible à la toute fin en mettant un setVisible(false) avant de rajouter les boutons à mon panel.
Je n'ai jamais redéfini paint() en fait, j'ai juste tenté de l'utiliser vite fait pour un test mais sans succès.
Les seules méthodes redéfinies dans mon jeu sont des méthodes pour des soustypes d'assaillant et des soustypes de défenseurs, mais mon problème d'affichage était là bien avant.
Je précise également que les deux lignes suivantes:
Fenetre.cases = TerrainDeJeu.creationTerrain();
TerrainDeJeu.afficheTerrain(Fenetre.cases, panBoutons);
remplissent le tableau cases d'objets de type Case et que afficheTerrain ajoute ces objets au panel panBoutons.