Partage
  • Partager sur Facebook
  • Partager sur Twitter

Animation d'un perso avec SDL

Sujet résolu
    16 avril 2009 à 9:04:21

    Bonjour à tous :D

    Je suis débutante en programmation et pour essayer de m'améliorer, je me lance dans un petit projet
    (une sorte de zelda). Dans le cas présent, je veux animer un petit sprite (oui il est moche mais je ne suis pas super douée pour le dessin :p ) qui est sensé se déplacer vers la droite. Or le soucis,
    c'est que chaque étape de l'animation reste affichée à l'écran :o .
    Ca donne ceci dans la fenêtre:
    Image utilisateurImage utilisateurImage utilisateurImage utilisateurImage utilisateur ...etc
    J'aimerai savoir comment supprimer dans mon code l'image précédente afin d'obtenir une animation correcte ?


    import sdljava.SDLMain;
    import sdljava.SDLException;
    import sdljava.video.*;
    import sdljava.event.SDLEvent;
    import sdljava.image.SDLImage;
    import java.lang.Enum;
    
    public class anim_sdl {
    	
    	private SDLSurface screen = null;
    	
    	public anim_sdl() throws SDLException, InterruptedException {
    		SDLMain.init(SDLMain.SDL_INIT_VIDEO);
    		
    		screen = SDLVideo.setVideoMode(640, 480, 32, SDLVideo.SDL_DOUBLEBUF | SDLVideo.SDL_HWSURFACE);
    		SDLVideo.wmSetCaption("The cute dwarf", null);
    		
    		String [] tab_anim;	  //chargement des images du sprite dans un tableau
    		tab_anim = new String [8];
    		tab_anim[0]= "images/anim_marche_vers_droite/cote_droit0.png";		
    		tab_anim[1]= "images/anim_marche_vers_droite/cote_droit1.png";
    		tab_anim[2]= "images/anim_marche_vers_droite/cote_droit2.png";
    		tab_anim[3]= "images/anim_marche_vers_droite/cote_droit3.png";
    		tab_anim[4]= "images/anim_marche_vers_droite/cote_droit4.png";
    		tab_anim[5]= "images/anim_marche_vers_droite/cote_droit5.png";
    		tab_anim[6]= "images/anim_marche_vers_droite/cote_droit6.png";
    		tab_anim[7]= "images/anim_marche_vers_droite/cote_droit7.png";
    		
    		int nain_pas = 0;			// variable servant au déplacement du nain
    		
    		for(int j =0;j<8;j++){		  //boucle pour lancer plusieurs cycles d'animation
    			for(int i =0;i<8;i++){   // boucle pour un cycle complet
    			SDLSurface image = SDLImage.load(tab_anim[i]);
    			
    		if(i == 2 || i ==6){	//à certaines étapes de l'animation, on fait avancer
    		nain_pas = nain_pas + 32;	//le sprite de 32 pixels pour donner l'illusion 
    			 }			// du déplacement
    				SDLRect imagePos = new SDLRect(nain_pas,0);
    				image.blitSurface(screen, imagePos);
    				screen.flip();
    				Thread.sleep(100);
    				}
    			
    			}
    			screen.freeSurface();
    			SDLMain.quit();
    			}
    			
    	public static void main(String[] args) throws SDLException, InterruptedException {
    		new anim_sdl();
    	}
    
    }
    


    Merci d'avance pour aide !


    • Partager sur Facebook
    • Partager sur Twitter
      16 avril 2009 à 9:32:39

      Bah faut effacer avant chaque traçage, mais bon j'utilise pas la SDL avec Java, j'utilise awt moi, je ne sais plus comment on efface avec la SDL. ^^
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        16 avril 2009 à 10:28:22

        il ne faut pas faire un SDL_screenUpdate après avoir blitté?
        • Partager sur Facebook
        • Partager sur Twitter
          16 avril 2009 à 11:38:13

          eh ben justement, pas moyen de trouver une méthode pour mettre à jour l'écran (screen), je ne trouve rien de pertinent
          dans les javadocs. :(


          • Partager sur Facebook
          • Partager sur Twitter
            16 avril 2009 à 13:30:59

            salut,

            Je passe juste pour te dire que la partie événement de mon tutoriel Sdljava est en validation et tu trouvera dedans tout ce que tu veux ;)

            Pour animation tu peux faire un truc comme ca :

            private void mainLoop() throws SDLException {
            		
            		SDLEvent.enableKeyRepeat(10, 10);
            				
            						
            		do 
            		{
            			SDLEvent event = SDLEvent.waitEvent();
            			
            			switch (event.getType()) {
            			
            			case SDLEvent.SDL_QUIT:			isRunning = false;			break;
            			case SDLEvent.SDL_KEYDOWN:		
            				SDLKeyboardEvent keyEvent = (SDLKeyboardEvent) event;
            				
            				switch (keyEvent.getSym()) {
            				
            				case SDLKey.SDLK_ESCAPE:	isRunning = false;			break;
            				
            				case SDLKey.SDLK_UP:
            					currentSprite = sprite[(int) (0 + (System.currentTimeMillis() / 200) % 4)];
            					positionSpriteY -= 2;
            					break;
            					
            				case SDLKey.SDLK_DOWN:
            					currentSprite = sprite[(int) (4 + (System.currentTimeMillis() / 200) % 4)];
            					positionSpriteY += 2;
            					break;
            					
            				case SDLKey.SDLK_LEFT:
            					currentSprite = sprite[(int) (8 + (System.currentTimeMillis() / 200) % 4)];
            					positionSpriteX -= 2;
            					break;
            					
            				case SDLKey.SDLK_RIGHT:
            					currentSprite = sprite[(int) (12 + (System.currentTimeMillis() / 200) % 4)];
            					positionSpriteX += 2;
            					break;
            				}
            			}
            			screen.fillRect(screen.mapRGB(0, 0, 0));
            			
            			for (int i = 0 ; i < mapManager.getMapHeight() ; i ++) 
            			{
            				for (int j = 0 ; j < mapManager.getMapWidth() ; j ++)
            				{
            					mapLevel[i][j].blitSurface(screen, positionMap[i][j]);
            				}
            				
            			}
            			
            			drawSurface(positionSpriteX, positionSpriteY, currentSprite, screen);
            			screen.flip();
            			
            		} while (isRunning);
            	}
            


            la méthode drawSurface est perso, et la classe MapManager aussi (donc ca sert à rien de la chercher dans la javadoc xD). Pour l'animation j'ai 16 sprites. bas0x.png, haut0x.png, etc...
            currentSprite = sprite[(int) (12 + (System.currentTimeMillis() / 200) % 4)];
            


            ici par exemple, mon currentSprite qui est le sprite unique affiché à l'écran prend la valeur d'une image d'un tableau. Je démarre à 12 car les animations qui m'intéresses démarrent à 12 puis j'additionne avec le rapport (temps passé / 200) modulo 4. Modulo 4 car j'ai quatre animation, la valeur 200 permet de régler la vitesse d'animation.

            J'écrirais sans doute une partie dans mon tutoriel sur les principes de base de l'animation.

            En attendant voici un bout de code du tuto :

            import sdljava.SDLException;
            import sdljava.SDLMain;
            import sdljava.event.SDLEvent;
            import sdljava.event.SDLKey;
            import sdljava.event.SDLKeyboardEvent;
            import sdljava.image.SDLImage;
            import sdljava.video.SDLRect;
            import sdljava.video.SDLSurface;
            import sdljava.video.SDLVideo;
            
            public class ExerciceEvent {
            
            	
            	public static void main(String[] args) throws SDLException {
            		
            		// Initialisation de sdl
            		SDLMain.init(SDLMain.SDL_INIT_VIDEO);
            		SDLSurface screen = SDLVideo.setVideoMode(640, 480, 32, SDLVideo.SDL_DOUBLEBUF | SDLVideo.SDL_HWSURFACE);
            		SDLVideo.wmSetCaption("My Java Shoot Them Up Baby ;)", null);
            		
            		// Création de l'objet joueur
            		SDLSurface plane = SDLImage.load("plane.gif");
            		int positionPlaneX = screen.getWidth() / 2 - plane.getWidth() / 2;
            		int positionPlaneY = screen.getHeight() / 2 - plane.getHeight() / 2;
            		boolean acceleration = false;
            		
            		boolean isRunning = true;
            		SDLEvent.enableKeyRepeat(10, 10);
            		
            		do
            		{
            			SDLEvent event = SDLEvent.waitEvent();
            			
            			if (event.getType() == SDLEvent.SDL_QUIT)		
            				isRunning = false;
            			
            			// Si la touche Shit de gauche n'est pas préssée
            			// pas d'accélération
            			if (event.getType() == SDLEvent.SDL_KEYUP) {
            				
            				SDLKeyboardEvent keyEventUp = (SDLKeyboardEvent) event;	
            				
            				if ( keyEventUp.getSym() == SDLKey.SDLK_LSHIFT )
            					acceleration = false;
            			}
            			
            			if (event.getType() == SDLEvent.SDL_KEYDOWN) {
            				
            				SDLKeyboardEvent keyEvent = (SDLKeyboardEvent) event;
            				
            				switch (keyEvent.getSym()) {
            				
            				case SDLKey.SDLK_LSHIFT:
            					acceleration = true;	break;
            				
            				case SDLKey.SDLK_ESCAPE:	
            					isRunning = false;		break;
            				
            				// On gère le déplacement avec ou sans accélération
            				case SDLKey.SDLK_UP:
            					if (acceleration)
            						positionPlaneY -= 4;
            					else
            						positionPlaneY -= 2;
            					break;
            					
            				case SDLKey.SDLK_DOWN:
            					if (acceleration)
            						positionPlaneY += 4;
            					else
            						positionPlaneY += 2;
            					break;
            					
            				case SDLKey.SDLK_LEFT:	
            					if (acceleration)
            						positionPlaneX -= 4;
            					else
            						positionPlaneX -= 2;
            					break;
            					
            				case SDLKey.SDLK_RIGHT:
            					if (acceleration)
            						positionPlaneX += 4;
            					else
            						positionPlaneX += 2;
            					break;
            				}
            			}
            			
            			// On met à jours l'affichage
            			screen.fillRect(screen.mapRGB(255, 255, 255));
            			blit.blitSurface(positionPlaneX, positionPlaneY, plane, screen);
            			screen.flip();
            			
            		} while (isRunning);
            			
            		// Libération de la mémoire
            		plane.freeSurface();
            		screen.freeSurface();
            		SDLMain.quit();
            	}
            }
            
            /*
             * Cette méthode permet de bliter une SDLSurface sans avoir besoin de créer
             * plusieurs objet SDLRect. Dans le cas de cet exemple elle n'est pas très utile
             * mais dans le cas ou vous avez plusieurs SDLSurfaces à bliter, elle montrera toute
             * sont éfficacité !
             */
            class blit {
            	static void blitSurface(int x, int y, SDLSurface src, SDLSurface dst) throws SDLException {
            		SDLRect temp = new SDLRect(x, y);
            		src.blitSurface(dst, temp);
            	}
            }
            


            • Partager sur Facebook
            • Partager sur Twitter
            Le développement de jeu vidéo vous intéresse ? Parlons en !
              16 avril 2009 à 17:10:05

              Merci pour ta réponse, je suis parvenue à résoudre mon petit problème :D
              En tout cas, j'attends la suite de ton tutoriel avec impatience ( j'ai d'ailleurs commencé à étudier
              la SDL en me basant sur celui-ci !)

              Ciao ^^
              • Partager sur Facebook
              • Partager sur Twitter
                16 avril 2009 à 18:09:22

                Si tu peux mettre le sujet en résolus s'il te plait :

                Tout en bas à gauche tu cliques sur "Indiquer que mon problème est résolu."
                • Partager sur Facebook
                • Partager sur Twitter
                  20 avril 2009 à 21:29:14

                  c'est quoi ce sdljava??si c'est possible de mettre des liens vers un tuto...
                  je travail sur des animations aussi,mais je travail sur la bibliothéque Swing ,y'a t'il des moyens qui facilite la tache des animations ...
                  merci
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    20 avril 2009 à 22:58:30

                    Citation : zangaloni

                    c'est quoi ce sdljava??si c'est possible de mettre des liens vers un tuto...
                    je travail sur des animations aussi,mais je travail sur la bibliothéque Swing ,y'a t'il des moyens qui facilite la tache des animations ...
                    merci


                    Je dirai bien que tu n'as pas lu les messages de ce poste, il y a un tutoriel ici sur la SDL Java (pas fini).

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Animation d'un perso avec SDL

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown