Problme langage c joueur objectif

badboys54 -  
 Utilisateur anonyme -
Bonjour,
je suis en train de realiser mon petit jeu en 2d et je voudrais que si le personnage se trouve sur la meme case qu'un objectif le jeux affiche un message bravo et que sa passe au niveau superieur mais je ne sais pas comment faire pour afficher un message si le joueur et sur la meme case que un objectif .
merci
A voir également:

22 réponses

Utilisateur anonyme
 
avec la SDL ??
0
badboys54
 
oui j'ai imaginer ce code mais sa ne marche pas :
if (mario=objectif)
continuer = 0;
si mario ( le nom du joueur ) et egale a objectif alors sa arrete mais moi se que je voudrais c'est que si mario se trouve sur un objectif ( au meme emplacement ) alors sa affiche bravo et sa passe au 2 e niveau
0
Utilisateur anonyme
 
Deja ca serait if(mario == objectif)

Bon en fait le probleme c'est que tu sais pas comment faire pour gerer plusieurs niveau dans ton jeu ??
0
badboys54
 
si sa je sais faire mais que si mario est sur la meme case qu'un objectif alors sa affiche bravo et sa change de niveau je ne sais pas faire . ce que je ne sais pas c'est afficher le bravo si mario est sur un objectif et chnager de niveau
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
 
Ben pour savoir si mario est sur la meme case, tu compare sa position avec la position de la case de l'obj. Normalement t'as une variable type SDL_Rect qui contient la position de mario. S'ils il est dessus t'affiche une image au milieu de l'ecran avec ecrit bravo... (pendant 3secondes par exemple et apres tu supprimes l'image)

Ensuite si tu sais gerer les niveau tu dois savoir ce qu'est un fichier de niveau, et comment le charger, donc apres avoir afficher bravo tu charge le fichier de niveau suivant
0
badboys54
 
ok voici la variable mario :
SDL_Surface *mario[4] = {NULL};
donc je fais :
if (mario==objectif)
la j'ecrire bravo ;
et apres je charge c'est sa
0
badboys54
 
ok voici la variable mario :
SDL_Surface *mario[4] = {NULL};
donc je fais :
if (mario==objectif)
la j'ecrire bravo ;
et apres je charge c'est sa
0
Utilisateur anonyme
 
Nan normalement pour positionner mario t'as une variable de type SDL_Rect pas SDL_surface

on va dire que posmario est la position de mario et posobj est la position de l'objectif:

if(posmario.x == posobj.x && posmario.y == posobj.y)
//ici t'affiche bravo
et tu charge le nouveau niveau


apres ca peut dependre de la facon dont tu deplace mario
0
badboys54
 
ok merci je vais essayer mais voila que sa m'affiche un ecran tous blanc a la place de m'affiche l'ecran de jeu , pourquoi . voila le code du jeu ( il est long ) :
#include <stdlib.h>
#include <stdio.h>
#include <SDL.h>
#include <SDL_image.h>

#include "fichier.h"
#include "jonnysolojouer.h"
#include "fichiers.h"


