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

SDL Discussion :

Problème d'affichage avec SetRenderTarget(. . .)


Sujet :

SDL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    stage 01
    Inscrit en
    Octobre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Fidji

    Informations professionnelles :
    Activité : stage 01

    Informations forums :
    Inscription : Octobre 2011
    Messages : 3
    Par défaut Problème d'affichage avec SetRenderTarget(. . .)
    Bonjour,

    Je travaille actuellement sur un petit jeu vidéo en 2D style RPG (ce n'est que le début).
    Pour le moment j'utilise une feuille de sprite (un personnage avec tout ses mouvement ) et un fond (une seule et simple image ). Voila pour l'intro,

    mon problème est que je voudrais animer mon personnage sans pour autant recharger mon fond, mais ma texture contenant mon personnage n'apparait pas à l'écran, ça sera peut être plus clair avec du code :

    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
     
    SDL_Texture *Background = nullptr;
    SDL_Texture *Character;
    SDL_Renderer *renderer=nullptr;
     
    renderer = SDL_CreateRenderer( window, -1, SDL_RENDERER_TARGETTEXTURE|SDL_RENDERER_ACCELERATED);
    Background = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_STATIC, 1024, 768);
    Background = IMG_LoadTexture(renderer,"Ressources/fond.bmp");
    Character = SDL_CreateTexture(ren, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET,500, 500);
     
    SDL_RenderClear(renderer);
    SDL_RenderCopy(renderer,Background,nullptr,nullptr);
     
    for (int j = 0; j < 6; j++)
    	{
    		SDL_SetRenderTarget(ren,Character);
    		SDL_RenderCopy(ren, CharacterSpriteSheet, &clips[j], &CharacterPos);
    		SDL_RenderPresent(ren);
                    SDL_Delay(1000); 
    		SDL_RenderClear(ren);
    		SDL_SetRenderTarget(ren,nullptr);
    	}
    je demande ça car pour le moment je n'utilise qu'une simple image comme fond, mais je pense qu'un jour je devrais générer le fond à l'aide de plusieurs tiles et générer un fond à chaque mouvement de personnage doit être assez lourd (surtout s'il sont une dizaine à bouger).

    Je suis ouvert à toute proposition, dans le cas ou vous auriez de meilleur façon de faire .Merci par avance pour votre aide
    Cordialement

  2. #2
    Membre actif
    Homme Profil pro
    Lycéen
    Inscrit en
    Décembre 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Ile Maurice

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Décembre 2012
    Messages : 46
    Par défaut
    Bonjour, je ne comrend pas très bien ton problème. En fait ce que tu voudrais faire c'est ne pas à avoir à utiliser SDL_RenderCopy() pour afficher ton fond à chaque fois ? Pourquoi ? C'est pourtant comme ça que l'on fait normalement.

    Ca serais bien si on avait le code complet, ou du moins la fonction entière, c'est un peu confus pour le moment. Je vois aussi que tu ne fait pas de SDL_RenderPresent(), du moins avec le code que tu a fourni.

    Sinon ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Background = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_STATIC, 1024, 768);
    Background = IMG_LoadTexture(renderer,"Ressources/fond.bmp");
    Je ne pense pas que ce soit vraiment la façon pour charger ton fond, ici tu le charge deux fois à la suite ce qui doit utiliser plus de mémoire que nécessaire.

  3. #3
    Futur Membre du Club
    Profil pro
    stage 01
    Inscrit en
    Octobre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Fidji

    Informations professionnelles :
    Activité : stage 01

    Informations forums :
    Inscription : Octobre 2011
    Messages : 3
    Par défaut
    Bonjour,

    Merci de ta réponse alors pour commencer voilà mon code ( ce n'est qu'un prototype )
    mon main :
    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
    #include "SDL.h"
    #include "SDL_image.h"
    #include "Sprite.h"
     
    int main(int argc, char** argv)
    {
    SDL_Init(SDL_INIT_EVERYTHING);
    SDL_Renderer *renderer=nullptr;
    SDL_Window *window=nullptr;
     
    window = SDL_CreateWindow("Natural Evolution", 100,100,1024,768,NULL);
    renderer = SDL_CreateRenderer( window, -1, SDL_RENDERER_TARGETTEXTURE|SDL_RENDERER_ACCELERATED);
     
    CSprite SpriteObj("Ressources/DarkEclair.png", renderer);
    SDL_Texture *Background = nullptr;
     
    Background = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_STATIC, 1024, 768);
    Background = IMG_LoadTexture(renderer,"Ressources/fond.bmp");
     
     
    SDL_RenderCopy(renderer,Background,nullptr,nullptr);
    SDL_RenderPresent(renderer); 
    SpriteObj.DisplayCharacter(renderer);
    SDL_RenderPresent(renderer);
    SDL_Delay(1000);
     
    SDL_Quit();
    return 0;
    }
    mon Sprite.cpp
    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
    #include "Sprite.h"
     
    CSprite::CSprite(const std::string &file, SDL_Renderer *ren)
    {
    	SpriteW=32, SpriteH=56;
    	CharacterSpriteSheet = SDL_CreateTexture(ren, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_STATIC, 1, 1);
    	CharacterSpriteSheet = IMG_LoadTexture(ren,file.c_str());
    	SurfaceTemp =IMG_Load(file.c_str());
    	SDL_SetColorKey( SurfaceTemp, SDL_TRUE, SDL_MapRGB( SurfaceTemp->format, 0x62, 0x7C, 0x4C ) );
    	CharacterSpriteSheet = SDL_CreateTextureFromSurface( ren, SurfaceTemp );
    	Character = SDL_CreateTexture(ren, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET,500, 500);
    ////Setup the clips for our image
    	 clips[0].x = 2 + SpriteW;
    	 clips[0].y = 1;
    	 clips[0].w = SpriteW;
    	 clips[0].h = SpriteH;
     
    	 for (int i = 1; i < 6; i++)
    	      {
    		     clips[i].x = i + (i-1)*SpriteW;
    		     clips[i].y = 3 + 2*SpriteH;
    		     clips[i].w = SpriteW;
    		     clips[i].h = SpriteH;
    	      }
    }
     
     
    CSprite::~CSprite(void)
    {
    	SDL_FreeSurface(SurfaceTemp);
    }
     
    void CSprite::DisplaySpriteSheet(SDL_Renderer *ren)
    {
    	SDL_RenderCopy(ren, CharacterSpriteSheet, nullptr, nullptr);
    }
     
    void CSprite::DisplayCharacter( SDL_Renderer *ren)
    {	
    	for (int j = 0; j < 6; j++)
    	{
    		SDL_SetRenderTarget(ren,Character);
    		SDL_RenderCopy(ren, CharacterSpriteSheet, &clips[j], &CharacterPos);
    		SDL_RenderPresent(ren);
    		SDL_Delay(1000);
    		SDL_RenderClear(ren);
    		SDL_SetRenderTarget(ren,nullptr);
     
    	}
    }
     
     
    void CSprite::Animation(SDL_Texture *CharacterSpriteSheet, SDL_Texture *CharacterSprite)
    {
     
    }
    mon Sprite.h
    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
    #include "SDL.h"
    #include "SDL_image.h"
    #include <string>
    #pragma once
     
    class CSprite
    {
    public:
    	CSprite(const std::string &file, SDL_Renderer *ren);
    	~CSprite(void);	
    	void DisplaySpriteSheet(SDL_Renderer *ren);
    	void DisplayCharacter(SDL_Renderer *ren)	;
    	void Sprite(SDL_Texture CharacterSpriteSheet);
    	void Animation(SDL_Texture *CharacterSpriteSheet, SDL_Texture *CharacterSprite);
     
     
    private:
    	SDL_Texture *CharacterSpriteSheet;
    	SDL_Texture *Character;
    	SDL_Surface *SurfaceTemp;
    	int SpriteW; 
    	int SpriteH;
    	SDL_Rect clips[7];
    	SDL_Rect CharacterPos;
    };
    ce que je voudrais voir à l'écran :
    -le fond s'affiche
    -la première image de mon sprite s'affiche
    -le programme attends 1s
    - le programme efface la première image de mon sprite

    -affiche la deuxième image de mon sprite
    -le programme attends 1s...
    -le programme efface la deuxième image
    etc...

    Donc oui je souhaite utiliser la fonction SetRenderTarget() sur ma texture "Character", afficher mon image et l'effacer ensuite avec la fonction renderclear(). Et ça sans toucher à mon fond.

    Concernant ta remarque : admettons que j'ai ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Background =IMG_LoadTexture(renderer,"Ressources/fond.bmp");
    comment je fais ensuite pour définir l'accès ou le format des pixels de ma texture ? j'ai besoin de 2 ligne non ?

    Edit : Si l'on venait à me dire que je n'ai pas le choix, je rechargerais mon fond tout le temps, mais sa me semble un peu bourin ( pas réactif ) surtout pour les Dev voulant faire un shoot'em up (tout ré-afficher à chaque fois qu'un projectile se déplace...)

    Cordialement
    Images attachées Images attachées  

  4. #4
    Membre actif
    Homme Profil pro
    Lycéen
    Inscrit en
    Décembre 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Ile Maurice

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Décembre 2012
    Messages : 46
    Par défaut
    Bon encore une fois la plupart des jeux font une boucle et re-affiche tout à chaque tour de boucle. Après je ne suis pas un pro. de la SDL, c'est juste que c'est la façon habituelle de faire, et je procède ainsi pour ma part aussi.

    D'ailleurs je peux te montrer quelques exemples de jeux réalisés avec la SDL 1.x, et qui en plus de cela ne possède pas d'accélération matérielle, donc c'est plus lent :

    [ame="http://www.youtube.com/watch?v=wJBaQn46wE4"]Wiwi's Adventures 1 Resurrection : FREE for your PC - YouTube[/ame]
    [ame="http://www.youtube.com/watch?v=3y_GEXdkVck"]The Legend of Edgar - YouTube[/ame]
    http://oldschoolprg.x10.mx/projets.php (pas mal d'exemples)

  5. #5
    Futur Membre du Club
    Profil pro
    stage 01
    Inscrit en
    Octobre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Fidji

    Informations professionnelles :
    Activité : stage 01

    Informations forums :
    Inscription : Octobre 2011
    Messages : 3
    Par défaut
    Bonjour,

    OK, j'ai pris note merci, moi qui pensait que tout les jeux fais en SDL utiliser une fonction ou un algo ultra secret(e) dont je ne trouver pas l'existence sur google...

    et désolé d'avoir été si long à répondre je n'avait pas trop le temps à cause de soucis perso.

    Cordialement

Discussions similaires

  1. Problème d'affichage avec IE
    Par sheepk dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 11/11/2005, 13h00
  2. Réponses: 6
    Dernier message: 19/05/2005, 11h06
  3. problème d'affichage avec printf
    Par sorari dans le forum C++
    Réponses: 12
    Dernier message: 08/03/2005, 18h30
  4. Réponses: 6
    Dernier message: 19/10/2004, 13h46
  5. Problème d'affichage avec trace
    Par WriteLN dans le forum Flash
    Réponses: 10
    Dernier message: 22/10/2003, 16h59

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