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 :

[C] Comment faire un scrolling ? {SDL}


Sujet :

SDL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 106
    Par défaut [C] Comment faire un scrolling ? {SDL}
    Bonjour, j'aimerais pouvoir faire sur mon mini-jeux, un scrolling en SDL. Mais, je ne sais pas comment faire.
    Pouvez me donnez la marche à suivre ?

    Sinon.... (autant en profiter)

    J'ai quelque soucis avec mon jeux. Quand je déplace Mario, il se déplace lentement. Pourtant, j'ai bien mis le SDL_EnableKeyRepeat à (10,10).... comme sur les tutoriels, mais il se déplace comme un vieux lol


    Code c : 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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
     
    #include "constant.h"
     
     
    int main(int argc, char *argv[])
    { 
    	SDL_Surface *ecran = NULL, *image_de_fond = NULL, *Sol = NULL;
        SDL_Surface *mario[4] = {NULL}; // 4 surfaces pour chacune des directions de Mario
        SDL_Surface *marioActuel = NULL;
       SDL_Rect positionFond, positionMario, positionSol;
     
      /*Pour le fond du jeu */
     
    positionFond.x = 0;
    positionFond.y = 0;
     
     /* Position de Mario sur la carte */
     
    positionMario.x = 1;
    positionMario.y = 410;
     
    /* Position du sol sur la carte*/
     
    positionSol.x = 1;
    positionSol.y = 442;
     
    SDL_Event event;
    int continuer = 1;
     
        SDL_Init(SDL_INIT_VIDEO);
     
        ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE);
        SDL_WM_SetCaption("Deplacer Mario sur un ecran blanc !", NULL);
     
        /* Chargement des images */
        mario[BAS] = IMG_Load("mario_bas.gif");
        mario[GAUCHE] = IMG_Load("mario_gauche.gif");
        mario[HAUT] = IMG_Load("mario_haut.gif");
        mario[DROITE] = IMG_Load("mario_droite.gif");
        marioActuel = mario[DROITE]; // Mario sera dirigé vers la droite au départ
     
    SDL_EnableKeyRepeat(10, 10);
     
        while (continuer)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
                    break;
                case SDL_KEYDOWN:
                    switch(event.key.keysym.sym)
                    {
                        case SDLK_UP: // Flèche haut (sauter)
                            marioActuel = mario[HAUT];
     
                            break;
                        case SDLK_RIGHT: // Flèche droite (avancer vers la droite)
                            marioActuel = mario[DROITE];
                            positionMario.x++;
                            break;
                        case SDLK_LEFT: // Flèche gauche (avancer vers la gauche)
                            marioActuel = mario[GAUCHE];
                            positionMario.x--;
                            break;
                    }
                    break;
            }
     
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 128, 128, 128)); /* On efface l'écran */
     
             /* Mise en place du fond */
       image_de_fond = IMG_Load("fond.png");
       SDL_BlitSurface(image_de_fond, NULL, ecran, &positionFond);
     
            SDL_BlitSurface(marioActuel, NULL, ecran, &positionMario); /* On place Mario à sa nouvelle position */
     
            Sol = IMG_Load("mur_sol.png");
        SDL_BlitSurface(Sol, NULL, ecran, &positionSol);
     
            SDL_Flip(ecran); /* On met à jour l'affichage */
        }
     
        SDL_FreeSurface(marioActuel);
        SDL_FreeSurface(mario[HAUT]);
        SDL_FreeSurface(mario[BAS]);
        SDL_FreeSurface(mario[DROITE]);
        SDL_FreeSurface(mario[GAUCHE]);
        SDL_Quit();
    }


    Est aussi quand, on reste appuyé sur la touche, Mario s'arrête puis repars, s'arrête puis repars,etc. Pouvez m'aider à corriger ces erreurs ?
    Je pense que c'est un problème de mémoire, mais comment y remédier ?

    Merci.

  2. #2
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 532
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 532
    Par défaut
    Citation Envoyé par Moxostoma Voir le message
    \Je pense que c'est un problème de mémoire, mais comment y remédier ?
    Ce n'est pas du tout un problème mémoire c'est que ton programme est mal conçu.
    1-grosse erreur: dans le while(continuer) tu recharges à chaque fois les bitmaps de décor mur_sol.png et fond.png.
    Imagines un jeu complet qui fait plusieurs megaoctets de ressources en images si tu fais cela et que tu recharges toutes tes bitmaps dans une boucle infinie je ne te dis pas la baisse significative des performances..
    l'accès au disque dur c'est parmi les choses les plus lentes dans un système informatique..
    donc les bitmaps du jeu il faut les charger au début pas pendant l'exécution.

    2-
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SDL_BlitSurface(image_de_fond, NULL, ecran, &positionFond);
    positionFond avec le code donné semble rester statique et n'évolue pas.
    Comment veux-tu faire un scrolling ?

    Selon ta résolution d'écran ( en plein écran ) ou bien les dimensions de ta fenêtre ( donc ici 640*480) il faut que tu fasses évoluer la surface visible du jeu ( viewport en anglais ).
    Donc par exemple si tu appuies sur la touche flêche droite du clavier , il faut calculer positionFond de type SDL_Rect en fonction de la zone visible.
    En anglais on appelle cela un clipping

Discussions similaires

  1. Comment faire un scroll depuis n'importe ou
    Par epiouf dans le forum Windows Mobile
    Réponses: 1
    Dernier message: 30/07/2010, 10h47
  2. Comment faire un scrolling?
    Par bogoss91 dans le forum SDL
    Réponses: 7
    Dernier message: 02/08/2007, 14h39
  3. [openGL/SDL] InputBox, comment faire?
    Par Naelhem dans le forum OpenGL
    Réponses: 4
    Dernier message: 22/10/2006, 00h01
  4. Comment faire un scroll de texte...
    Par pointer dans le forum Langage
    Réponses: 17
    Dernier message: 17/02/2006, 11h19
  5. Comment faire fonctionner une scroll bar ???
    Par toto4650 dans le forum MFC
    Réponses: 10
    Dernier message: 18/07/2005, 16h47

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