Planches ne bougeant pas ping pong SDL langage C

Résolu/Fermé
Douglasmcdo Messages postés 10 Date d'inscription vendredi 26 août 2022 Statut Membre Dernière intervention 28 novembre 2023 - Modifié le 26 août 2022 à 15:00
Douglasmcdo Messages postés 10 Date d'inscription vendredi 26 août 2022 Statut Membre Dernière intervention 28 novembre 2023 - 2 sept. 2022 à 21:08

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 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
26 août 2022 à 15:35

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 vendredi 26 août 2022 Statut Membre Dernière intervention 28 novembre 2023
26 août 2022 à 15:55

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

0
Douglasmcdo Messages postés 10 Date d'inscription vendredi 26 août 2022 Statut Membre Dernière intervention 28 novembre 2023 > Douglasmcdo Messages postés 10 Date d'inscription vendredi 26 août 2022 Statut Membre Dernière intervention 28 novembre 2023
26 août 2022 à 17:30

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 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
Modifié le 26 août 2022 à 16:57

Normalement ...

0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
26 août 2022 à 18:26

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 vendredi 26 août 2022 Statut Membre Dernière intervention 28 novembre 2023
2 sept. 2022 à 16:04

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

0
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
2 sept. 2022 à 17:04

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 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 2 sept. 2022 à 18:44

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 vendredi 26 août 2022 Statut Membre Dernière intervention 28 novembre 2023
2 sept. 2022 à 21:08

Merci beaucoup,

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

0