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 : Affichage de deux images (SDL et C++)


Sujet :

SDL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Problème : Affichage de deux images (SDL et C++)
    Bon voila, j'ai un code qui se compile, qui s'execute mais qui ne fait pas ce que je veux. Je voudrais avoir un affichage de fond et rajouter par le biais d'instances des acteurs.

    Le probleme c'est que quand je compile il n'y a que le fond qui s'affiche et je ne comprend absolument pas pourquoi.
    Les fichiers sont au bons endroit, correctement appelés.
    Pas d'erreur de compilation. Cela m'aiderai bien si vous pouviez jeter un oeil.

    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
     
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <cstdlib>
    #include <iostream>
     
    using namespace std;
     
    /*======CLASSES======*/
     
    class affichage  /*Affichage*/    
    {
          private : 
                  SDL_Surface *ecran;
                  char img_bmp[50];
                  SDL_Rect img_coord;
                  int pos_x;
                  int pos_y;
     
          public:
                  affichage(char*);
                  void perso_aff(char*, int, int);
                  void refresh();
                  void pause();
    };
     
     
    /*======DEFINITIONS AFFICHAGE======*/
     
    affichage::affichage(char* img_bmp) /*Constructeur Surchargé Affichage*/
    {
         SDL_Surface *ecran = NULL, *fond = NULL;
     
         SDL_Rect img_coord;
     
         img_coord.x = 0;
         img_coord.y = 0; 
     
         SDL_Init(SDL_INIT_VIDEO);
     
         ecran = SDL_SetVideoMode(1024, 768, 32, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_FULLSCREEN);
         SDL_WM_SetCaption("                                                                                                     ~~~~~BATTLE LEGEND~~~~~", NULL);
     
         fond = SDL_LoadBMP(img_bmp);
         SDL_BlitSurface(fond, NULL, ecran, &img_coord); 
     
         SDL_Flip(ecran);
    }     
     
     
    void affichage::pause() /*Fonction PAUSE*/   
    {
     
        int continuer = 1;
        SDL_Event event;
     
        while (continuer)
    {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
                continuer = 0;
                break;
            case SDL_KEYDOWN:
                switch (event.key.keysym.sym)
                {
                    case SDLK_ESCAPE:
                        continuer = 0;
                        break;
                }
                break;
        }
    }
    }
     
    void affichage::refresh() /*Fonction Refresh*/
    {
        SDL_Flip(ecran);
    }
     
     
    void affichage::perso_aff(char* img_bmp , int pos_x, int pos_y) /*Fonction Afficher Perso*/
    {    
         SDL_Surface *perso_stock = NULL;
         SDL_Rect img_coord;
     
         img_coord.x = pos_x;
         img_coord.y = pos_y;
     
         perso_stock = SDL_LoadBMP(img_bmp);
         SDL_SetColorKey(perso_stock, SDL_SRCCOLORKEY, SDL_MapRGB(perso_stock->format, 255, 255, 255));
         SDL_BlitSurface(perso_stock, NULL, ecran, &img_coord); 
         SDL_Flip(ecran);
    }
     
     
    /*======MAIN======*/
     
    int main(int argc, char *argv[])
    {
        affichage instance1("Battlefond.bmp");
        instance1.perso_aff("warrior.bmp", 800, 400);
        instance1.refresh();
        instance1.pause();
     
     
         return 0;
    }

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Bsk_mikael
    Bon voila, j'ai un code qui se compile, qui s'execute mais qui ne fait pas ce que je veux. Je voudrais avoir un affichage de fond et rajouter par le biais d'instances des acteurs.

    Le probleme c'est que quand je compile il n'y a que le fond qui s'affiche et je ne comprend absolument pas pourquoi.
    Les fichiers sont au bons endroit, correctement appelés.
    Pas d'erreur de compilation. Cela m'aiderai bien si vous pouviez jeter un oeil.
    Parce que tu ne suis pas la logique de la programmation SDL. Tu es en train de mélanger tout...

    En utilisant SDL_DOUBLEBUF, tu déclares deux tampons. Tu dessines ensuite le fond et tu fais un SDL_Flip donc tu l'affiches

    Ensuite, tu demandes d'afficher le personnage, et tu refais un SDL_Flip dans ta fonction perso_aff. Donc maintenant tu affiches une image non initialisée avec un perso au milieu.

    Enfin, t'appelles refresh qui refait un SDL_Flip... Donc tu réaffiches le fond.


    Je me doute que c'est un code prototype mais il y a beaucoup de problèmes dans ce code :

    - La définition de la classe dans un fichier code -> c'est pas propre
    - Création de la fenêtre dans une classe affichage sans aucun test sur les retours des fonctions SDL, et aucun test si jamais la personne tente de recréer un deuxième objet affichage.
    - Utilisation de SDL_WaitEvent qui de toute facon passera à SDL_PollEvent lorsque tu voudras faire quelque chose de plus sérieux (attention, l'utilisation n'est pas la même)
    - Pas de cas default dans ton switch
    - Ta fonction refresh est dangereuse et ne fait pas ce que tu veux, il faudrait au moins réafficher le fond. A la limite, tu pourrais avoir, une fonction refresh qui réaffiche le fond et une fonction refresh_commit qui fait ton SDL_Flip. Comme ca tu pourrais faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    affichage.refresh(); /* Mis en place de l'image de fond */
    /* Code de dessin ici */
    affichage.refresh_commit(); /* SDL_Flip */
    - perso_aff charge plusieurs fois l'image, ce sera prohibitif côté performances
    - il faudrait le charger qu'une seule fois.
    - enlever le SDL_Flip dans perso_Aff

    Bonne chance,
    Jc

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    ok merci j'ai resolu le probleme mais je pense pas que le code soit parfait mais pour l'instant ça marche.

  4. #4
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Bsk_mikael
    ok merci j'ai resolu le probleme mais je pense pas que le code soit parfait mais pour l'instant ça marche.
    Donc ? Et oui le code n'est pas parfait, c'était pour cela que j'ai fait ces remarques.

    Essaies de les prendre en compte et tout ira bien

    Jc

Discussions similaires

  1. affichage de deux images
    Par naim2009 dans le forum Images
    Réponses: 3
    Dernier message: 16/05/2009, 19h01
  2. Problème affichage de l'image titre
    Par gueud dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 03/07/2008, 15h34
  3. [problème] affichage d'une image dans un JButton
    Par shadowpath dans le forum Composants
    Réponses: 3
    Dernier message: 16/06/2008, 09h20
  4. Réponses: 4
    Dernier message: 27/02/2007, 13h57
  5. Problème affichage d'une image
    Par om.rava dans le forum Langage
    Réponses: 3
    Dernier message: 04/12/2005, 09h56

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