Afficher un message et changer d'image

Fermé
badboys54 - 23 janv. 2009 à 13:46
 badboys54 - 23 janv. 2009 à 17:57
Bonjour,
je suis en train de crée mon petit jeux video en 2d sdl et je voudrais que si le personnage et sur la meme case qu'un objetif sa affiche un message et au bout de 10 seconde sa change de niveau . quand j'essays sa ne m'affiche pas de message et sa ne change pas de niveau au bout de 10 seconde :
voila mon code :
#include <stdlib.h>
#include <stdio.h>
#include <SDL.h>
#include <SDL_image.h>
#include <SDL_ttf.h>


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


void jonnysolojouer(SDL_Surface* ecran)
{
    SDL_Surface *mario[4] = {NULL} , *texte = NULL ;// 4 surfaces pour chacune des directions de mario
    SDL_Surface *mur = NULL, *objectif = NULL, *marioActuel = NULL;
    SDL_Rect position, positionJoueur , objectifatteind , positiontexte ;
    SDL_Event event;
	   TTF_Font *police = NULL;
    SDL_Color couleurNoire = {0, 0, 0};
    int tempsPrecedent = 0, tempsActuel = 0;

    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("image/objet/mur.jpg");
    objectif = IMG_Load("image/objet/objectif.gif");
    mario[BAS] = IMG_Load("image/hero/DarkKnight-Front.gif");
    mario[GAUCHE] = IMG_Load("image/hero/DarkKnight-Left.gif");
    mario[HAUT] = IMG_Load("image/hero/DarkKnight-Back.gif");
    mario[DROITE] = IMG_Load("image/hero/darkknight gauche.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_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_r:
               jonnysolojouer(ecran);
                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 OBJECTIF:
                  SDL_BlitSurface(objectif, NULL, ecran, &position);
                 objectifsRestants = 1;
                 objectifatteind.x = position.x;
                 objectifatteind.y = position.y;
                        break;
                }
            }
        }

        // Si on n'a trouvé aucun objectif sur la carte, c'est qu'on a gagné
        	if(carte[positionJoueur.x][positionJoueur.y] == OBJECTIF)
			{
			positiontexte.x = 60;
            positiontexte.y = 370;
			police = TTF_OpenFont("angelina.ttf", 65);
			texte = TTF_RenderText_Blended(police, "Salut les Zér0s !", couleurNoire);
            SDL_BlitSurface(texte, NULL, ecran, &positiontexte); /* Blit du texte par-dessus */
            tempsPrecedent = tempsActuel;
            tempsActuel = SDL_GetTicks();
            if (tempsActuel - tempsPrecedent > 10000) /* Si 30 ms se sont écoulées depuis le dernier tour de boucle */
            {
            modesimple(ecran);
            }    
			}

        // 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);
    SDL_FreeSurface(texte);
    SDL_FreeSurface(mur);
    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
            

            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;


            

            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;


            

            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;

           

            pos->x++;
            break;
    }
}


ce sont ces lignes ou tous ce joue :
      	if(carte[positionJoueur.x][positionJoueur.y] == OBJECTIF)
			{
			positiontexte.x = 60;
            positiontexte.y = 370;
			police = TTF_OpenFont("angelina.ttf", 65);
			texte = TTF_RenderText_Blended(police, "Salut les Zér0s !", couleurNoire);
            SDL_BlitSurface(texte, NULL, ecran, &positiontexte); /* Blit du texte par-dessus */
            tempsPrecedent = tempsActuel;
            tempsActuel = SDL_GetTicks();
            if (tempsActuel - tempsPrecedent > 10000) /* Si 30 ms se sont écoulées depuis le dernier tour de boucle */
            {
            modesimple(ecran);
            }    
			}

merci

2 réponses

up personne ne peut m'aider
0
tite_tête13 Messages postés 125 Date d'inscription mardi 20 mai 2008 Statut Membre Dernière intervention 19 février 2010 3
23 janv. 2009 à 16:28
down, non dsl...
0
non serieusement personne a une idée j'ai vraiment bespin d'aide
0