Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme avec SDL.

23 juin 2017 à 0:59:51

Bonjour

Depuis 5jour maintenant j'essaye de trouver ce qui clauche dans mon programme mais je ne le trouve pas le probleme est que Quand je compile le programme tous se passe a merveille mais quand je le  lance ma fenetre s'ouvre et se ferme alor que je n'est pas fait d'event pour ca de plus elle me fais un return 3 et c'est pareil pour un autre programme enfin presque quand je met cd.bmp (l'image que ta de base quand tu créé un nouveau Projet SDL tous ce passe bien mais quand  je change d'image la fenetre s'ouvre et se ferme et l'invite de commande me met un return 3 :|

Bref si quelqu'un peut m'aider car si sa continue comme ca je ne pourais plus faire de jeu

Voila mon Programmme principale au cas ou il y'a un probleme :

(celui qui me dit de faire des fonction je le TrUci..... c'est lisible OK):

main.c :

#include <stdlib.h>

#include <stdio.h>

#include <SDL/SDL.h>

#include <SDL/SDL_ttf.h>

#include <SDL/SDL_image.h>

#include "Hider.h"


typedef int bool;

#define true 1

#define false 0

int Money;

int main(int argc, char *argv[])
{
    SDL_Surface *ecran = NULL;
    SDL_Surface *Curseur = NULL;
    SDL_Surface *Fond = NULL;
    SDL_Surface *Menu = NULL;
    SDL_Surface *OpenMenu = NULL;
    SDL_Surface *Ennemy = NULL;
    SDL_Surface *Argent = NULL;
    SDL_Surface *AffLife = NULL;
    SDL_Surface *Nameaff = NULL;
    SDL_Surface *End = NULL;

    FILE *fic = NULL;
    FILE *Name =NULL;

    TTF_Font *police = NULL;
    SDL_Color CouleurArgent = {248 , 253, 30};
    SDL_Color CouleurVie = {255 , 10, 10};

    int i = 0;
    char MonPf[20] = "";
    int Live = 4;
    char Life[20] = "";
    char RetName[20] = "";
    int Y = 200;

    SDL_Rect positionFond;
    SDL_Rect PosMenu;
    SDL_Rect PosOpen;
    SDL_Rect Curs;
    int boucle = 1;

    SDL_Event event;

    SDL_Rect EnnemyPod;
    SDL_Rect ArgentPos;
    SDL_Rect Lifepos;
    SDL_Rect NamePos;


    Curs.x = 0;
    Curs.y = 0;

    positionFond.x = 0;
    positionFond.y = 0;

    PosMenu.x = 700;
    PosMenu.y = 0;

    PosOpen.x = 400;
    PosOpen.y = 5;

    EnnemyPod.x = 0;
    EnnemyPod.y = 300;

    ArgentPos.x = 500;
    ArgentPos.y = 10;

    Lifepos.x = 500;
    Lifepos.y = 50;

    NamePos.x = 300;
    NamePos.y = 10;

    SDL_Init(SDL_INIT_VIDEO);

    TTF_Init();
    police = TTF_OpenFont("AlphaWood.ttf", 22);

    ecran = SDL_SetVideoMode(1000 , 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
    Fond = SDL_LoadBMP("FondBunker.bmp");
    Menu = SDL_LoadBMP("Menu.bmp");
    OpenMenu = SDL_LoadBMP("MenuClic.bmp");
    Curseur = SDL_LoadBMP("Curseur.bmp");
    End = SDL_LoadBMP("Game Over.bmp");

    fic = fopen("Money.txt", "r+");
    Name = fopen("Name.txt", "r+");


    Ennemy = SDL_LoadBMP("Ennemy.bmp");
    SDL_SetColorKey(Ennemy, SDL_SRCCOLORKEY, SDL_MapRGB(Ennemy -> format, 255, 255, 255));



    SDL_WM_SetCaption("Gun Army", NULL);
    SDL_WM_SetIcon(SDL_LoadBMP("Sprite Soldier.bmp"), NULL);
    SDL_SetColorKey(Curseur, SDL_SRCCOLORKEY, SDL_MapRGB(Curseur -> format , 255, 255, 255));
    SDL_SetAlpha(Menu , SDL_SRCALPHA, 0);
    SDL_BlitSurface(Menu , NULL, ecran, &PosMenu);
    SDL_ShowCursor(SDL_DISABLE);

    fgets(RetName, 20, Name);

    SDL_Flip(ecran);

    //Début

    while(boucle)
    {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
        case SDL_QUIT:
            boucle = 0;
            break;

        case SDL_MOUSEMOTION:
            Curs.x = event.motion.x - (Curseur -> w / 2);
            Curs.y = event.motion.y - (Curseur -> h / 2);
            SDL_Delay(5);
            break;
        case SDL_MOUSEBUTTONDOWN:
            switch(event.button.button)
            {
            case SDL_BUTTON_RIGHT:
                CollisionMenu(event.motion.x , event.motion.y, PosOpen, Menu);
                break;
            case SDL_BUTTON_LEFT:
                CollisionEnnemy(event.motion.x, event.motion.y, EnnemyPod, Ennemy, &Y, &Money);
                break;
            }
            break;
        }
        sprintf(MonPf , "Money : %d", Money);
        sprintf(Life , "Life = %d", Live);
        Argent = TTF_RenderText_Solid(police , MonPf, CouleurArgent);
        AffLife = TTF_RenderText_Solid(police, Life, CouleurVie);
        Nameaff = TTF_RenderText_Blended(police, RetName, CouleurVie);

        SDL_BlitSurface(Fond , NULL, ecran, &positionFond);

        SDL_BlitSurface(Ennemy, NULL, ecran, &EnnemyPod);
        SDL_BlitSurface(Menu , NULL, ecran, &PosMenu);
        SDL_BlitSurface(OpenMenu, NULL, ecran, &PosOpen);
        SDL_BlitSurface(Argent , NULL, ecran, &ArgentPos);
        SDL_BlitSurface(AffLife , NULL, ecran, &Lifepos);
        SDL_BlitSurface(Nameaff, NULL, ecran, &NamePos);
        SDL_BlitSurface(Curseur, NULL, ecran, &Curs);
        i++;

        EnnemyMoove(Ennemy , EnnemyPod, Y);

        Damage(&Live , &Y);

        EndTest(Live , &boucle, ecran, Argent, End, positionFond, ArgentPos);

        SDL_FreeSurface(Argent);
        SDL_FreeSurface(Nameaff);
        SDL_FreeSurface(AffLife);
        SDL_FreeSurface(Menu);
        SDL_FreeSurface(Fond);

        SDL_Flip(ecran);

    }

    //Fin

    SaveFile(MonPf , fic);


    SDL_FreeSurface(Ennemy);
    SDL_FreeSurface(OpenMenu);
    SDL_FreeSurface(Argent);
    SDL_FreeSurface(Menu);
    SDL_FreeSurface(Curseur);
    SDL_FreeSurface(Fond);
    SDL_FreeSurface(Nameaff);
    SDL_FreeSurface(End);
    TTF_CloseFont(police);
    fclose(fic);
    fclose(Name);
    SDL_Quit();
    TTF_Quit();
    return EXIT_SUCCESS;
}

Moove.c :

#include <stdlib.h>

#include <stdio.h>

#include <SDL/SDL.h>

#include <SDL/SDL_ttf.h>

#include <SDL/SDL_image.h>


typedef int bool;

#define true 1

#define false 0

bool CollisionMenu(int curseur_x,int curseur_y,SDL_Rect box , SDL_Surface *Menue)

{

   if (curseur_x >= box.x&& curseur_x < box.x + box.w&& curseur_y >= box.y&& curseur_y < box.y + box.h)
   {
        SDL_SetAlpha(Menue , SDL_SRCALPHA, 255);
   }
   else
   {
       SDL_SetAlpha(Menue , SDL_SRCALPHA, 0);
   }
   return 0;
}

bool CollisionEnnemy(int curseur_x,int curseur_y,SDL_Rect box , SDL_Surface *Ennemy, int *Y, int *Money)
{

   if (curseur_x >= box.x&& curseur_x < box.x + box.w&& curseur_y >= box.y&& curseur_y < box.y + box.h)
   {
        SDL_SetAlpha(Ennemy , SDL_SRCALPHA, 0);
        Money++;
        *Y = *Y - 200;
   }
   return 0;
}

int EnnemyMoove(SDL_Surface *FEnnemy, SDL_Rect EnnemyPod2, int YEnnemy)
{
    if(EnnemyPod2.x < 1000)
        {
            EnnemyPod2.x  = EnnemyPod2.x + 10;
            EnnemyPod2.y = YEnnemy;
        }
        else
        {
            SDL_SetAlpha(FEnnemy , SDL_SRCALPHA, 0);
            EnnemyPod2.x = -10;
            SDL_SetAlpha(FEnnemy , SDL_SRCALPHA, 255);
        }
        return 0;
}

int EndTest(int liFVe, int *Continue, SDL_Surface *screen, SDL_Surface *ArgentAff, SDL_Surface *EndAff, SDL_Rect PosFond, SDL_Rect PosMoney)
{
    SDL_Event eventinevent;
    if(liFVe < 1)
        {
            while(Continue)
            {
            SDL_WaitEvent(&eventinevent);
            switch(eventinevent.type)
            {
            case SDL_QUIT:
                *Continue = 0;
                break;
            }
            SDL_BlitSurface(EndAff , NULL, screen, &PosFond);
            SDL_BlitSurface(ArgentAff, NULL, screen, &PosMoney);
            SDL_ShowCursor(SDL_ENABLE);
            SDL_Flip(screen);
            }

        }
        return 0;
}

int Damage(int *Lifhe, int *YEnnemyS)
{
    if(YEnnemyS > 600)
    {
        *YEnnemyS = 200;
        *Lifhe--;
    }
}

FileFonc.c:

#include <stdlib.h>

#include <stdio.h>

#include <SDL/SDL.h>

#include <SDL/SDL_ttf.h>

#include <SDL/SDL_image.h>

typedef int bool;

#define true 1

#define false 0

int SaveFile(char *AfMoney, FILE *FicMon)
{
    char *FicMoney = NULL;
    fgets(FicMoney, 1, FicMon);
    FicMoney = NULL;
    fprintf(FicMon , "%s", AfMoney);
    return 0;

}

Hider.h:

#ifndef Hider

#define Hider

#endif

typedef int bool;

bool CollisionMenu(int curseur_x,int curseur_y,SDL_Rect box , SDL_Surface *Menue);

bool CollisionEnnemy(int curseur_x,int curseur_y,SDL_Rect box , SDL_Surface *Ennemy, int *Y, int *Money);

int EnnemyMoove(SDL_Surface *FEnnemy, SDL_Rect EnnemyPod2, int YEnnemy);

int EndTest(int liFVe, int *Continue, SDL_Surface *screen, SDL_Surface *ArgentAff, SDL_Surface *EndAff, SDL_Rect PosFond, SDL_Rect PosMoney);

int Damage(int *Lifhe, int *YEnnemyS);

int SaveFile(char *AfMoney, FILE *FicMon);

Mr de m'aider

(Pas de commentaire inutile svp je perd espoire ;(  )=      )




 

  • Partager sur Facebook
  • Partager sur Twitter
23 juin 2017 à 3:05:31

Tout les bmp sont bien dans le dossier source du projet ? il n'y a pas d'erreur dans leur nom ? tu as tenté d'utiliser le debugger ?

-
Edité par AviSuissa 23 juin 2017 à 3:15:26

  • Partager sur Facebook
  • Partager sur Twitter
23 juin 2017 à 3:31:11

Fais des fonctions, c’est illisible un main de 150 lignes... Et donc, moins de personnes seront promptes à t’aider (surtout si en plus, il n’y a pas de cohérence dans le nommage des variables et tout le reste).

Si tu ne veux pas le faire, vérifie au moins le retour des fonctions à risques (chargement d’images et de polices, ouverture de fichier, initialisation de la SDL, etc.). C’est sûrement à ce niveau que ton programme a un souci ; une fonction alloue mal une ressource que tu utilises ensuite.

De plus, tes lignes 170 à 174 sont répétées un peu plus bas, ce qui fait que tu libères deux fois ces ressources. Les répétitions sont donc à supprimer, et il faut supprimer la bonne occurrence. Par exemple Menu doit sûrement être libérée après la boucle while, mais je n’ai pas lu le code attentivement (trop long ?).

Et finalement, déclare tes variables le plus tard possible et dans le plus petit bloc possible. Ça permettra de faire en sorte qu’elles aient une variable valide dès le début (et donc d’éviter certains problèmes) et de limiter leur portée au nécessaire.

-
Edité par yo@n97one 23 juin 2017 à 3:32:40

  • Partager sur Facebook
  • Partager sur Twitter
Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
23 juin 2017 à 4:15:33

C'est moi ou y'a que moi qui peut lire mon code sans aucun probleme ?
  • Partager sur Facebook
  • Partager sur Twitter
23 juin 2017 à 4:21:55

> C'est moi ou y'a que moi qui peut lire mon code sans aucun probleme ?

Tu connais ton code, facile pour toi de le relire (même si dans six mois ce sera moins facile). Pour quelqu’un qui le lit pour la première fois, ce sera plus dur et il aura sûrement pas envie de plonger dans un main de plus de 100 lignes :  ça demande de retenir quelles variables ont été déclarées, si elles contiennent une valeur valide, à quoi elles correspondent (ici, je vois Curs et Curseur, comment savoir sans me référer à la déclaration que l’un est une surface, l’autre un SDL_Rect ?), etc.

Tu as essayé ce que j’ai posté (vérifier le retour des valeurs à risques) ?

  • Partager sur Facebook
  • Partager sur Twitter
Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
23 juin 2017 à 4:34:04

je fais une structure la ... :)

