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

2D Java Discussion :

[Debutant] Animation sprite


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 150
    Par défaut [Debutant] Animation sprite
    Bonjour ,

    Mon programme est simple , c'est une interface graphique avec un sprite qui marche.
    J'ai une erreur que je n'arrive pas a identifier dans mon programme, a chaque fois il me balance à l'excution :
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at robotGraphique.graphicalRenderer(robotGraphique.java:104)
    at robotGraphique$1.windowOpened(robotGraphique.java:55)
    at java.awt.Window.processWindowEvent(Window.java:1187)
    at javax.swing.JFrame.processWindowEvent(JFrame.java:266)
    at java.awt.Window.processEvent(Window.java:1148)
    at java.awt.Component.dispatchEventImpl(Component.java:3955)
    at java.awt.Container.dispatchEventImpl(Container.java:2024)
    at java.awt.Window.dispatchEventImpl(Window.java:1774)
    at java.awt.Component.dispatchEvent(Component.java:3803)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
     
    import java.awt.*;
    import java.awt.image.*;
    import java.awt.event.*;
    import javax.swing.*;
     
    public class robotGraphique implements KeyListener{
    	//nom des fichiers sprites a charger
    	private static final String strImgMove = "024.png";
    	private static final String strImgDie = "dead.png";
     
     
    	//Index des images de deplacement du robot
    	private static final int IMG_DOWN = 0;
    	private static final int IMG_LEFT = 1;
    	private static final int IMG_RIGHT = 2;
    	private static final int IMG_UP = 3;
     
    	//coordonées maximum du robot
    	private final static int MAX_HEIGHT=520;
    	private final static int MIN_HEIGHT=200;
    	private final static int MAX_WIDTH=740;
    	private final static int MIN_WIDTH=0;
     
    	//coordonnée du robot
    	private int x=MAX_WIDTH/2;
    	private int y=MAX_HEIGHT/2;
     
    	private BufferStrategy strategy;
    	private Graphics buffer;
    	private Image[][] imgTab;
    	private Image img;
    	private Image imgDie;
    	private JFrame fenetre;
    	private MediaTracker MT;
     
     
    	public robotGraphique(){
    		imgTab = new Image[4][4];
     
    		//On creer une nouvelle fenetre
    		fenetre = new JFrame("Controle robot");
    		//On lui definit un fond d'ecran gris
    		fenetre.setBackground(Color.GRAY);
    		//On récupére la taille de l'ecran
    		Dimension dimEcran = Toolkit.getDefaultToolkit().getScreenSize();
    		fenetre.setSize(800,600);
    		//On definit la place de la fenetre sur l'ecran
    		fenetre.setLocation((dimEcran.width-800)/2,(dimEcran.height-600)/2);
    		//On la rend visible
    		fenetre.setVisible(true);
    		//On ajoute le KeyListener et WindowListener
    		fenetre.addWindowListener(new WindowAdapter(){
          			public void windowClosing(WindowEvent evt){fenetre.dispose();}
          			public void windowActivated(WindowEvent evt){graphicalRenderer();}
          			public void windowOpened(WindowEvent e){graphicalRenderer();}
           			public void windowClosed(WindowEvent evt){System.exit(0);}}
           		);
    		fenetre.addKeyListener(this);
    		//On gére nous meme l'affichage
    		fenetre.setIgnoreRepaint(true);
    		//Mise en place du buffering
    		fenetre.createBufferStrategy(2);
    		strategy = fenetre.getBufferStrategy();
    		//On charge les images dans le buffer
    		imageLoad();
    		//On verifie que les images soient chargées
    		if(MT.checkAll()==false)
    			System.exit(-48000);
    		graphicalRenderer();
    	}
     
    	public static void main(String args[]){
    		new robotGraphique();
    	}
     
    	private void imageLoad(){
    		int index=0;
    		CropImageFilter c;
    		MT =new MediaTracker(fenetre);
    		//On charge notre image
    		img = Toolkit.getDefaultToolkit().getImage(strImgMove);
    		for(int ligne=0;ligne<4;ligne++){
    			for(int col=0;col<4;col++){
    				c = new CropImageFilter(32*col,48*ligne,32,48);
    				imgTab[ligne][col] =fenetre.createImage(
    				new FilteredImageSource(img.getSource(), c));
    				//ajoute l'image au media tracker [index est une reference sur l'image dans MT]
    				MT.addImage(imgTab[ligne][col],index);
    			}
    		}
    		img = Toolkit.getDefaultToolkit().getImage(strImgDie);
    		c = new CropImageFilter(0,0,32,48);
    		img = imgDie = fenetre.createImage(
    		new FilteredImageSource(img.getSource(), c));
    		MT.addImage(imgDie,index);
    		try {
    			MT.waitForAll();
    		} catch (InterruptedException e) {
    			System.out.println("MT.waitForAll() "+e);
    		}
    	} 
     
    	public void graphicalRenderer(){
    		buffer = strategy.getDrawGraphics();
    		buffer.setColor(Color.LIGHT_GRAY);
    		buffer.fillRect(0,0,800,600);
    		buffer.drawImage(img,x,y,null);
    		strategy.show();
    	}
     
    	public void keyPressed(KeyEvent key){
     
    	}
     
    	public void keyReleased(KeyEvent key){
    		deplace(key.getKeyCode());
    	}
     
    	public void keyTyped(KeyEvent key){}
     
     
    	public void deplace(int keyValue){
    		int i=0;
    		switch(keyValue){
    			case 37:{	
    				do{
    					i++; if(i==4) i=0;
    					try{
    						img = imgTab[IMG_LEFT][i];
    						x-=2;
    						if(x<MIN_WIDTH)
    							x=MIN_WIDTH;				
    						Thread.sleep(125);
    						graphicalRenderer();
    					}catch(Exception e){
    						System.out.println("MOVE LEFT : "+e);
    					}
    				}while(i!=0);
    				break;			
    			}
     
    			case 38:{
    				do{
    					i++; if(i==4) i=0;
    					try{
    						img = imgTab[IMG_UP][i];
    						y-=2;
    						if(y<MIN_HEIGHT)
    							y=MIN_HEIGHT;
    						Thread.sleep(125);
    						graphicalRenderer();
    					}catch(Exception e){
    						System.out.println("MOVE UP : "+e);
    					}
    				}while(i!=0);
    				break;
    			}
     
    			case 39:{
    				do{
    					i++; if(i==4) i=0;
    					try{
    						img = imgTab[IMG_RIGHT][i];
    						x+=2;
    						if(x>MAX_WIDTH)
    							x=MAX_WIDTH;
    						Thread.sleep(125);
    						graphicalRenderer();
    					}catch(Exception e){
    						System.out.println("MOVE RIGHT : "+e);
    					}
    				}while(i!=0);
    				break;
    			}
     
    			case 40:{
    				do{
    					i++; if(i==4) i=0;
    					try{
    						img = imgTab[IMG_DOWN][i];
    						y+=2;
    						if(y>MAX_HEIGHT)
    							y=MAX_HEIGHT;
    						Thread.sleep(125);
    						graphicalRenderer();
    					}catch(Exception e){
    						System.out.println("MOVE DOWN : "+e);
    					}
    				}while(i!=0);
    				break;
     
    			}
    			case 35:{	
    				img = imgDie;
    				graphicalRenderer();
    			}	
    		}
     
    	}
     
    }

  2. #2
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Bonjour,
    ton probleme vient de l'ordre des appels dans le constructeur. Il faudrait plutot faire dans cet ordre là :
    - créer BufferStrategy (et tout ce qui est lié)
    - ajouter le windowListener
    - rendre visible

    En fait, lorsque tu appelles setVisible(true), le thread graphique (tg) se met en concurrence avec le thread qui exécute le constructeur (tc). Les choses se passent dans cet ordre là :
    - tc ajoute le windowListener
    - tg rend la fenetre visible
    - tg exécute windowOpened
    - tg appelle strategy.Blabla
    - tc initialise strategy

    Forcément, tg accède à strategy alors qu'elle n'est pas initialisée -> NullPointerException.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

Discussions similaires

  1. Problème animation sprite
    Par Edouard Kaiser dans le forum OpenGL
    Réponses: 16
    Dernier message: 28/11/2005, 21h03
  2. [debutant] Animation d'un schema ?
    Par Revan777 dans le forum C++Builder
    Réponses: 3
    Dernier message: 24/05/2005, 12h58
  3. [ Question ] Animer des sprites 3D
    Par Dam)rpgheaven dans le forum OpenGL
    Réponses: 2
    Dernier message: 19/07/2004, 16h14
  4. Réponses: 6
    Dernier message: 23/09/2003, 19h12

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