Planches ne bougeant pas ping pong SDL langage C

Résolu
Douglasmcdo Messages postés 10 Date d'inscription   Statut Membre Dernière intervention   -  
Douglasmcdo Messages postés 10 Date d'inscription   Statut Membre Dernière intervention   -

Bonjour,

Je travaille avec la SDL 2.0.14 en Langage C et j'essaie de faire un jeu de ping-pong.

Tout d'abord, je crée la fenêtre et le rendu.

Ensute, je crée un tableau de type SDL_Rect constitué de 2 planches.

Après, je crée une variable de type SDL_Event pour le cas où :

1. je quitte le programme soit avec la touche Escape, soit en appuyant sur la croix en haut à droite.

2. j'appuie sur la flèche du haut ou du bas pour la planche de gauche.

3.j'appuie sur la touche U ou la touche D pour la planche de droite.

Normalement, je m'attendais à faire bouger les planches de haut en bas. Sauf qu-en exécutant mon programme, je constate que les planches ne font que de s'allonger.

Mon code :

#include <SDL2/SDL.h>
#include <stdio.h>
#include <stdlib.h>

SDL_Rect planche[2] = {
		{40, 450,10, 100},
		{960,450, 10, 100}
};

void SDL_Erreur(const char *erreur)
{
	printf("%s : %s", erreur, SDL_GetError());
	exit(1);
}
int main (int argc, char *argv[])
{
	SDL_Event event;
	SDL_Window *fenetre;
	SDL_Renderer *rendu;
	if (SDL_Init(SDL_INIT_EVERYTHING) != 0)
	{
		SDL_Erreur("Erreur d'initialisation");
	}
	fenetre = SDL_CreateWindow("SDL Test", 0, 0, 1000, 1000, SDL_WINDOW_SHOWN);
	rendu = SDL_CreateRenderer(fenetre, -1, SDL_RENDERER_ACCELERATED);
	if (fenetre == NULL || rendu == NULL)
	{
		SDL_Erreur("Impossible d'initialiser la fenêtre et le rendu");
	}
	if (SDL_SetRenderDrawColor(rendu, 255, 255, 255, 245) != 0)
	{
		SDL_Erreur("Erreur d'initialisation de couleurs");
	}
	SDL_bool vrai = SDL_TRUE;
	while (vrai)
	{
		while (SDL_PollEvent(&event))
		{
			switch (event.type)
			{
				case SDL_QUIT:
					vrai = SDL_FALSE;
					break;
				case SDL_KEYDOWN:
					switch (event.key.keysym.sym)
					{
						case SDLK_ESCAPE:
							vrai = SDL_FALSE;
						case SDLK_UP:
							planche[0].y-=5;
							break;
						case SDLK_DOWN:
							planche[0].y+=5;
							break;
						case SDLK_u:
							planche[1].y-=5;
							break;
						case SDLK_d:
							planche[1].y+=5;
							break;
						default:
							break;
					}
					if (SDL_RenderFillRects(rendu, planche, 2) != 0)
					{
						SDL_Erreur("Impossible d'initialiser les planches");
					}
					SDL_RenderPresent(rendu);
			}
		}
	}
	SDL_DestroyRenderer(rendu);
	SDL_DestroyWindow(fenetre);
	SDL_Quit();
	return 0;
}
A voir également:

5 réponses

Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 

Bonjour,

Normal : tu ne fais que modifier la coordonnée Y de la planche, pas sa position

0
Douglasmcdo Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
 

Mais normalement c'est pas les coordonnées qui définissent sa position ?

0
Douglasmcdo Messages postés 10 Date d'inscription   Statut Membre Dernière intervention   > Douglasmcdo Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
 

J'ai finalement découvert le problème : ma planche peut bouger mais laisse un tracé derrière elle

0
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 

Normalement ...

0
Dalfab Messages postés 706 Date d'inscription   Statut Membre Dernière intervention   101
 

Ta planche est quelque part, tu dessines ta planche.
Ta planche va ailleurs, tu dessines ta planche.

Ce que tu vois, c'est tout ce que tu as dessiné!...

0
Douglasmcdo Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
 

Mais cela ne résout pas du tout mon problème

0
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 

Bonjour,

Ne faudrait-il pas effacer puis ré afficher la planche à sa nouvelle position ?

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 104
 

Phil_1857 à écrit :

Ne faudrait-il pas effacer puis ré afficher la planche à sa nouvelle position ?

Oui. Il faut même effacer l'écran avec SDL_RenderClear(), car SDL_RenderPresent() invalide le contenu du backbuffer sur lequel la SDL2 dessine.

https://wiki.libsdl.org/SDL_RenderPresent

Pour résoudre le problème, il faut donc :

  • effacer le contenu du buffer avec la couleur de fond choisie (le noir) dans la boucle d'animation (en début de boucle)
SDL_SetRenderDrawColor(rendu, 0, 0, 0, 255);
SDL_RenderClear(rendu);
  • remettre la couleur de dessin au blanc choisi par Douglasmcdo avant de dessiner les "planches" (blanches)
SDL_SetRenderDrawColor(rendu, 255, 255, 255, 245) != 0;
SDL_RenderFillRects(rendu, planche, 2);

Appeler SDL_RenderPresent() pour rendre (afficher) le contenu du buffer après qu'on ait dessiné ce qu'il fallait dedans, et avant de boucler de nouveau dans la boucle d'animation

SDL_RenderPresent(rendu);

(Douglasmcdo le faisait déjà)

Cela serait une bonne idée de temporiser la boucle pour éviter au programme de consommer trop de temps processeur, en faisant une gestion du temps avec SDL_GetTicks() et SDL_Delay(), mais déjà, avec les changements mentionnés ci-dessus, le programme SDL2 de Douglasmcdo devrait se comporter comme il l'attend.

Donc, le truc à comprendre c'est que l'écran est redessiné entièrement à chaque tour de la boucle d'animation.

C'est comme cela que tu donnes l'illusion que les éléments sur ton écran "bougent".

0
Douglasmcdo Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
 

Merci beaucoup,

Grâce à toi, mon problème est résolu

0