Mouvement aléatoire d'un sprite avec sdl 2d en c
Fermé
rio145885
Messages postés
3
Date d'inscription
mercredi 31 mars 2021
Statut
Membre
Dernière intervention
2 avril 2021
-
31 mars 2021 à 20:09
[Dal] Messages postés 6204 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 27 février 2025 - 2 avril 2021 à 21:37
[Dal] Messages postés 6204 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 27 février 2025 - 2 avril 2021 à 21:37
A voir également:
- Mouvement aléatoire d'un sprite avec sdl 2d en c
- Plan 2d gratuit - Télécharger - Architecture & Déco
- 37 2d 3f 3d 31 - Guide
- Enregistrer mouvement souris reproduire - Télécharger - Divers Utilitaires
- Tirage au sort excel aléatoire sans doublon ✓ - Forum Excel
- Recommande 2d ✓ - Forum Logiciels
1 réponse
[Dal]
Messages postés
6204
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
27 février 2025
1 099
1 avril 2021 à 11:41
1 avril 2021 à 11:41
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
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
2 avril 2021 à 14:43
2 avril 2021 à 17:33
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;
}
Modifié le 2 avril 2021 à 21:38
Tes explications ne sont pas claires.
Dans ton code, tu sembles bouger la position de 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.