JFrame et Panel(Débutant)

Ce topic a été résolu
kinginventeur

kinginventeur Le 5 mars 2017 à 23:08 (Édité le 25 janvier 2019 à 17:53)

Bonsoir/Bonjour à tous,

Alors voila j'ai un soucis avec mon système , voici le code :

import javax.swing.JFrame;
public class Game extends JFrame{
private static final long serialVersionUID = -4120356161430410428L;
   public static final String name = "MyGame";
   public static final int width = 400;
   public static final int height = 500;
   public static final int width_player = 50;
   public static final int height_player = 50;
   
   public static boolean right = false;
   public static boolean left = false;
   private Panel panel = new Panel();
   
   public Game(){setup();}
   
   public static void main(String[] args) {
      Game game = new Game();
      game.run();
   }
   
   public void setup(){
      setTitle(name);
      setResizable(false);
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setLocationRelativeTo(null);
      setSize(width, height);
      setContentPane(panel);
      addKeyListener(new Key());
      setVisible(true);
   }
   
   public void run(){
      while(true){
         if(right && panel.getX() <= width - 50){panel.setX(panel.getX() + 1);}
         else if(left && panel.getX() >= 0){panel.setX(panel.getX() - 1);}
         panel.repaint();
         
         try {
            Thread.sleep(5);
         } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
         }
      }
   }
   
   
}

Ceci est la classe principale ensuite :

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class Key implements KeyListener{
   @Override
   public void keyPressed(KeyEvent e) {action(e.getKeyCode(), true);}
   @Override
   public void keyReleased(KeyEvent e) {action(e.getKeyCode(), false);}
   public void keyTyped(KeyEvent e) {}
   
   public void action(int code, boolean arg){
      switch(code){
      case 37:
         Game.left = arg;
         break;
      case 39:
         Game.right = arg;
         break;
      }
   }
}
Ceci la classe qui implemente KeyListener et enfin :

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
public class Panel extends JPanel{
private static final long serialVersionUID = 347286094414871436L;
   private int x, y;
   @Override
   public void paintComponent(Graphics g) {
      
      g.setColor(Color.WHITE);
      g.fillRect(0, 0, Game.width, Game.height);
      g.setColor(Color.GREEN);
      g.fillRect(x, y, Game.width_player, Game.height_player);
      
   }
   
   public int getX(){
      return x;
   }
   public int getY(){
      return y;
   }
   public void setX(int x){
      this.x = x;
   }
   public void setY(int y){
      this.y = y;
   }
   
}
Le panel.


Le soucis est que lorsque je bouge mon cube , et bien ... Il y a un mur qui empêche de continuer d'avancé et je ne sais pas pourquoi 😭
TheFlameflo

TheFlameflo Le 7 mars 2017 à 03:14

Salut !

Peux-tu montrer un screenshot qui montre où le cube s'arrête et où il peut bouger et lors de quelle action il bloque ?
Ça peut nous aider à identifier le problème ! 😀
kinginventeur

kinginventeur Le 7 mars 2017 à 13:35

Sa c'est quand le cube je le fais avancer vers la droite : https://cdn.discordapp.com/attachments/286305391904686083/288650562361229314/en_route.PNG

Et quand il passe le mur invisible :

https://cdn.discordapp.com/attachments/286305391904686083/288650728246083584/bloquage.PNG

J'arrive pas a expliquer pourquoi sa fais sa.
kinginventeur

kinginventeur Le 9 mars 2017 à 01:30

Problème résolu.
TheFlameflo

TheFlameflo Le 9 mars 2017 à 03:40

Salut !

Peux-tu donner la solution à ton problème, comme ça, tout le monde peut en profiter et ça évitera aux autres de faire un topic similaire ? 😀

Merci d'avance !
kinginventeur

kinginventeur Le 9 mars 2017 à 14:28

Dans ce code il y a 2 problémes.

Le problème que j'ai citer étais celui-ci :

Il suffisait simplement de ne pas mettre setX et getX car ils sont déjà éxistant dans la classe JPanel. Donc mon programme ne comprenais pas trop et fesais bugé mon carré.
Sois vous modifier les setter et getter par un autre nom ou alors vous les supprimer et mettais vos variable x et y en protected comme j'ai fais pour pouvoir y accéder via la classe principale.

Maintenant j'avais un autre problème que j'ai aussi résolu , dans la classe principale j'avais ce code :

 public void run(){
      while(true){
         if(right && panel.getX() <= width - 50){panel.setX(panel.getX() + 1);}
         else if(left && panel.getX() >= 0){panel.setX(panel.getX() - 1);}
         panel.repaint();
         
         try {
            Thread.sleep(5);
         }
       catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
         }
      }
   }
