IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

NetBeans Java Discussion :

Problème de NullPointerException dans mon Game loop


Sujet :

NetBeans Java

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Problème de NullPointerException dans mon Game loop
    Bonjour à tous, je créé ce topic parce que j'ai un léger soucis sur le fonctionnement sur la game loop de mon projet.
    Voilà, je suis en train de développer une application de type space Invaders mais le JPanel d'affichage du jeu refuse de m'afficher quoique ce soit. ça va faire près de 3 semaines que je m'arrache les cheveux et franchement j'ai pas envie de devenir chauve .

    Je vous mets la classe Abstraite permettant de gérer les Panels appelés dans ma JFrame :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public abstract class ConfigClass {
        protected JPanel panel;
        public ConfigClass(Dimension dim){
            panel = new JPanel();
            panel.setPreferredSize(new Dimension (dim));
        }
     
        public JPanel getPanel(){
            return this.panel;
        }
     
        protected abstract void initPanel();
    Ici voici la classe héritant de Config Class dans laquelle j'appel le contrôleur qui doit afficher la partie de jeu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public class GamePanel extends ConfigClass{
        private PlayerShip playerShip = new PlayerShip();
        private Shot shot1 = new Shot();
     
            public GamePanel(Dimension dim){
                super(dim);
                initPanel();
            }
     
            protected void initPanel(){
                Toolkit tk = Toolkit.getDefaultToolkit();
                Cursor invisCursor = tk.createCustomCursor(tk.createImage(""),new Point(),null);
                panel.setCursor(invisCursor);
                panel.setLayout(new BorderLayout());
                panel.removeAll();
                //panel.add(new DrawGamePanel(new Dimension(panel.getWidth(),panel.getHeight())).getPanel(), BorderLayout.CENTER);
                panel.add(new DrawGamePanel(), BorderLayout.CENTER);
                panel.revalidate();
            }
    }
    Et enfin voici la classe DrawGamePanel, du package Controler, celui ci est composé de toutes les méthodes nécessaires aux calculs et à l'affichage de la game loop. et c'est dans celle-ci que j'ai mon problème.
    J'obtient un nullPointException sur l'objet Graphics g à la seconde ligne de la méthode drawScreen.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    public final class DrawGamePanel extends JPanel implements MouseMotionListener{
     
        private PlayerShip player;
        private EnnemiesShip enemy;
        private Shot shot;
        private BufferedImage buffer;
     
        public DrawGamePanel(){
            setIgnoreRepaint(true);
            addMouseMotionListener(this);
            setFocusable(true);
            Initialize();
     
            while (true){
                try{
                    update();
                    checkCollisions();
                    drawBuffer();
                    this.drawScreen();
                    Thread.sleep(15);
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
        }
        public void Initialize(){
            buffer  = new BufferedImage(800,600,BufferedImage.TYPE_INT_RGB);
            player  = new PlayerShip();
            enemy   = new EnnemiesShip();
            shot    = new Shot();
        }
        public void update(){
     
        }
        public void checkCollisions(){
            if(player.getBounds().intersects(enemy.getBounds())){
                player.collision = true;
            }else{
                player.collision = false;
            }
        }
        public void drawBuffer(){
         Graphics2D b = buffer.createGraphics();
            b.setColor(Color.black);
            b.fillRect(0, 0, 800, 600);
            if (player.collision == false) {
                b.setColor(Color.red);
                b.fillRect(player.getXPosition(), player.getYPosition(), player.getWidth(), player.getHeight());
                b.setColor(Color.blue);
                b.fillRect(enemy.getXPosition(), enemy.getYPosition(), enemy.getWidth(), enemy.getHeight());
                b.dispose();
            } else {
                b.setColor(Color.white);
                b.drawString("C O L L I S I O N !", 350, 300);
                b.dispose();
            }
        }
         public void drawScreen() {
            Graphics2D g = (Graphics2D) this.getGraphics();
            g.drawImage(buffer, 0, 0, this);
            Toolkit.getDefaultToolkit().sync();
            g.dispose();
        }
     
        public void startGame() {
        }
     
        public void mouseDragged(MouseEvent me) {}
     
        public void mouseMoved(MouseEvent me) {
            player.setXPosition(me.getX()-25);
            player.setYPosition(me.getY()-25);
        }
     
    }
    Si vous avez besoin du code complet demandez moi, je vous l'enverrai.

    En espérant que vous puissiez m'aider.

    Merci d'avance.

  2. #2
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 816
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 816
    Points : 7 648
    Points
    7 648
    Par défaut
    Salut,

    à mon avis, tu essaies de faire afficher quelque chose à ton JPanel alors qu'il n'a pas encore initialisé son contexte graphique. Donc teste si ton graphics2D est null ou pas, et si il ne l'est pas continue sur le traitement.

    Ensuite, tu devrais virer ta boucle while(true) du constructeur, sinon tu bloques tout (dont l'initialisation graphique). Crée un thread spécifique, et lance-le en parallèle.

    Et accessoirement... bienvenue parmi nous!

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci pour l'infos.
    En effet mon objet Graphics2D g vaut null lorsque que je l'appel pour dessiner ma buffered dans DrawScreen.

    J'ai afficher, dans cette boucle les valeurs de g, buffer et this.

    J'ai donc codé cette partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     public void drawScreen() {
            Graphics2D g = (Graphics2D) this.getGraphics();
            System.out.println(g);
            System.out.println(buffer);
            System.out.println(this);
            g.drawImage(buffer, 0, 0, this);
            Toolkit.getDefaultToolkit().sync();
            g.dispose();
        }
    J'ai obtenu un "this" et un "buffer" non null, cependant, g lui, était bien nul.
    Après, je me suis dis, que je créais l'un contexte graphique pour ma BufferedImage Buffer, j'ai donc changé mon code en ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     public void drawScreen() {
            Graphics2D g = (Graphics2D) buffer.getGraphics();
            System.out.println(g);
            System.out.println(buffer);
            System.out.println(this);
            g.drawImage(buffer, 0, 0, this);
            Toolkit.getDefaultToolkit().sync();
            g.dispose();
        }
    Et là, ma console, me dit que mon objet Graphics2D g n'est plus null, mais au lieu de m'afficher mon nouveau JPanel avec "l'air de jeu", je reste à mon écran de menu.

    Si tu as une idée d'où cela peut venir?
    Ah, et une petite idée de l'implémentation de mon thread? Interne à ma classe ou dans une classe externe?
    PS, merci pour la bienvenue.

  4. #4
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 816
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 816
    Points : 7 648
    Points
    7 648
    Par défaut
    Citation Envoyé par F3nr1r Voir le message
    cependant, g lui, était bien nul.
    Ouais, bon, bref, en gros tu as vérifié que le compilateur ne racontait pas de bêtise!

    Citation Envoyé par F3nr1r Voir le message
    Et là, ma console, me dit que mon objet Graphics2D g n'est plus null, mais au lieu de m'afficher mon nouveau JPanel avec "l'air de jeu", je reste à mon écran de menu.
    Ben... tu viens d'afficher ton aire de jeu dans le buffer de l'image de ton aire de jeu... en gros tu as dessiné ton image sur ton image. Donc normal que le JPanel ne change pas, tu n'y a rien mis.

    Citation Envoyé par F3nr1r Voir le message
    Ah, et une petite idée de l'implémentation de mon thread? Interne à ma classe ou dans une classe externe?
    Comme tu veux, ça revient au même. Soit tu la fais interne et elle aura accès directement au JPanel, soit tu la fais externe et tu passe le JPanel en paramètre au constructeur du thread (quand j'ai testé sur ton code, je l'ai faite en interne)

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par plegat Voir le message
    Ouais, bon, bref, en gros tu as vérifié que le compilateur ne racontait pas de bêtise!
    Ouai, c'est à peu près ça

    Aurais-tu le code de ton Thread s'il te plait, je sèche un peu là, je n'ai du utiliser les threads qu'une seule fois et j'ai mauvaise mémoire .

  6. #6
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 816
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 816
    Points : 7 648
    Points
    7 648
    Par défaut
    Citation Envoyé par F3nr1r Voir le message
    Aurais-tu le code de ton Thread s'il te plait, je sèche un peu là, je n'ai du utiliser les threads qu'une seule fois et j'ai mauvaise mémoire .
    Non, parti à la poubelle...

    Tu fais une classe qui étend Thread, tu balances ta boucle while(true) actuelle dans la méthode start(), et tu appelles sa méthode run() dans le constructeur de ton JPanel pour lancer le thread.
    La doc sur les threads pululle... ici par exemple...

Discussions similaires

  1. Problème de blending dans mon motion blur
    Par dams32 dans le forum OpenGL
    Réponses: 13
    Dernier message: 07/04/2007, 21h28
  2. Problème de height dans mon conteneur
    Par darcy dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 19/12/2006, 10h37
  3. [C# 2.0] Problème de DLL dans mon site web
    Par Rodie dans le forum ASP.NET
    Réponses: 2
    Dernier message: 04/12/2006, 17h43
  4. Problème d'affichage dans mon état
    Par gontrand16 dans le forum Access
    Réponses: 6
    Dernier message: 05/07/2006, 21h29
  5. Problème de paramètres dans mon code javascript
    Par cocacollection dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 15/03/2006, 11h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo