Salut tout le monde,

j'ai commencé un Shoot Em Up et déjà des soucis

Avant d'aller plus loin j'ai simplement essayé de déplacer un rectangle à l'écran avec les touches du clavier mais le résultat est vraiment pas propre, le rectangle "bave" de tous les cotés quand je le déplace (une partie du rectangle à du retard par rapport à l'autre partie)

Résultat ça me fait mal au crane au bout de 10secondes.
mon But est de faire un déplacement propre, clean, sans bavure

Voila merci d'avance pour votre aide

le 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
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <FMOD/fmod.h>
 
#define SCREEN_WIDTH 1024
#define SCREEN_HEIGHT 760
#define VAISSEAU_WIDTH 100
#define VAISSEAU_HEIGHT 50
#define MISSILE_WIDTH 20
#define MISSILE_HEIGHT 20
 
void delay(unsigned int);
 
int main(int argc, char *argv[])
{
    //Variables et structures
 
    unsigned int frameLimit = SDL_GetTicks() + 16;
 
    SDL_Surface *missile = NULL;
    SDL_Surface *vaisseau = NULL;
    SDL_Surface *background = NULL;
    SDL_Surface *screen = NULL;
    SDL_Event event;
 
    int continuer = 1;
 
    Uint32 couleurBackground = 0;
    Uint32 couleurVaisseau = 0;
    Uint32 couleurMissile = 0;
 
    FMOD_SYSTEM *system;
    FMOD_SOUND *shoot = NULL;
 
    SDL_Rect positionBackground;
    positionBackground.x = 0;
    positionBackground.y = 0;
    SDL_Rect positionVaisseau;
    positionVaisseau.x = 200;
    positionVaisseau.y = 150;
    SDL_Rect positionMissile;
    positionMissile.x = 0;
    positionMissile.y = 0;
 
    Uint8 *keystates;
 
    typedef struct Input
    {
        int up, down, right, left, attack;
    }Input;
 
    Input input = {0};
 
    //Initialisation SDL
 
    if (SDL_Init(SDL_INIT_VIDEO)!=0){
        fprintf(stderr, "Error : init sdl - %s\n", SDL_GetError());
        return EXIT_FAILURE;
    }
 
    screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 32, SDL_DOUBLEBUF|SDL_HWSURFACE);
 
    if(screen == NULL){
        fprintf(stderr, "Error : SetVideoMode - %s\n", SDL_GetError());
        return EXIT_FAILURE;
    }
 
    couleurBackground = SDL_MapRGB(screen->format, 200, 45, 18);
    couleurVaisseau = SDL_MapRGB(screen->format, 50, 50, 50);
    couleurMissile = SDL_MapRGB(screen->format, 100, 100, 100);
 
    background = SDL_CreateRGBSurface(SDL_HWSURFACE, SCREEN_WIDTH, SCREEN_HEIGHT, 32, 0, 0, 0, 0);
    vaisseau = SDL_CreateRGBSurface(SDL_HWSURFACE, VAISSEAU_WIDTH, VAISSEAU_HEIGHT, 32, 0, 0, 0, 0);
    missile = SDL_CreateRGBSurface(SDL_HWSURFACE, MISSILE_WIDTH, MISSILE_HEIGHT, 32, 0, 0, 0, 0);
 
    SDL_FillRect(background, NULL, couleurBackground);
    SDL_FillRect(vaisseau, NULL, couleurVaisseau);
    SDL_FillRect(missile, NULL, couleurMissile);
    SDL_EnableKeyRepeat(10,10);
 
    while(continuer)
    {
        while(SDL_PollEvent(&event));
        {
            if(event.type == SDL_QUIT)
            {
                continuer = 0;
            }
 
            keystates = SDL_GetKeyState(NULL);
 
            if (keystates[SDLK_UP])
            {
                positionVaisseau.y-=5;
            }
 
            if (keystates[SDLK_DOWN])
            {
                positionVaisseau.y+=5;
            }
 
            if (keystates[SDLK_LEFT])
            {
                positionVaisseau.x-=5;
            } 
 
            if (keystates[SDLK_RIGHT])
            {
                positionVaisseau.x+=5;
            }
 
            SDL_BlitSurface(background, NULL, screen, &positionBackground);
 
            SDL_BlitSurface(vaisseau, NULL, screen, &positionVaisseau);
            SDL_Flip(screen);
            delay(frameLimit);
        }
    }
    SDL_FreeSurface(background);
    SDL_FreeSurface(vaisseau);
    SDL_FreeSurface(missile);
 
    SDL_Quit();
    return EXIT_SUCCESS;
}
 
void delay(unsigned int frameLimit)
{
    unsigned int ticks = SDL_GetTicks();
 
    if (frameLimit < ticks)
    {
        return;
    }
 
    if (frameLimit > ticks + 16)
    {
        SDL_Delay(16);
    }
 
    else
    {
        SDL_Delay(frameLimit - ticks);
    }
}
Sinon je souvent disponible sur l'Anochat, A++++ et encore merci