Mouvement aléatoire d'un sprite avec sdl 2d en c

Signaler
Messages postés
4
Date d'inscription
mercredi 31 mars 2021
Statut
Membre
Dernière intervention
2 avril 2021
-
Messages postés
5491
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
2 avril 2021
-
Bonjour,
bonsoir je rencontre un probleme au niveau du devloppement de mon jeu 2d avec la bibliotheque sdl je suis debutant et je cherche de l'aide auprès de vous enfaite j essaye de faire un mouvement aleatoire pour mon sprite animé sauf que je n'arrive pas je n'arrive qu'avec la manipulation du clavier avez vous un bout de code qui pourra m'aider ou un prototype concret


Configuration: Windows / Chrome 89.0.4389.90

1 réponse

Messages postés
5491
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
2 avril 2021
932
Salut rio145885,

En gros, pour bouger quelque chose, tu l'effaces dans le buffer de l'affichage en préparation (le plus simple étant de de tout effacer) et tu le dessines ailleurs dans ce buffer (et redessines au même endroit ce qui ne bouge pas et que tu as aussi effacé), et lorsque tous les changements sont faits tu affiches. Tu fais cela à des intervalles de temps que tu définis.

Il y a quelques années, j'avais fait ceci :

https://forums.commentcamarche.net/forum/affich-34091100-sdl-faire-apparaitre-plusieurs-voiture-a-la-suite#14

pour un membre du forum qui utilisait la SDL 1.2.

C'est à adapter à la SDL2 (que tu devrais utiliser de nos jours), mais cela illustre les concepts et comment fonctionne la boucle principale, qui est courte, et distingue les fonctions de gestion des inputs, de déplacement des objets et d'animation.


Dal
Messages postés
4
Date d'inscription
mercredi 31 mars 2021
Statut
Membre
Dernière intervention
2 avril 2021

merci beaucoup pour votre aide !
Messages postés
4
Date d'inscription
mercredi 31 mars 2021
Statut
Membre
Dernière intervention
2 avril 2021

bonjour ,monsieur Dal j'ai ecrit ce code en c avec la bibliothéque sdl1.2 en 2D qui en gros présente un petit perso qui se déplace au long de l'écran
avec la gestion du clavier qui est en animation decoupé en frames mais je veux que le mouvement soit aléatoire c'est a dire sans la gestion d'autres éléments j'ai vu que c'était avec rand mais je n'y arrive pas qui restera bien sur en animation ainsi que le code de la collision est bel et bien écrit mais ne fonctionne pas le perso piétine l'image en question sachant qu'en compilant il n'y a aucune erreur . je serai vraiment reconnaissant de votre aide car je n'arrive pas par moi meme donc chercher l'aide auprès des plus expérimentés me semble la bonne solution merci !
le voila mon code :
#include <SDL/SDL_image.h>
#include <SDL/SDL.h>
#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL_ttf.h>
#include <signal.h>
#include <unistd.h>
#include <SDL/SDL_mixer.h>


#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
#define SPRITE_SIZE 32

int gameover;

/* source and destination rectangles */
SDL_Rect rcSrc, rcSprite;

void HandleEvent(SDL_Event event)
{
switch (event.type) {
/* close button clicked */
case SDL_QUIT:
gameover = 1;
break;

/* handle the keyboard */
case SDL_KEYDOWN:
switch (event.key.keysym.sym) {
case SDLK_ESCAPE:
case SDLK_q:
gameover = 1;
break;
case SDLK_LEFT:
if ( rcSrc.x == 192 )
rcSrc.x = 224;
else
rcSrc.x = 192;
rcSprite.x -= 5;
break;
case SDLK_RIGHT:
if ( rcSrc.x == 64 )
rcSrc.x = 96;
else
rcSrc.x = 64;
rcSprite.x += 5;
break;
case SDLK_UP:
if ( rcSrc.x == 0 )
rcSrc.x = 32;
else
rcSrc.x = 0;
rcSprite.y -= 5;
break;
case SDLK_DOWN:
if ( rcSrc.x == 128 )
rcSrc.x = 160;
else
rcSrc.x = 128;
rcSprite.y += 5;
break;
}
break;
}
}

