Création d'un jeu 2D en SDL

Fermé
Trager Messages postés 299 Date d'inscription samedi 8 septembre 2012 Statut Membre Dernière intervention 23 juillet 2017 - 4 mars 2015 à 13:03
Trager Messages postés 299 Date d'inscription samedi 8 septembre 2012 Statut Membre Dernière intervention 23 juillet 2017 - 5 mars 2015 à 20:07
Bonjour,
je debute la programmation et je me suis donné comme projet de créer un jeu 2D avec la bilbiothèque SDL.
Le jeu: en le lancant, on doit arriver dans la page d'acceuil qui demande de cliquer avec la souris pour lancer la partie
ensuite il y aura la possibilité de déplacer un personnnage en bas de l'ecran vers la gauche ou la droite en essayant d'esquiver des missiles le plus longtemps possible
ces missiles debuteront tous avec une position y de 0 mais un x aléatoire (un autre missile apparaitra touts les deux secondes)
si un missile touche le personnage, la partie s'arrete et on retourne à l'écran d'accueil.

Pour le moment je tente d'affiche rle menu puis la partie apres clic de la souris et de pouvoir déplacer le personnage mais ça ne marche pas:
#include <stdlib.h>
#include <stdio.h>
#include <SDL.h>
#include <time.h>
#define HEIGHT 600 // Hauteur
#define WIDTH 400 // Largeur

enum {GAUCHE, DROITE};

int continuer = 1;
SDL_Event event;

SDL_Surface *ecran = NULL, *menu = NULL, *perso[2] = {NULL}, *persoActuel = NULL, *missile = NULL; // 2 surfaces pour 2 directions du perso
SDL_Rect positionMenu, positionJoueur, positionMissile;

int tirage()
{
int i;
i=rand()%350;
return i;
}

void Init()
{



SDL_Init(SDL_INIT_VIDEO);
srand(time(NULL));
SDL_WM_SetIcon(SDL_LoadBMP("sdl_icone.bmp"), NULL);
SDL_WM_SetCaption("Projet-Jeu", NULL);

ecran = SDL_SetVideoMode(WIDTH, HEIGHT, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
menu = SDL_LoadBMP("menu.bmp");
perso[DROITE] = SDL_LoadBMP("perso.bmp");// Chargement des sprites (décors, personnage...)
perso[GAUCHE] = SDL_LoadBMP("perso2.bmp");
missile = SDL_LoadBMP("missile.bmp");
persoActuel = perso[DROITE];

positionMenu.x = 0;
positionMenu.y = 0;
positionJoueur.x = 180;
positionJoueur.y = 500;
positionMissile.x = tirage();
positionMissile.y = 0;

// Activation de la répétition des touches
SDL_EnableKeyRepeat(10, 10);

}

void switchEvent()
{
switch(event.type)
{
case SDL_QUIT:
continuer = 0;
break;

if (SDL_MOUSEBUTTONDOWN) // Demande à jouer



case SDL_KEYDOWN:
switch(event.key.keysym.sym)
{
case SDLK_ESCAPE:
continuer = 0;
break;
case SDLK_RIGHT:
persoActuel = perso[DROITE];
if (positionJoueur.x > 305)
break;
positionJoueur.x++;
break;
case SDLK_LEFT:
persoActuel = perso[GAUCHE];
positionJoueur.x--;
default:
break;
}
break;
}
}

void Actualisation()
{


}

void Affichage()
{
/* On efface l'écran */
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));

/* On place notre perso à sa nouvelle position */
SDL_BlitSurface(menu, NULL, ecran, &positionMenu);
SDL_BlitSurface(persoActuel, NULL, ecran, &positionJoueur);
SDL_BlitSurface(missile, NULL, ecran, &positionMissile);

/* On met à jour l'affichage */
SDL_Flip(ecran);


}

void GesFrame()
{


}

void Fin()
{
SDL_FreeSurface(persoActuel);
SDL_FreeSurface(missile);
SDL_FreeSurface(menu);
SDL_FreeSurface(ecran);

SDL_Quit();


}



int main(int argc, char *argv[])
{

Init();

while (continuer)
{
while (SDL_PollEvent(&event))
{
switchEvent(); // Traitement des évènements
}

Actualisation(); // Mise à jour des positions en fonction du traitement des évènements
Affichage(); // Blit puis Flip
GesFrame(); // Gestion du nombre d'affichages / seconde

}

Fin(); // Free, Quit ...

return EXIT_SUCCESS;
}




A voir également:

3 réponses

Trager Messages postés 299 Date d'inscription samedi 8 septembre 2012 Statut Membre Dernière intervention 23 juillet 2017
4 mars 2015 à 16:18
up?
0
dsy73 Messages postés 9252 Date d'inscription dimanche 22 août 2010 Statut Contributeur Dernière intervention 23 octobre 2020 2 476
5 mars 2015 à 05:35
Salut

