je suis louis lecuyer, j'ai 16 ans, et je suis en 2nd SN (Systèmes Numériques) et je programme par passion.
ici, je vais vous présenter mon jeu qui est un RPG 2D en programé en C (SDL) dans lequel on incarne rafael (sans trémat, on l'écrit a la portugaise ) qui se retrouve propulsé dans un autre monde inconnu, mais ce n'est pas le seul : des centaines de personnes sont tout autant désorientés que lui.
le code est encore pas très grand, mais genre "vraiment" pas très grand.
bref : passons au choses sérieuses : les objectifs et ce qui est déja fait :
objectifs :
une aventure (j'entends par là, plusieurs cartes. ça va vous parraitre annodin mais je n'ai pas trouvé le moyen de changer de carte quand le personnage est a un endroit précis (une porte par exemple))
des animations lors du déplacement
un système d'inventaire
des sauvegardes
des coffres
des combats (un mélange de tour par tour et de temps réel. j'entends par la qu'il y aura une sorte "d'arène" a chaque combat ou les actions seront en temps réel)
ce qui est déjà fait :
une première carte
le personnage et ces quatre direction
une fonction "déplacer joueur" (pas encore d'animations)
enfin bref, passons au code (beaucoup, genre BEAUCOUP inspiré de mario sokoban de m@teo)
main.c
/*
main.c
------
Par apecker
Rôle : menu du jeu. Permet de choisir entre l'éditeur et le jeu lui-même.
*/
#include <stdlib.h>
#include <stdio.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include "constantes.h"
#include "jeu.h"
int main(int argc, char *argv[])
{
SDL_Surface *ecran = NULL, *menu = NULL;
SDL_Rect positionMenu;
SDL_Event event;
int continuer = 1;
SDL_Init(SDL_INIT_VIDEO);
SDL_WM_SetIcon(IMG_Load("caisse.jpg"), NULL); // L'icône doit être chargée avant SDL_SetVideoMode
ecran = SDL_SetVideoMode(LARGEUR_FENETRE, HAUTEUR_FENETRE, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
SDL_WM_SetCaption("Mario Sokoban", NULL);
menu = IMG_Load("menu.jpg");
positionMenu.x = 0;
positionMenu.y = 0;
while (continuer)
{
SDL_WaitEvent(&event);
switch(event.type)
{
case SDL_QUIT:
continuer = 0;
break;
case SDL_KEYDOWN:
switch(event.key.keysym.sym)
{
case SDLK_ESCAPE: // Veut arrêter le jeu
continuer = 0;
break;
case SDLK_KP1: // Demande à jouer
jouer(ecran);
break;
}
break;
}
// Effacement de l'écran
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
SDL_BlitSurface(menu, NULL, ecran, &positionMenu);
SDL_Flip(ecran);
}
SDL_FreeSurface(menu);
SDL_Quit();
return EXIT_SUCCESS;
}
jeu.c
/*
jeu.c
-----
Par mateo21, pour Le Site du Zér0 (www.siteduzero.com)
Rôle : fonctions du jeu.
*/
#include <stdlib.h>
#include <stdio.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include "constantes.h"
#include "jeu.h"
void jouer(SDL_Surface* ecran)
{
SDL_Surface *mario[4] = {NULL}; // 4 surfaces pour chacune des directions de mario
SDL_Surface *sol = NULL, *mur1 = NULL, *mur2 = NULL, *caisse = NULL, *caisseOK = NULL, *objectif = NULL, *marioActuel = NULL, *parquet, *pauvreparquet1, *pauvreparquet2;
SDL_Surface *changementcarte = NULL;
SDL_Rect position, positionJoueur;
SDL_Event event;
int continuer = 1, objectifsRestants = 0, i = 0, j = 0;
int carte[NB_BLOCS_HAUTEUR][NB_BLOCS_LARGEUR] = {0};
// Chargement des sprites (décors, personnage...)
sol = IMG_Load("sol.png");
parquet = IMG_Load("parquet.png");
pauvreparquet1 = IMG_Load("pauvreparquet1.png");
pauvreparquet2 = IMG_Load("pauvreparquet2.png");
mur1 = IMG_Load("mur1.png");
mur2 = IMG_Load("mur2.png");
caisse = IMG_Load("caisse.jpg");
caisseOK = IMG_Load("caisse_ok.jpg");
mario[BAS] = IMG_Load("mario_bas.gif");
mario[GAUCHE] = IMG_Load("mario_gauche.gif");
mario[HAUT] = IMG_Load("mario_haut.gif");
mario[DROITE] = IMG_Load("mario_droite.gif");
marioActuel = mario[BAS]; // Mario sera dirigé vers le bas au départ
// Chargement du niveau
if (!chargerNiveau(carte))
exit(EXIT_FAILURE); // On arrête le jeu si on n'a pas pu charger le niveau
// Recherche de la position de Mario au départ
for (i = 0 ; i < NB_BLOCS_LARGEUR ; i++)
{
for (j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
{
if (carte[i][j] == MARIO) // Si Mario se trouve à cette position sur la carte
{
positionJoueur.x = i;
positionJoueur.y = j;
carte[i][j] = PARQUET;
}
}
}
// Activation de la répétition des touches
SDL_EnableKeyRepeat(100, 100);
while (continuer)
{
if (MARIO == carte[5][3])
{continuer = 0;}
SDL_WaitEvent(&event);
switch(event.type)
{
case SDL_QUIT:
continuer = 0;
break;
case SDL_KEYDOWN:
switch(event.key.keysym.sym)
{
case SDLK_ESCAPE:
continuer = 0;
break;
case SDLK_UP:
marioActuel = mario[HAUT];
deplacerJoueur(carte, &positionJoueur, HAUT);
break;
case SDLK_DOWN:
marioActuel = mario[BAS];
deplacerJoueur(carte, &positionJoueur, BAS);
break;
case SDLK_RIGHT:
marioActuel = mario[DROITE];
deplacerJoueur(carte, &positionJoueur, DROITE);
break;
case SDLK_LEFT:
marioActuel = mario[GAUCHE];
deplacerJoueur(carte, &positionJoueur, GAUCHE);
break;
}
break;
}
// Effacement de l'écran
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
// Placement des objets à l'écran
objectifsRestants = 0;
for (i = 0 ; i < NB_BLOCS_LARGEUR ; i++)
{
for (j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
{
position.x = i * TAILLE_BLOC;
position.y = j * TAILLE_BLOC;
switch(carte[i][j])
{
case SOL:
SDL_BlitSurface(sol, NULL, ecran, &position);
break;
case MUR1:
SDL_BlitSurface(mur1, NULL, ecran, &position);
break;
case MUR2:
SDL_BlitSurface(mur2, NULL, ecran, &position);
break;
case CAISSE:
SDL_BlitSurface(caisse, NULL, ecran, &position);
break;
case CAISSE_OK:
SDL_BlitSurface(caisseOK, NULL, ecran, &position);
break;
case OBJECTIF:
SDL_BlitSurface(sol, NULL, ecran, &position);
SDL_BlitSurface(objectif, NULL, ecran, &position);
objectifsRestants = 1;
break;
case PARQUET:
SDL_BlitSurface(parquet, NULL, ecran, &position);
break;
}
}
}
// On place le joueur à la bonne position
position.x = positionJoueur.x * TAILLE_BLOC;
position.y = positionJoueur.y * TAILLE_BLOC;
SDL_BlitSurface(marioActuel, NULL, ecran, &position);
SDL_Flip(ecran);
}
// Désactivation de la répétition des touches (remise à 0)
SDL_EnableKeyRepeat(0, 0);
// Libération des surfaces chargées
SDL_FreeSurface(mur1);
SDL_FreeSurface(mur2);
SDL_FreeSurface(parquet);
SDL_FreeSurface(pauvreparquet1);
SDL_FreeSurface(pauvreparquet2);
SDL_FreeSurface(caisse);
SDL_FreeSurface(caisseOK);
SDL_FreeSurface(objectif);
for (i = 0 ; i < 4 ; i++)
SDL_FreeSurface(mario[i]);
}
void deplacerJoueur(int carte[][NB_BLOCS_HAUTEUR], SDL_Rect *pos, int direction)
{
switch(direction)
{
case HAUT:
if (pos->y - 1 < 0) // Si le joueur dépasse l'écran, on arrête
break;
if (carte[pos->x][pos->y - 1] == MUR1) // S'il y a un mur, on arrête
break;
if ((carte[pos->x][pos->y - 1] == CAISSE || carte[pos->x][pos->y - 1] == CAISSE_OK) &&
(pos->y - 2 < 0 || carte[pos->x][pos->y - 2] == MUR1 ||
carte[pos->x][pos->y - 2] == CAISSE || carte[pos->x][pos->y - 2] == CAISSE_OK))
break;
pos->y--; // On peut enfin faire monter le joueur (oufff !)
break;
case BAS:
if (pos->y + 1 >= NB_BLOCS_HAUTEUR)
break;
if (carte[pos->x][pos->y + 1] == MUR1)
break;
pos->y++;
break;
case GAUCHE:
if (pos->x - 1 < 0)
break;
if (carte[pos->x - 1][pos->y] == MUR1)
break;
if (carte[pos->x - 1][pos->y] == MUR2)
break;
pos->x--;
break;
case DROITE:
if (pos->x + 1 >= NB_BLOCS_LARGEUR)
break;
if (carte[pos->x + 1][pos->y] == MUR1)
break;
if (carte[pos->x + 1][pos->y] == MUR2)
break;
pos->x++;
break;
}
}
void deplacerCaisse(int *premiereCase, int *secondeCase)
{
if (*premiereCase == CAISSE || *premiereCase == CAISSE_OK)
{
if (*secondeCase == OBJECTIF)
*secondeCase = CAISSE_OK;
else
*secondeCase = CAISSE;
if (*premiereCase == CAISSE_OK)
*premiereCase = OBJECTIF;
else
*premiereCase = SOL;
}
}
fichiers.c
/*
fichiers.c
----------
Par mateo21, pour Le Site du Zér0 (www.siteduzero.com)
Rôle : fonctions de lecture / écriture de fichiers de niveau.
*/
#include <stdlib.h>
#include <stdio.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include "constantes.h"
#include "fichiers.h"
int chargerNiveau(int niveau[][NB_BLOCS_LARGEUR])
{
FILE* fichier = NULL;
char ligneFichier[NB_BLOCS_HAUTEUR * NB_BLOCS_LARGEUR + 1] = {0};
int i = 0, j = 0;
fichier = fopen("niveaux.lvl", "r");
if (fichier == NULL)
return 0;
fgets(ligneFichier, NB_BLOCS_HAUTEUR * NB_BLOCS_LARGEUR + 1, fichier);
for (i = 0 ; i < NB_BLOCS_LARGEUR ; i++)
{
for (j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
{
switch (ligneFichier[(i * NB_BLOCS_LARGEUR) + j])
{
case '0':
niveau[j][i] = 0;
break;
case '1':
niveau[j][i] = 1;
break;
case '2':
niveau[j][i] = 2;
break;
case '3':
niveau[j][i] = 3;
break;
case '4':
niveau[j][i] = 4;
break;
case '5':
niveau[j][i] = 5;
break;
case '6':
niveau[j][i] = 6;
break;
case '7':
niveau[j][i] = 7;
break;
case '8':
niveau[j][i] = 8;
break;
}
}
}
fclose(fichier);
return 1;
}
int sauvegarderNiveau(int niveau[][NB_BLOCS_LARGEUR])
{
FILE* fichier = NULL;
int i = 0, j = 0;
fichier = fopen("niveaux.lvl", "w");
if (fichier == NULL)
return 0;
for (i = 0 ; i < NB_BLOCS_LARGEUR ; i++)
{
for (j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
{
fprintf(fichier, "%d", niveau[j][i]);
}
}
fclose(fichier);
return 1;
}
constantes.h
/*
constantes.h
------------
Par mateo21, pour Le Site du Zér0 (www.siteduzero.com)
Rôle : définit des constantes communes à tout le programme (taille de la fenêtre...)
*/
#ifndef DEF_CONSTANTES
#define DEF_CONSTANTES
#define TAILLE_BLOC 34 // Taille d'un bloc (carré) en pixels
#define NB_BLOCS_LARGEUR 12
#define NB_BLOCS_HAUTEUR 12
#define LARGEUR_FENETRE TAILLE_BLOC * NB_BLOCS_LARGEUR
#define HAUTEUR_FENETRE TAILLE_BLOC * NB_BLOCS_HAUTEUR
enum {HAUT, BAS, GAUCHE, DROITE};
enum {SOL, MUR1, MUR2, CAISSE, OBJECTIF, MARIO, CAISSE_OK, PARQUET, PAUVREPARQUET1, PAUVREPARQUET2, CHANGEMENTCARTE};
#endif
fichiers.h
/*
fichiers.h
----------
Par mateo21, pour Le Site du Zér0 (www.siteduzero.com)
Rôle : prototypes des fonctions de lecture / écriture de fichiers de niveau.
*/
#ifndef DEF_FICHIERS
#define DEF_FICHIERS
int chargerNiveau(int niveau[][NB_BLOCS_LARGEUR]);
int sauvegarderNiveau(int niveau[][NB_BLOCS_LARGEUR]);
#endif
jeu.h
/*
jeu.h
-----
Par mateo21, pour Le Site du Zér0 (www.siteduzero.com)
Rôle : prototypes des fonctions du jeu.
*/
#ifndef DEF_JEU
#define DEF_JEU
void jouer(SDL_Surface* ecran);
void deplacerJoueur(int carte[][NB_BLOCS_HAUTEUR], SDL_Rect *pos, int direction);
void deplacerCaisse(int *premiereCase, int *secondeCase);
#endif
je suis actuellement en recherche d'une "team" pour ce projet donc si vous êtes intéréssés, le DM est ouvert
[RPG] other world (français) (SDL)
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.