int main ( int argc, char *argv[] )
{
SDL_Surface *screen, *temp, *sprite, *grass ,*hero;
SDL_Rect rcGrass ,rchero;
int colorkey;

/* initialize SDL */
SDL_Init(SDL_INIT_VIDEO);

/* set the title bar */
SDL_WM_SetCaption("ennemy", "ennemy");

/* create window */
screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0);

/* set keyboard repeat */
SDL_EnableKeyRepeat(70, 70);

/* load sprite */
temp = SDL_LoadBMP("sprite.bmp");
sprite = SDL_DisplayFormat(temp);
SDL_FreeSurface(temp);

/* setup sprite colorkey and turn on RLE */
colorkey = SDL_MapRGB(screen->format, 255, 0, 255);
SDL_SetColorKey(sprite, SDL_SRCCOLORKEY | SDL_RLEACCEL, colorkey);

/* load grass */
temp = SDL_LoadBMP("grass.bmp");
grass = SDL_DisplayFormat(temp);
SDL_FreeSurface(temp);

/* set sprite position */
rcSprite.x = 150;
rcSprite.y = 150;

/* set animation frame */
rcSrc.x = 128;
rcSrc.y = 0;
rcSrc.w = SPRITE_SIZE;
rcSrc.h = SPRITE_SIZE;

gameover = 0;

/* message pump */
while (!gameover)
{
SDL_Event event;

/* look for an event */
if (SDL_PollEvent(&event)) {
HandleEvent(event);
}

/* collide with edges of screen */
if ( rcSprite.x < 0 ) {
rcSprite.x = 0;
}
else if ( rcSprite.x > SCREEN_WIDTH-SPRITE_SIZE ) {
rcSprite.x = SCREEN_WIDTH-SPRITE_SIZE;
}
if ( rcSprite.y < 0 ) {
rcSprite.y = 0;
}
else if ( rcSprite.y > SCREEN_HEIGHT-SPRITE_SIZE ) {
rcSprite.y = SCREEN_HEIGHT-SPRITE_SIZE;
}

/* draw the grass */
for (int x = 0; x < SCREEN_WIDTH / SPRITE_SIZE; x++) {
for (int y = 0; y < SCREEN_HEIGHT / SPRITE_SIZE; y++) {
rcGrass.x = x * SPRITE_SIZE;
rcGrass.y = y * SPRITE_SIZE;
SDL_BlitSurface(grass, NULL, screen, &rcGrass);
}
}
/*initialize hero*/
hero = IMG_Load("hero.png");
rchero.x =0;
rchero.y =0;
SDL_BlitSurface(hero, NULL , screen, &rchero);

/* draw the sprite */
SDL_BlitSurface(sprite, &rcSrc, screen, &rcSprite);

/* update the screen */
SDL_UpdateRect(screen, 0, 0, 0, 0);
}

/* clean up */
SDL_FreeSurface(sprite);
SDL_FreeSurface(grass);
SDL_FreeSurface(hero);
SDL_Quit();

return 0;
}
Messages postés
5491
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
2 avril 2021
932 >
Messages postés
4
Date d'inscription
mercredi 31 mars 2021
Statut
Membre
Dernière intervention
2 avril 2021

Pour poster du code sur CCM, utilise le bouton code en cliquant sur le flèche pour choisir le langage. Sinon, c'est illisible.

Tes explications ne sont pas claires.

Dans ton code, tu sembles bouger la position de
sprite
par la pression des touches.

SI tu ne veux pas qu'il bouge selon les touches que tu presses ... ben... il ne faut pas coder du code qui le fasse :-)

Ensuite, tu parles de déplacements "aléatoires" et d'utilisation de rand. Si tu ne sais pas utiliser rand, vois la doc :

https://www.cplusplus.com/reference/cstdlib/rand/

Tu initialises srand au début de ton code (en dehors de ta boucle principale) et dans ta boucle tu utilises rand pour déterminer un mouvement "aléatoire" de ton personnage.

Note que ton mouvement, pour qu'il ait une cohérence ne peut être complètement aléatoire. Il pourrait être, par exemple, pendant n secondes (déterminé aléatoirement sur une plage de durées de 3 à 10 secondes, par exemple), je vais vers la droite, ou la gauche (deux choix à déterminer aléatoirement, voire 3 si le personnage peut aussi rester immobile) et lorsque je rencontre un obstacle, je repars dans la direction opposée. Si le personnage peut se déplacer dans plus de sens que vers la droite ou la gauche, tu pourras complexifier.