"ça ne marche pas" : tu devrais donner plus de détails.
0
Trager Messages postés 299 Date d'inscription samedi 8 septembre 2012 Statut Membre Dernière intervention 23 juillet 2017
5 mars 2015 à 20:07
J'ai résolu les problèmes précédant et maintenant j'aimerais créer un tableau pour afficher plusieurs missiles à la fois, leur donner une vitesse vy et permettre l'apparition d'un nouveau missile toutes les deux secondes mais je ne vois pas comment y parvenir, où le placer, comment le définir... Auriez-vous des exemples, des conseils ou autres pour m'aider?

merci d'avance

mon code actuel:

#include <stdlib.h>
#include <stdio.h>
#include <SDL.h>
#include <time.h>
#define HEIGHT 600 // Hauteur
#define WIDTH 400 // Largeur

enum {GAUCHE, DROITE};
SDL_Event event;
SDL_Surface *ecran = NULL, *menu = NULL, *perso[2] = {NULL}, *persoActuel = NULL, *missile = NULL; // 2 surfaces pour 2 directions du perso
SDL_Rect positionMenu, positionJoueur, positionMissile, positionBouton1;
int continuer = 1;
int jouer = 1;
int nombreMissiles;

int tirage()
{
int i;
i=rand()%350;
return i;
}

void Init()
{
SDL_Init(SDL_INIT_VIDEO);
srand(time(NULL));
SDL_WM_SetIcon(SDL_LoadBMP("sdl_icone.bmp"), NULL);
SDL_WM_SetCaption("Projet-Jeu", NULL);

ecran = SDL_SetVideoMode(WIDTH, HEIGHT, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
menu = SDL_LoadBMP("menu.bmp");
perso[DROITE] = SDL_LoadBMP("perso.bmp");// Chargement des sprites (décors, personnage...)
perso[GAUCHE] = SDL_LoadBMP("perso2.bmp");
missile = SDL_LoadBMP("missile.bmp");
persoActuel = perso[DROITE];

positionBouton1.x = 97;
positionBouton1.y = 262;
positionMenu.x = 0;
positionMenu.y = 0;
positionJoueur.x = 180;
positionJoueur.y = 500;

// Activation de la répétition des touches
SDL_EnableKeyRepeat(10, 10);

}

void missiles()
{

positionMissile.x = tirage();
positionMissile.y = 0;
}


void Clic()
{
switch(jouer)
{
case 1:
{
if (event.button.button == SDL_BUTTON_LEFT)
if(event.button.x > positionBouton1.x && event.button.x < positionBouton1.x + 200 && event.button.y > positionBouton1.y && event.button.y < positionBouton1.y + 80) // Test des coordonnées de la souris pour savoir si ellessont au meme emplacement que le bouton 1
{
jouer=0;
}
}
break;
}
}

void switchEvent()
{
switch(event.type)
{
case SDL_QUIT:
continuer = 0;
break;
case SDL_MOUSEBUTTONUP:
Clic();
missiles();
break;
case SDL_KEYDOWN:
switch(event.key.keysym.sym)
{
case SDLK_ESCAPE:
jouer = 1;
break;
case SDLK_RIGHT:
persoActuel = perso[DROITE];
if (positionJoueur.x > 305)
break;
positionJoueur.x++;
break;
case SDLK_LEFT:
persoActuel = perso[GAUCHE];
positionJoueur.x--;
default:
break;
}
break;

}
}

void Actualisation()
{

}


void Affichage()
{
/* On efface l'écran */
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
SDL_BlitSurface(menu, NULL, ecran, &positionMenu);
if (jouer==0)
{
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
/* On place notre perso à sa nouvelle position */
SDL_BlitSurface(persoActuel, NULL, ecran, &positionJoueur);
SDL_BlitSurface(missile, NULL, ecran, &positionMissile);
}
if(continuer==0)
{
jouer = 1;
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
SDL_BlitSurface(menu, NULL, ecran, &positionMenu);
}
/* On met à jour l'affichage */
SDL_Flip(ecran);
}

void GesFrame()
{

}

void Fin()
{
SDL_FreeSurface(menu);
SDL_Quit();
}

int main(int argc, char *argv[])
{
Init();
while (continuer)
{
while (SDL_PollEvent(&event))
{
switchEvent(); // Traitement des évènements
}
Actualisation(); // Mise à jour des positions en fonction du traitement des évènements
Affichage(); // Blit puis Flip
GesFrame(); // Gestion du nombre d'affichages / seconde
}
Fin(); // Free, Quit ...
return EXIT_SUCCESS;
}
0