et dsl mais j'ai l'impression que tu me gronde

(je suis aussi entrain de faire les fonction meme si je croi pas que sa va marché =(  )

  • Partager sur Facebook
  • Partager sur Twitter
23 juin 2017 à 4:44:02

> et dsl mais j'ai l'impression que tu me gronde

Non, non. ^^ C’est juste que ton code sera plus facile à lire pour toi et pour les autres.

> (je suis aussi entrain de faire les fonction meme si je croi pas que sa va marché

Si tu fais des fonctions, ce n’est pas pour faire fonctionner le programme, mais pour rendre l’erreur plus simple à trouver. Tu pourras tester les fonctions une à une plus facilement, tu pourras gérer les erreurs plus facilement, etc. Pour te donner un exemple, voici un main d’un Shoot’em Up.

int main(void)
{
    struct Context c = {NULL};
    if(init_context(&c) == 0)
    {
        int choice = 0;
        while(choice != 2)
        {
            init_play(&c);
            choix = menu(&c);
            if(choice == 1)
                choice = play(&c);
        }
    }
    destroy_context(&c);
    return 0;
}

-
Edité par yo@n97one 23 juin 2017 à 4:46:10

  • Partager sur Facebook
  • Partager sur Twitter
Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
23 juin 2017 à 4:49:04

XD

tu vet me dire que un jeu tien dans ce petit code source XD tu ma tuer

Mr je vais essayé de faire de mon mieux XD

  • Partager sur Facebook
  • Partager sur Twitter