Partage
  • Partager sur Facebook
  • Partager sur Twitter

SDL2 invalid texture

Problème d'afficage d'une texture via une fonction

    24 octobre 2021 à 16:34:55

    Bonjours,

    J'essaie d'apprendre la SDL2 et j'ai vue que le cour de c propose un tp de sokoban avec des sprite tout fait j"essais donc de le réaliser sans regarder la solution mais je me trouve face a un problème je n'arrive pas a afficher une texture via une fonctionpouvez vous m'aider s'il vous plait

    main

    #include<stdlib.h>
    #include<stdio.h>
    #include<SDL.h>
    #include<SDL_image.h>
    
    #include"toolBase.h"
    #include"constant.h"
    #include"level.h"
    #include"perso.h"
    #include"jeu.h"
    
    #define WINDOW_WIDTH 800
    #define WINDOW_HEIGHT 600
    
    
    int main(int argc, char *argv[])
    {
    	//Window
    	SDL_Window *window = NULL;
    	SDL_Renderer *renderer = NULL;
    	SDL_bool windowIsOpen = SDL_TRUE;
    	SDL_Texture *playerTexture = NULL;
    	SDL_Rect positionPlayer;
    	int startPositionX = 30, startPositionY = 30;  
    
    
    	if(SDL_Init(SDL_INIT_VIDEO) != 0)
    		clearRessources("Imposible d'initialiser la SDL", NULL, NULL, NULL);
    
    	if(SDL_CreateWindowAndRenderer(WINDOW_WIDTH,WINDOW_HEIGHT, 0, &window, &renderer))
    		clearRessources("Imposible d'initialiser la fenetre et le rendu ", window, renderer, NULL);
    
    	if(SDL_SetRenderDrawColor(renderer, 255,255, 255, SDL_ALPHA_OPAQUE) != 0)
    			clearRessources("Impossible de changer la couleur du renderer", window, renderer, NULL);
    
    	//Init Player
    	playerTexture = initPlayer(window, renderer, DOWN);
    	positionPlayer = initPlayerPosition(window, renderer, startPositionX, startPositionY);
    	
    
    	while(windowIsOpen)
    		{
    			SDL_Event event;
    			while(SDL_PollEvent(&event))
    			{
    				switch(event.type)
    				{
    					case SDL_QUIT:
    						windowIsOpen = SDL_FALSE;
    						break;
    
    					default:
    						break;
    				}
    			}
    
    
    			if(SDL_RenderClear(renderer) != 0)
    			 clearRessources("Impossible de cleaur le rendu", window, renderer,playerTexture);
    
    			//Afichage du joueur 
    			displayPlayer(window,renderer, DOWN, playerTexture, positionPlayer);
    
    
    			SDL_RenderPresent(renderer);
    		}
    
    
    
    
    
    
    
    	clearRessources(NULL, window, renderer, NULL);
    	return EXIT_SUCCESS;
    }

     jeux.c

    #include<SDL.h>
    #include<SDL_image.h>
    #include<stdio.h>
    #include<stdlib.h>
    
    #include"perso.h"
    #include"toolBase.h"
    #include"constant.h"
    #include"jeu.h"
    
    
    
    void displayPlayer(SDL_Window *window,SDL_Renderer *renderer, int player, SDL_Texture *texturePlayer, SDL_Rect playerPosition)
    {
    
    
    	if(player == DOWN)
    
    	{
    		if(SDL_QueryTexture(texturePlayer, NULL, NULL, &playerPosition.w, &playerPosition.h) != 0)
    			clearRessources("Impossible de charger la texture sur le rendu", window, renderer, texturePlayer);
    
    		if(SDL_RenderCopy(renderer, texturePlayer, NULL, &playerPosition) != 0)
    			clearRessources("Impossible d'afficher la texture sur le rendu", window, renderer, texturePlayer);
    
    	}
    }





    • Partager sur Facebook
    • Partager sur Twitter
      24 octobre 2021 à 16:50:07

      Hello,

      Quel est le code de initPlayer() et initPlayerPosition() ?

      Et quand tu dis "je n'arrive pas à afficher", quel(s) est(sont) le(s) symptôme(s) ? Le programme plante, l'écran ne change pas, .... ?

      As-tu des warnings lors de la compilation (avec gcc, -Wall et -Wextra stp) ?

      Edit: typo

      -
      Edité par edgarjacobs 24 octobre 2021 à 16:52:22

      • Partager sur Facebook
      • Partager sur Twitter

      On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

        24 octobre 2021 à 17:23:16

        le programme plante et SDL_GetError() : Invalid texture et non je n'est pas de warning.

        perso.c

        #include<SDL.h>
        #include<SDL_image.h>
        #include<stdio.h>
        #include<stdlib.h>
        
        #include"constant.h"
        #include"perso.h"
        #include"toolBase.h"
        
        
        SDL_Texture *initPlayer(SDL_Window *window,SDL_Renderer *renderer,int player)
        {
        	SDL_Surface *imgPlayer = NULL;
        	SDL_Texture *texturePlayer = NULL;
        
        	if(player = DOWN)
        	{
        		imgPlayer = IMG_Load("sprite/mario_bas.gif");
        		if(imgPlayer == NULL)
        			clearRessources("Impossible de charger l'image", window, renderer, NULL);
        
        		texturePlayer = SDL_CreateTextureFromSurface(renderer, imgPlayer);
        		SDL_FreeSurface(imgPlayer);
        		if(texturePlayer == NULL)
        			clearRessources("Impossible de charger la texture", window, renderer, NULL);
        
        		
        
        		return texturePlayer; 
        	}
        }
        
        SDL_Rect initPlayerPosition(SDL_Window *window,SDL_Renderer *renderer, int positionX, int positionY)
        {
        	SDL_Rect position ={positionX, positionY, TAILLE_BLOC, TAILLE_BLOC};
        
        	return position; 
        }
        
        
        
        
        



        • Partager sur Facebook
        • Partager sur Twitter
          24 octobre 2021 à 18:25:51

          Salut, ligne 16 tu fais une affectation au lieu d'une comparaison, chez moi ça fonctionne après avoir modifié cela
          • Partager sur Facebook
          • Partager sur Twitter
            24 octobre 2021 à 18:42:28

            oui très juste mais même en la corrigeant sa ne règle pas mon soucis
            • Partager sur Facebook
            • Partager sur Twitter
              24 octobre 2021 à 19:40:04

              clearRessources() termine-t-il ton programme ? Car si ce n'est pas le cas, clearRessources() affiche un message, mais ton programme continue malgré l'erreur....

              Code de clearRessources() ?

              -
              Edité par edgarjacobs 24 octobre 2021 à 19:44:06

              • Partager sur Facebook
              • Partager sur Twitter

              On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                24 octobre 2021 à 20:00:19

                toolBase !
                #include<SDL.h>
                #include<stdlib.h>
                #include<stdio.h>
                #include<string.h>
                #include "toolBase.h"
                
                
                void clearRessources(const char *message, SDL_Window *window, SDL_Renderer *renderer, SDL_Texture *texture)
                {
                	if(texture != NULL)
                	{
                		SDL_DestroyTexture(texture);
                	}
                
                	if(renderer != NULL)
                	{
                		SDL_DestroyRenderer(renderer);
                	}
                
                	if( window != NULL)
                	{
                		SDL_DestroyWindow(window);
                	}
                
                	if(message != NULL)
                	{
                		SDL_Log("Error : %s > %s\n", message, SDL_GetError());
                	}
                	SDL_Quit();
                	exit(EXIT_FAILURE);
                
                }


                • Partager sur Facebook
                • Partager sur Twitter
                  24 octobre 2021 à 20:14:39

                  J'ai oublié de poser cette question

                  AnatoleFarenc a écrit:

                  le programme plante et SDL_GetError() : Invalid texture (....)

                  Mais quel est le message (message dans clearRessources()) que tu reçois ? (Tu as bien blidé ton programme en cas d'erreur !)

                  -
                  Edité par edgarjacobs 24 octobre 2021 à 20:16:01

                  • Partager sur Facebook
                  • Partager sur Twitter

                  On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                    24 octobre 2021 à 20:15:57

                    INFO: Error : Impossible de charger la texture sur le rendu > Invalid texture

                    et si dans la fonction displayPlayer j'envoie NULL en texture j'obtient

                    INFO: Error : Impossible de charger l'image > Couldn't open sprite/mario_bas.gif

                    jeux.c

                    #include<SDL.h>
                    #include<SDL_image.h>
                    #include<stdio.h>
                    #include<stdlib.h>
                    
                    #include"perso.h"
                    #include"toolBase.h"
                    #include"constant.h"
                    #include"jeu.h"
                    
                    
                    
                    void displayPlayer(SDL_Window *window,SDL_Renderer *renderer, int player, SDL_Texture *texturePlayer, SDL_Rect playerPosition)
                    {
                    
                    
                    	if(player == DOWN)
                    
                    	{
                    		if(SDL_QueryTexture(texturePlayer, NULL, NULL, &playerPosition.w, &playerPosition.h) != 0)
                    			clearRessources("Impossible de charger la texture sur le rendu", window, renderer, NULL);
                    
                    		if(SDL_RenderCopy(renderer, texturePlayer, NULL, &playerPosition) != 0)
                    			clearRessources("Impossible d'afficher la texture sur le rendu", window, renderer, texturePlayer);
                    
                    	}
                    }






                    -
                    Edité par AnatoleFarenc 25 octobre 2021 à 8:35:53

                    • Partager sur Facebook
                    • Partager sur Twitter
                      25 octobre 2021 à 16:51:08

                      Tu es sûr que ton image est bien chargée ? J'ai le même message d'erreur si j'entre un chemin erroné dans IMG_Load()
                      • Partager sur Facebook
                      • Partager sur Twitter
                        25 octobre 2021 à 19:11:13

                        @KevinGL: dans initPlayer(), si l'image n'est pas chargée, on sort du programme avec la fonction cleaRessources()

                        Edit: je n'ai jamais essayé de créer une texture à partir d'un gif.

                        -
                        Edité par edgarjacobs 25 octobre 2021 à 19:30:30

                        • Partager sur Facebook
                        • Partager sur Twitter

                        On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                          25 octobre 2021 à 21:15:57

                          edgarjacobs a écrit:

                          @KevinGL: dans initPlayer(), si l'image n'est pas chargée, on sort du programme avec la fonction cleaRessources()

                          Edit: je n'ai jamais essayé de créer une texture à partir d'un gif.

                          -
                          Edité par edgarjacobs il y a environ 1 heure

                          En tout cas j'ai bien le message "Invalid texture" si le chemin est erroné. À voir également s'il s'agit d'un GIF animé, je suis pas sûr que ce soit pris en charge par SDL

                          • Partager sur Facebook
                          • Partager sur Twitter
                            27 octobre 2021 à 15:03:45

                            Salut,

                            Si j'en reste à mes derniers essais, pour un gif animé, SDL_Image n'extrait que la première image de l'animation avec des bug potentiels sur les transparence et le mode entrelacé. Pour du sprite, je m'abstiens à du png, je n'utilise du gif que pour faire de vraies animations, à chacun son truc.

                            Bonne continuation.

                            • Partager sur Facebook
                            • Partager sur Twitter

                            Bonhomme !! | Jeu de plateforme : Prototype.

                            SDL2 invalid texture

                            × 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