Dans cette ligne : if(right && panel.getX() <= width - 50){panel.setX(panel.getX() + 1);}

width = 400 donc la largeur de ma fenêtre , grave erreur de faire sa...

Car il prend en compte les bordures , donc mon cube va s'enfoncer de 8 pixels dans le mur je crois.
Mettez plutôt ceci :
if(right && panel.getX() <= panel.getWidth() - width_player ){panel.setX(panel.getX() + 1);}
^^^^^^^^^^^^^^
changement


Et une autre erreur encore sur cette ligne et sur la suivante , si vous avez supprimer le getter du X et bien il y aura pas d'erreur car la function getX existe toujours... N'oubliez pas de le changer sinon sa ne fonctionnera pas donc :

if(right && panel.getX() <= width - 50){panel.setX(panel.getX() + 1);}
^^^^^^^^^^
ici erreur ici
mettez ceci : panel.x

pareil pour lui : else if(left && panel.getX() >= 0){panel.setX(panel.getX() - 1);}
^^^^^^^^^^^^^^^^
panel.x et non panel.getX()

Si j'ai pas été clair hésitez pas a le dire ... Je donnerai mon code source directement si sa peux vous aider.

Mais en gros si vous voulez faire des conditions pour la largeur maximal que le carré peux aller etc... Utilisez plutôt la largeur maximal de votre Panel et non de la JFrame car la JFrame prend en compte les bordures de votre application ...

Tandis que JPanel prend l'intérieur de votre JFrame donc c'est parfait !

kinginventeur

kinginventeur Le 9 mars 2017 à 14:39 (Édité le 9 mars 2017 à 14:53)

Peux pas éditer donc voici la fin :

Une derniére chose que j'ai oublier ... Pour mon calque blanc dans la classe Panel j'ai mis Game.width et Game.height , grave erreur la aussi --' , mettez this.getWidth() et this.getHeight().

Et pour les lignes dans la boucle while quand on ajoute +1 faite panel.x += 1;

Après manque plus qu'a corriger des petits détails car ce code je l'avais fais un peux a la va vite.
kinginventeur

kinginventeur Le 9 mars 2017 à 14:56

Code actuel : Classe principale Game 

import java.awt.Color;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
public class Game extends JFrame{
private static final long serialVersionUID = -4120356161430410428L;
   public static final String Name = "My Game";
   public static final int Width = 400;
   public static final int Height = 500;
   public static final int Width_player = 50;
   public static final int   Height_player = 50;
   public static final Color Color_player = Color.GREEN;
   
   private boolean right = false, left = false;
   private Panel panel = new Panel();
   
   public Game(){setup();}
   
   public static void main(String[] args) {
      Game game = new Game();
      game.run();
   }
   
   private void setup(){
      addKeyListener(new KeyAdapter(){
         private final int Arrow_Left = 37, Arrow_Right = 39;
         @Override
         public void keyPressed(KeyEvent e) {action(e.getKeyCode(), true);}
         @Override
         public void keyReleased(KeyEvent e) {action(e.getKeyCode(), false);}   
         private void action(int code, boolean arg){
            switch(code){
            case Arrow_Left:
               left = arg;
               break;
            case Arrow_Right:
               right = arg;
               break;
            }
         }   
      });
      setSize(Width, Height);
      setResizable(false);
      setTitle(Name);
      setLocationRelativeTo(null);
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setContentPane(panel);
      setVisible(true);
   }
   
   private void run(){
      while(true){
         if(right && panel.x < panel.getWidth() - Width_player){panel.x += 1;}
         else if(left && panel.x > 0){panel.x -= 1;}
         panel.repaint();
         
         try {
            Thread.sleep(5);
         } catch (InterruptedException e) {
            e.printStackTrace();
         }
      }
   }
   
   
}
Classe Panel :

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
public class Panel extends JPanel{
private static final long serialVersionUID = 347286094414871436L;
   protected int x, y;
   
   @Override
   protected void paintComponent(Graphics g) {
      
      rect(0, 0, this.getWidth(), this.getHeight(), Color.WHITE, g); // font WHITE
      rect(x, y, Game.Width_player, Game.Height_player, Game.Color_player, g); // Player
      rect(0, 50, this.getWidth(), 5, Color.RED, g); // Line red
      
   }
   
   private void rect(int x, int y, int w, int h, Color c, Graphics g){
      g.setColor(c);
      g.fillRect(x, y, w, h);
   }
   
}
Voilà 😀
Vous devez être connecté pour poster une réponse. Se connecter ou Créer un compte