Partage
  • Partager sur Facebook
  • Partager sur Twitter

[RPG] other world (français) (SDL)

un petit RPG de ma création

    12 juillet 2017 à 18:02:26

    tout d'abord, bonjour a tous.

    ensuite, présentation :

    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 :lol:) 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
    

    niveaux.lvl

    222222222222222222222222111111111111777777777777757777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777
    

    je suis actuellement en recherche d'une "team" pour ce projet donc si vous êtes intéréssés, le DM est ouvert;)


    • Partager sur Facebook
    • Partager sur Twitter

    [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.
    • Editeur
    • Markdown