Bonjour/Bonsoir tout le monde, j'ai un petit problème avec les déplacements et le delta time, c'est très étrange et je n'arrive pas à me l'expliquer alors peut être que je m'y prends mal...
Voici comment je le calcul au début de la boucle principale :
Le calcul est bon selon moi et je m'en sert même pour un timer qui fonctionne nickel.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 delta_time = (SDL_GetTicks() - ticks_count) / 1000.0f; ticks_count = SDL_GetTicks();
Et voici à peu près à quoi ressemble ma fonction de déplacement :
Mais voilà, j'ai remarqué que la vers la droite et vers le bas vont moins vite que vers le haut et vers la gauche (donc les += vont moins vite que les -=).
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 if (keyState[SDL_SCANCODE_UP]) { if (!keyState[SDL_SCANCODE_LEFT] || !keyState[SDL_SCANCODE_RIGHT]) rect.y -= 200 * delta_time; else rect.y -= 100 * delta_time; } else if (keyState[SDL_SCANCODE_DOWN]) { if (!keyState[SDL_SCANCODE_LEFT] || !keyState[SDL_SCANCODE_RIGHT]) rect.y += 200 * delta_time; else rect.y += 100 * delta_time; } if (keyState[SDL_SCANCODE_LEFT]) { if (!keyState[SDL_SCANCODE_UP] || !keyState[SDL_SCANCODE_DOWN]) rect.x -= 200 * delta_time; else rect.x -= 100 * delta_time; } else if (keyState[SDL_SCANCODE_RIGHT]) { if (!keyState[SDL_SCANCODE_UP] || !keyState[SDL_SCANCODE_DOWN]) rect.x += 200 * delta_time; else rect.x += 100 * delta_time; } }
Alors j'ai fais pas mal de tests, dont par exemple mettre le "200 * dt" dans une varaible et faire le boulot ensuite mais c'etait exactement pareil.
Puis j'ai aussi remarqué qu'en reduisant la vitesse (par exemple de 200 à 50) ça se déplaçait aux "-=" mais plus dutout aux "+=" et là je ne comprends plus dutout pourquoi.
J'ai eu pas mal d'hypothèse mais qui se sont révélées fausses ou juste deviennent absurdes, c'est pour cela que je m'en retourne à vous, voilà tout...
Je vous remercie d'avance si vous avez des avis ou solutions !
EDIT: Petit exemple en C que je viens de faire pour que vous puissiez essayé et c'est bien flagrant, en tout cas chez moi... (encore plus que mon jeu en C++ alors que je n'ai pas changer les valeurs, bizarre...)
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 #include <stdlib.h> #include <stdio.h> #include <stdint.h> #include <SDL2/SDL.h> #define WIN_W 640 #define WIN_H 480 int main (int argc, char** argv) { (void) argc; (void) argv; /* Initialisation de SDL */ if (SDL_Init (SDL_INIT_VIDEO) < 0) { fprintf(stderr, "ERROR: %s", SDL_GetError()); return 1; }; SDL_Window* win = SDL_CreateWindow ("Test mouvement avec delta time", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WIN_W, WIN_H, 0); if (!win) { fprintf(stderr, "ERROR: %s", SDL_GetError()); return 1; } SDL_Renderer* ren = SDL_CreateRenderer (win, -1, SDL_RENDERER_ACCELERATED); SDL_Event event; /* Valeurs du programme */ SDL_Rect rect = {(WIN_W-64)/2, (WIN_H-64)/2, 64, 64}; uint32_t ticks_count = SDL_GetTicks(); float delta_time; const uint8_t* keyState = SDL_GetKeyboardState(NULL); SDL_bool running = SDL_TRUE; /* Execution du programme */ while (running) { /* Calcul du delta time */ delta_time = (SDL_GetTicks() - ticks_count) / 1000.0f; ticks_count = SDL_GetTicks(); /* Evenements SDL */ while (SDL_PollEvent(&event)) running = event.type != SDL_QUIT; SDL_PumpEvents(); /* Déplacement du rectangle */ if (keyState[SDL_SCANCODE_UP]) { if (!keyState[SDL_SCANCODE_LEFT] || !keyState[SDL_SCANCODE_RIGHT]) rect.y -= 200 * delta_time; else rect.y -= 100 * delta_time; } else if (keyState[SDL_SCANCODE_DOWN]) { if (!keyState[SDL_SCANCODE_LEFT] || !keyState[SDL_SCANCODE_RIGHT]) rect.y += 200 * delta_time; else rect.y += 100 * delta_time; } if (keyState[SDL_SCANCODE_LEFT]) { if (!keyState[SDL_SCANCODE_UP] || !keyState[SDL_SCANCODE_DOWN]) rect.x -= 200 * delta_time; else rect.x -= 100 * delta_time; } else if (keyState[SDL_SCANCODE_RIGHT]) { if (!keyState[SDL_SCANCODE_UP] || !keyState[SDL_SCANCODE_DOWN]) rect.x += 200 * delta_time; else rect.x += 100 * delta_time; } /* Rendu du programme */ SDL_SetRenderDrawColor(ren, 0, 0, 0, 255); SDL_RenderClear(ren); SDL_SetRenderDrawColor(ren, 255, 255, 255, 255); SDL_RenderFillRect(ren, &rect); SDL_RenderPresent(ren); } /* Closing the program */ SDL_DestroyRenderer(ren); SDL_DestroyWindow(win); SDL_Quit(); return 0; }
Partager