Probleme vitesse scrolling

gusdark Messages postés 10 Date d'inscription mercredi 19 mars 2003 Statut Membre Dernière intervention 12 janvier 2010 - 29 oct. 2006 à 11:54
gusdark Messages postés 10 Date d'inscription mercredi 19 mars 2003 Statut Membre Dernière intervention 12 janvier 2010 - 30 oct. 2006 à 17:48
bonjour ,

j'ai lu pas mal de topics sur le scrolling dans le forum, ce qui m'a permis de comprendre le principe.Mais j'ai cependant un problème que je ne me rapelle pas avoir vu chez les autres. voilà mon perso commence au milieu de la map.
si il se déplace vers la gauche au début , la map ne bouge pas , et le perso avance plutot lentement. mais s'il va a droite et qu'il dépasse le centre de l'écran , il va a toute allure , et la map commence a bouger avec lui , mais pas assez rapidement , si bien qu'au bout de 5 secondes le perso a dépassé l'ecran et on voit plus que la map défiler.
je vous montre mon code pour que vous me disiez ce qui va pas.j'ai essayé plusieurs trucs , comme SDL_Delay , mais rien a faire même si le perso va moins vite , la map va encore moins vite.

PS : j'ai aussi un probleme avec l'animation de mon perso (j'ai lu tout les topics dessus), et je l'ai implémenté dans mon code , mais des que je remplace pingoui[DEBUT] par pingouiActuel , il ne m'affiche plus le perso.Je comprend pas pourquoi...
merci d'avance.
<hr />
#include <stdlib.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#define LARGEUR_ECRAN 800
#define HAUTEUR_ECRAN 400

int main(int argc, char *argv[])
{
    enum{DEBUT, DWALK1, DWALK2, DWALK3, DWALK4};    int tempsPrecedent 0, tempsActuel 0;
    SDL_Surface *pingoui[5] = {NULL} , *map = NULL , *pingouiActuel = NULL;
    pingouiActuel = pingoui[DEBUT];
    SDL_Surface *ecran = NULL;
    SDL_Rect positionPingoui;
    SDL_Rect positionMap;
    SDL_Rect morceauMap;
    positionMap.x = 0;
    positionMap.y = 0;
    positionPingoui.x = 400;
    positionPingoui.y = 344;
    SDL_Event event;
    morceauMap.x = 0;
    morceauMap.y = 0;
    morceauMap.w = LARGEUR_ECRAN;
    morceauMap.h = HAUTEUR_ECRAN;
     int continuer = 1;

    map = IMG_Load("map.gif");
    //definition des images de l'animation
    pingoui[DEBUT] = IMG_Load("stop.png");
    pingoui[DWALK1] = IMG_Load("droite1.png");
    pingoui[DWALK2] = IMG_Load("droite2.png");
    pingoui[DWALK3] = IMG_Load("droite3.png");
    pingoui[DWALK4] = IMG_Load("droite4.png");

    SDL_Init(SDL_INIT_VIDEO);
    ecran = SDL_SetVideoMode(800,400,32,SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_FULLSCREEN);
    SDL_WM_SetCaption("Test Pingoui",NULL);

    SDL_BlitSurface(map, &morceauMap, ecran, &positionMap);//On blitte le fond
    SDL_BlitSurface(pingouiActuel, NULL, ecran, &positionPingoui);//On blitte le perso actuel
    SDL_Flip(ecran);
    SDL_EnableKeyRepeat(10,10);
    while(continuer)
    {
        SDL_PollEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
            continuer = 0;
            break;

            case SDL_KEYDOWN:
            switch(event.key.keysym.sym)
            {
                    case SDLK_ESCAPE:
                    continuer  = 0;
                    break;

                    case SDLK_RIGHT:
                    if(positionPingoui.x < map->w)//pingoui va lentement quand il est dans la partie gauche de l'ecran au debut (0<x<map->w) et la map ne bouge pas normal.
                    {
                        //pingoui va a toute allure des qu'il a passé le centre de l'ecran et la map se deplace.
                        positionPingoui.x++;
                    }
                    if(morceauMap.x < map->w - LARGEUR_ECRAN && positionPingoui.x > 400)
                    //mais la map ne suit pas elle va beaucoup moins vite que pingoui :(
                    morceauMap.x++;
                    break;

                    case SDLK_LEFT:
                    if(positionPingoui.x > 0)
                    {
                        positionPingoui.x--;
                    }
                    if(morceauMap.x > 0)
                    morceauMap.x--;

            }
        }
        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
        SDL_BlitSurface(map, &morceauMap, ecran, &positionMap);
        //si je remplace pingoui[DEBUT] par pingouiActuel , il ne m'affiche plus rien...
        SDL_BlitSurface(pingoui[DEBUT], NULL, ecran, &positionPingoui);
        SDL_Flip(ecran);
    }
}

<hr />
gusdark [:)]

2 réponses

Kleidp Messages postés 124 Date d'inscription jeudi 5 juin 2003 Statut Membre Dernière intervention 10 février 2008
29 oct. 2006 à 18:55
PingouiActuel doit etre égal à pinguoi ou &pinguoi[0]
Pour le switch ça devient vite illisible si tu inclus trop d'instructions donc utilise plutot des if
switch(var)
{
    case 0: uneInstruction; break
    case 1: uneInstruction; break
    ....

Pour le scrolling il doit y avoir surement plusieurs methodes, en voici une:

Tu mets ta map dans un buffer (bien plus grand que l'écran donc)
Ton personnage avance dans le buffer
Tu affiches une partie du buffer dans l'écran
0
gusdark Messages postés 10 Date d'inscription mercredi 19 mars 2003 Statut Membre Dernière intervention 12 janvier 2010
30 oct. 2006 à 17:48
merci
en fait il fallait faire ca :
SDL_Rect rel_pos;
rel_pos.x=positionPingoui.x-morceauMap.x;
rel_pos.y=positionPingoui.y-morceauMap.y;
et puis :
SDL_BlitSurface(pingouiActuel, NULL, ecran, &rel_pos);

par contre j'ai toujours un probleme avec l'animation du perso
quand je met pingouiActuel il ne m'affiche pas le perso , je comprend pas pourquoi.
pourtant je crois avoir fait tout comme il faut... :(
gusdark [:)]
0
Rejoignez-nous