void jonnysolojouer(SDL_Surface* ecran)
{
    SDL_Surface *mario[4] = {NULL}; // 4 surfaces pour chacune des directions de mario
    SDL_Surface *mur = NULL, *caisse = NULL, *caisseOK = NULL, *objectif = NULL, *marioActuel = NULL;
    SDL_Rect position, positionJoueur;
    SDL_Event event;

    int continuer = 1, objectifsRestants = 0, i = 0, j = 0;
    int carte[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR] = {0};

    // Chargement des sprites (décors, personnage...)
    mur = IMG_Load("mur.jpg");
    caisse = IMG_Load("caisse.jpg");
    caisseOK = IMG_Load("caisse_ok.jpg");
    objectif = IMG_Load("objectif.png");
    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] = VIDE;
            }
        }
    }

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

    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:
                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 MUR:
                        SDL_BlitSurface(mur, 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(objectif, NULL, ecran, &position);
                        objectifsRestants = 1;
                        break;
                }
            }
        }

        // Si on n'a trouvé aucun objectif sur la carte, c'est qu'on a gagné
        if (!objectifsRestants)
            continuer = 0;

        // 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(mur);
    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] == MUR) // S'il y a un mur, on arrête
                break;
            // Si on veut pousser une caisse, il faut vérifier qu'il n'y a pas de mur derrière (ou une autre caisse, ou la limite du monde)
            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] == MUR ||
                carte[pos->x][pos->y - 2] == CAISSE || carte[pos->x][pos->y - 2] == CAISSE_OK))
                break;

            // Si on arrive là, c'est qu'on peut déplacer le joueur !
            // On vérifie d'abord s'il y a une caisse à déplacer
            deplacerCaisse(&carte[pos->x][pos->y - 1], &carte[pos->x][pos->y - 2]);

            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] == MUR)
                break;

            if ((carte[pos->x][pos->y + 1] == CAISSE || carte[pos->x][pos->y + 1] == CAISSE_OK) &&
                (pos->y + 2 >= NB_BLOCS_HAUTEUR || carte[pos->x][pos->y + 2] == MUR ||
                carte[pos->x][pos->y + 2] == CAISSE || carte[pos->x][pos->y + 2] == CAISSE_OK))
                break;


            deplacerCaisse(&carte[pos->x][pos->y + 1], &carte[pos->x][pos->y + 2]);

            pos->y++;
            break;


        case GAUCHE:
            if (pos->x - 1 < 0)
                break;
            if (carte[pos->x - 1][pos->y] == MUR)
                break;

            if ((carte[pos->x - 1][pos->y] == CAISSE || carte[pos->x - 1][pos->y] == CAISSE_OK) &&
                (pos->x - 2 < 0 || carte[pos->x - 2][pos->y] == MUR ||
                carte[pos->x - 2][pos->y] == CAISSE || carte[pos->x - 2][pos->y] == CAISSE_OK))
                break;


            deplacerCaisse(&carte[pos->x - 1][pos->y], &carte[pos->x - 2][pos->y]);

            pos->x--;
            break;


        case DROITE:
            if (pos->x + 1 >= NB_BLOCS_LARGEUR)
                break;
            if (carte[pos->x + 1][pos->y] == MUR)
                break;

            if ((carte[pos->x + 1][pos->y] == CAISSE || carte[pos->x + 1][pos->y] == CAISSE_OK) &&
                (pos->x + 2 >= NB_BLOCS_LARGEUR || carte[pos->x + 2][pos->y] == MUR ||
                carte[pos->x + 2][pos->y] == CAISSE || carte[pos->x + 2][pos->y] == CAISSE_OK))
                break;

            deplacerCaisse(&carte[pos->x + 1][pos->y], &carte[pos->x + 2][pos->y]);

            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 = VIDE;
    }
}

0
Utilisateur anonyme
 
Attend t'es entrain de refaire le Mario Sokoban du site du zero, t'as le code tout fait sur le site du zero et tu trouve le moyen de poser des question ici ?
0
badboys54
 
non non c'est le "code de base" je vais le modifier mais j'ai des erreur
0
badboys54
 
je veux faire un autre jeux mais comme base je m'aide de sa mais sa na rien a voire
0
Utilisateur anonyme
 
J'arrive pas à me faire aux codes sources des autres. Cherche un peu la ou t'as changer des choses, regarde les sdl_blitsurface, sdl_fip si ils sont bien placé...

Le mieux de tout serait de faire un jeu qui vienne de toi (il y en a des facile a faire comme Snake, pacman, un spaceshooter, ...)

pour code de base prend pluto celui ou il est quesiton de bouger zozor. T'enleve tou ce qui concerne zozor et tu fais ton truc
0
badboys54
 
oui mais comme j'ai dis c'est le code source apres je vais le modifier pour crée un autre jeux
0
Utilisateur anonyme
 
pour code de base prend pluto celui ou il est quesiton de bouger zozor. T'enleve tou ce qui concerne zozor et tu fais ton truc
0
badboys54
 
ok mais sa m'affiche toujours le probleme avec 'ecran blanc je ne sais pas pourquoii sa m'affiche un ecran blanc
0
Utilisateur anonyme
 
moi non plus
0
badboys54
 
j'ai reolu mon probleme de fichier ( c'etait un mauvais placement des fichier ) mais pas monprobleme de condition . je me suis arreter avec sa :
if(positionJoueur.x == OBJECTIF && positionJoueur.y == OBJECTIF)
continuer = 0;
j'ai mis continue=0 mais ensuit je changerais c'est pour voir sic sa marche mais sa ne marche pas
je n'ai pas pas de position y et x pour objet
0
Utilisateur anonyme
 
OBJECTIF doit etre une position...
0
badboys54
 
j'ai essayer de refaire le code un petit peu mieux mais sa ne marche toujours pas le voila :
case OBJECTIF:
SDL_BlitSurface(objectif, NULL, ecran, &position);
objectifsRestants = 1;
objectifatteind.x = position.x;
objectifatteind.y = position.y; // je voulais que objectifatteinds est la meme valeur que position.x et position.y

et apres j'ai modifier sa :
if(positionJoueur.x == objectifatteind.x && positionJoueur.y == objectifatteind.y)
continuer = 0;

mais sa ne marche toujours pas !
0