Probléme d'excecution(C++/DSL) Xcode 3.1 sous Leopard 10.5.8

newbeurgeoisiestyle

Membre confirmé
6 Septembre 2009
11
2
36
Salut à tous,

Après avoir fait de longue recherche sur internet (google, yahoo...) j'ai constatais que s'était très difficile de trouver une réponse qui soit adapter à mon problème (En sachant que je suis étudiant en 2nd année BTS informatique de gestion, pour que vous ayez une idée de mon niveau). J'ai un macbook (blanc) avec Leopard 10.5.8 j'ai instaler Xcode 3.1.3, j'ai voulu récupéré un projet fait en C++/SDL que j'avais commencer sous Xcode 2.5. Mais quand j'éssai de compiler, ma fenetre s'afficher (arriére plan noir) mais au bout de quelque seconde, Xcode ne m'affiche aucun avertissement ni aucun probléme, voici le code de mon projet :

Le projet est un shut'z'up un petite vaisseau qui avance et qui shut les autres, quelque chose de très basique.

Main.cpp :

Bloc de code:
/* EL KARNOUBI Soufiane INFO 1b le 11/03/2009 */

#include <cstdlib>
#include <iostream>
#include <SDL/SDL.h>
#include "SDL_ttf.h"
#include "procedure.h"
#include <fstream>

using namespace std;


//==============================================================
//dÈclaration des struct
//==============================================================


missile Vlistemissile[30];
enemi Vlisteenemi[4];//tableau qui va stocker la structure enemi dans procedure.h
trajectoire VpointTraj[1];//tableau qui va stocker la structure trajectoire dans procedure.h

int main(int argc, char *argv[])
{
    
    //==============================================================
    //dÈclaration des variables
    //==============================================================
    
    
    int Vi;
    Vi=0;
    int nbMissiles = 0;  //Nombre de missiles actifs
    int score;
    
    //==============================================================
    //lecture fichier
    //==============================================================
    
    lecturefichier(&score);//Lecture du fichier score
    
    //==============================================================
    //dÈclaration des surface
    //==============================================================
    
    SDL_Surface *Vecran = NULL;
    SDL_Surface *Vimagefond = NULL;
    SDL_Surface *Vvaisseau = NULL;
    SDL_Surface *Vscore= NULL;
    SDL_Surface *VimgMissile=NULL; // Image du missile
    TTF_Font *font;
    SDL_Color textecolor;
    
    //==============================================================
    //dÈclaration des variable de positions
    //==============================================================
    
    SDL_Rect Vpositionscore;
    SDL_Rect Vpositionfond;
    SDL_Rect Vpositionvaisseau;
    SDL_Rect Vpositionimagefond;
    
    //==============================================================
    //dÈclaration des evenement
    //==============================================================
    
    int continuer;
    SDL_Event event;
    
    //==============================================================
    //Initialisation du mode video
    //==============================================================
    
    SDL_Init(SDL_INIT_VIDEO);
    TTF_Init();
    
    //==============================================================
    //Definition des coordonnÈes 
    //==============================================================
    
    Vpositionfond.x = 0;
    Vpositionfond.y = 0;
    Vpositionimagefond.x=0;
    Vpositionimagefond.y=0;
    Vpositionvaisseau.x = 310;
    Vpositionvaisseau.y = 230;
    Vpositionscore.x=30;
    Vpositionscore.y=30;
    textecolor.r=255;//couleur du texte (rouge/vert/bleu)
    textecolor.g=0;
    textecolor.b=0;
    
    char buffer[10];
    
    //==============================================================
    //Definition de la fenetre
    //==============================================================
    
    Vecran = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE| SDL_DOUBLEBUF);
    SDL_WM_SetCaption("SpaceVaisseau", NULL);
    
    //==============================================================
    //Chargement des images
    //==============================================================
    
    Vimagefond = SDL_LoadBMP("fond.bmp");
    Vvaisseau = SDL_LoadBMP("enemi1.bmp");
    font=TTF_OpenFont("police.ttf", 30);
    VimgMissile =SDL_LoadBMP("enemi1.bmp");
    
    
    /*Vlisteenemi[0].Venemi = SDL_LoadBMP("enemi1.bmp");
     Vlisteenemi[0].Vpositionenemi.x=400;
     Vlisteenemi[0].Vpositionenemi.y=100;
     Vlisteenemi[0].Vtype=0;
     Vlisteenemi[1].Venemi = SDL_LoadBMP("enemi2.bmp");
     Vlisteenemi[1].Vpositionenemi.x=400;
     Vlisteenemi[1].Vpositionenemi.y=200;
     Vlisteenemi[1].Vtype=1;
     Vlisteenemi[2].Venemi = SDL_LoadBMP("enemi3.bmp");
     Vlisteenemi[2].Vpositionenemi.x=400;
     Vlisteenemi[2].Vpositionenemi.y=300;
     Vlisteenemi[2].Vtype=0;
     Vlisteenemi[3].Venemi = SDL_LoadBMP("enemi3.bmp");
     Vlisteenemi[3].Vpositionenemi.x=200;
     Vlisteenemi[3].Vpositionenemi.y=300;
     Vlisteenemi[3].Vtype=1;*/
    lecturefichierimage(Vlisteenemi);
    
    
    
    //==============================================================
    //Evenements
    //==============================================================
    continuer=1;
    while (continuer) /* TANT QUE la variable ne vaut pas 0 */
    {
        sprintf(buffer,"%d",score);//Affichage du score
        Vscore=TTF_RenderText_Solid(font, buffer, textecolor);
        SDL_PollEvent(&event);
        switch(event.type) /* On teste le type d'ÈvËnement */
        {
            case SDL_QUIT: /* Si c'est un ÈvËnement QUITTER */
                continuer = 0; /* On met le boolÈen ‡ 0, donc la boucle va s'arrÍter */
                break; 
        } 
        
        //==============================================================
        //Gestion du dÈplacement du vaisseau
        //==============================================================
        
        Uint8 *keystates = SDL_GetKeyState(NULL);
        if(keystates[SDLK_UP]) 
        {
            Vpositionvaisseau.y=Vpositionvaisseau.y-5;
        }
        if(keystates[SDLK_DOWN])
        {
            Vpositionvaisseau.y=Vpositionvaisseau.y+5;
        }
        if(keystates[SDLK_LEFT])
        {
            Vpositionvaisseau.x=Vpositionvaisseau.x-5; 
        }
        if(keystates[SDLK_RIGHT])
        {
            Vpositionvaisseau.x=Vpositionvaisseau.x+5;
            if(Vpositionvaisseau.x>=615)
            {
                Vpositionvaisseau.x=615;
            }
        }
        
        if(keystates[SDLK_SPACE])
        {
            if (nbMissiles<29)//si le nombre de missile < 29
            {
                Vlistemissile[nbMissiles].Vpositionmissile.x=Vpositionvaisseau.x+15;//on donne la position de départ pour chaque missile
                Vlistemissile[nbMissiles].Vpositionmissile.y=Vpositionvaisseau.y; 
                Vlistemissile[nbMissiles].Vmissile = VimgMissile;//on donne l'image de chaque missile
                nbMissiles++;//on incrémente de 1 pour arriver à 29 missiles et terminer la condition
                
            }
            keystates[SDLK_SPACE] = false;//on met false, pour ne tirer qu'un missile à la fois quand on appuit sur espace
        }
        int Vconst;
        Vconst=0;
        
        
        
        for (int i = 0 ; i<nbMissiles; i++)//on fait avancer chaque missile +10px à chaque fois
        {
            Vlistemissile[i].Vpositionmissile.x=Vlistemissile[i].Vpositionmissile.x+10;                    
        }
        
        
        Vconst++;
        for(int Vg=0;Vg<nbMissiles;Vg++)//on gére les collision de entre chaque missile et ennemi
        {
            for(int Va=0;Va<=3;Va++)
            {
                if (check_collision( Vlistemissile[Vg].Vpositionmissile, Vlisteenemi[Va].Vpositionenemi))
                {
                    score=score+100;
                }
            }
        }
        
        
        for(int Vb=0;Vb<=3;Vb++)//on gére les collision entre le vaisseau et les énnemi
        {
            if (check_collision( Vpositionvaisseau, Vlisteenemi[Vb].Vpositionenemi))
            {
                Vlisteenemi[Vb].Vpositionenemi.x=Vlisteenemi[Vb].Vpositionenemi.x+100;
                score=score+100;
            }
        }
        
        TrajectoireEnemie(VpointTraj, Vlisteenemi);//procedure qui va gerer la trajectoire de mes ennemis dans le fichier procedure.h    
        supprimermissile(&nbMissiles, Vlisteenemi, Vlistemissile);//procedure qui va gerer la suppretion de mes missiles dans le fichier procedure.h
        
        //==============================================================
        //Collage des images sur les surface
        //==============================================================
        
        SDL_BlitSurface(Vimagefond, NULL, Vecran, &Vpositionfond);
        SDL_BlitSurface(Vvaisseau, NULL, Vecran, &Vpositionvaisseau);
        SDL_BlitSurface(Vscore, NULL, Vecran, &Vpositionscore);
        for(int Vx=0;Vx<=3;Vx++)//coller l'image de chaque ennemi
        {
            SDL_BlitSurface(Vlisteenemi[Vx].Venemi, NULL, Vecran, &Vlisteenemi[Vx].Vpositionenemi);
        }
        
        for(int Vj=0;Vj<nbMissiles;Vj++)//coller l'image de chaque missile
        {
            SDL_BlitSurface(Vlistemissile[Vj].Vmissile, NULL, Vecran, &Vlistemissile[Vj].Vpositionmissile);  
            cout<<nbMissiles;      
        }
        
        //==============================================================
        //Mise à jour de l'Ècran
        //===================================================
        
        SDL_Flip(Vecran);
    }
    //==============================================================
    //Liberation des surface
    //==============================================================
    
    SDL_FreeSurface(Vimagefond);
    SDL_FreeSurface(Vvaisseau);
    SDL_FreeSurface(Vscore);
    for(int Vd=0;Vd<=3;Vd++)//libéré la surface de chaque ennemi
    {
        SDL_FreeSurface(Vlisteenemi[Vd].Venemi);
    }
    for(int Vk=0;Vk<nbMissiles;Vk++)//supp la surface de chaque ennemi
    {
        SDL_FreeSurface(Vlistemissile[Vk].Vmissile);
    }
    
    enregistrementfichier(score);// procédure pour enregistrer le score 
    TTF_Quit();
    SDL_Quit();
    return 0;
    
    
}
procedure.cpp
Bloc de code:
/*
 *  procedure.cpp
 *  aisser
 *
 *  Created by Soufiane EL KARNOUBI on 11/03/09.
 *  Copyright 2009 __MyCompanyName__. All rights reserved.
 *
 */

#include "procedure.h"

void TrajectoireEnemie(trajectoire VpointTraj[1],enemi Vlisteenemi[3]) //procedure qui va gerer la trajectoire de mes ennemis
{

    for(int Vt=0;Vt<=3;Vt++)//pour Vt<3 (nombre d'ennemis+1=4ennemis) Vt++
    {
        VpointTraj[0].Vsens=1;//le sens prend la valeur de 1 qui va nous servire pour notre switche plus bas
        if(Vlisteenemi[Vt].Vtype==0)//si le type = 0 (le type de l'ennemie)
        {
            VpointTraj[0].point1x=Vlisteenemi[Vt].Vpositionenemi.x-100;//On détérmine la valeur x et y de chaque point à relier par l'ennemi
            
            VpointTraj[0].point1y=Vlisteenemi[Vt].Vpositionenemi.y;
            VpointTraj[0].point2x=VpointTraj[0].point2x;
            VpointTraj[0].point2y=Vlisteenemi[Vt].Vpositionenemi.y-50;
            VpointTraj[0].point3x=Vlisteenemi[Vt].Vpositionenemi.x+100;
            VpointTraj[0].point3y=VpointTraj[0].point2y;
            VpointTraj[0].point4y=Vlisteenemi[Vt].Vpositionenemi.y-25;
            switch(VpointTraj[0].Vsens)//on prend la valeur de Vsens (plus haut Vsens=1)
            {
                case 1 : Vlisteenemi[Vt].Vpositionenemi.x=Vlisteenemi[Vt].Vpositionenemi.x-2;//Vsens=1 
                        if((Vlisteenemi[Vt].Vpositionenemi.x==VpointTraj[0].point1x) && (Vlisteenemi[Vt].Vpositionenemi.y==VpointTraj[0].point1y))//si l'ennemi ateint les point x et y alors Vsens=2
                        {
                           VpointTraj[0].Vsens=2;
                        }
                break;//comme Vsens=2 alors on passe o 2éme cas (case 2) avec les nouvelles coordonnée et ceux pour tout les points suivant
                case 2 : Vlisteenemi[Vt].Vpositionenemi.y=Vlisteenemi[Vt].Vpositionenemi.y-2;//Vsens=2
                        if((Vlisteenemi[Vt].Vpositionenemi.x==VpointTraj[0].point2x) && (Vlisteenemi[Vt].Vpositionenemi.y==VpointTraj[0].point2y))//si ennemi = x et y alors Vsens=3
                        {
                           VpointTraj[0].Vsens=3;
                        }
                break;
                case 3 : Vlisteenemi[Vt].Vpositionenemi.x=Vlisteenemi[Vt].Vpositionenemi.x+2;//Vsens=3
                        if((Vlisteenemi[Vt].Vpositionenemi.x==VpointTraj[0].point3x) && (Vlisteenemi[Vt].Vpositionenemi.y==VpointTraj[0].point3y))//si ennemi = x et y alors Vsens=4
                        {
                           VpointTraj[0].Vsens=4;
                        }
                break;
                case 4 :
                        if(Vlisteenemi[Vt].Vpositionenemi.y>=VpointTraj[0].point4y)//Vsens=4
                        {
                            Vlisteenemi[Vt].Vpositionenemi.y=Vlisteenemi[Vt].Vpositionenemi.y-2;
                        }
                break;//on détérmine la fin de la trajectoire avec le point 4
            }
        }
        else//Sinon le type de l'ennemi=1 alors la trajectoire change
        {
                if(Vlisteenemi[Vt].Vtype==1)
                {
                    VpointTraj[0].point1x=Vlisteenemi[Vt].Vpositionenemi.x+50;
                    VpointTraj[0].point1y=Vlisteenemi[Vt].Vpositionenemi.y;
                    VpointTraj[0].point2x=VpointTraj[0].point1x;
                    VpointTraj[0].point2y=Vlisteenemi[Vt].Vpositionenemi.y+100;
                    VpointTraj[0].point3x=Vlisteenemi[Vt].Vpositionenemi.x-50;
                    VpointTraj[0].point3y=VpointTraj[0].point2y;
                    VpointTraj[0].point4y=Vlisteenemi[Vt].Vpositionenemi.y+100;
                    switch(VpointTraj[0].Vsens)
                    {
                    case 1 : Vlisteenemi[Vt].Vpositionenemi.x=Vlisteenemi[Vt].Vpositionenemi.x+2;
                        if((Vlisteenemi[Vt].Vpositionenemi.x==VpointTraj[0].point1x) && (Vlisteenemi[Vt].Vpositionenemi.y==VpointTraj[0].point1y))
                        {
                           VpointTraj[0].Vsens=2;
                        }
                    break;
                    case 2 : Vlisteenemi[Vt].Vpositionenemi.y=Vlisteenemi[Vt].Vpositionenemi.y+2;
                        if((Vlisteenemi[Vt].Vpositionenemi.x==VpointTraj[0].point2x) && (Vlisteenemi[Vt].Vpositionenemi.y==VpointTraj[0].point2y))
                        {
                           VpointTraj[0].Vsens=3;
                        }
                    break;
                    case 3 : Vlisteenemi[Vt].Vpositionenemi.x=Vlisteenemi[Vt].Vpositionenemi.x-2;
                        if((Vlisteenemi[Vt].Vpositionenemi.x==VpointTraj[0].point3x) && (Vlisteenemi[Vt].Vpositionenemi.y==VpointTraj[0].point3y))
                        {
                           VpointTraj[0].Vsens=4;
                        }
                    break;
                    case 4 :if(Vlisteenemi[Vt].Vpositionenemi.y>=VpointTraj[0].point4y)
                        {
                            Vlisteenemi[Vt].Vpositionenemi.y=Vlisteenemi[Vt].Vpositionenemi.y+2;
                        }
                    break;
                    }SDL_Delay(10);
                    
            }
                
        }
        
    }
}

void enregistrementfichier(int score)//procedure d'enregistrement de fichier
{
    ofstream VFichier("score.txt");
    if(VFichier.is_open())
    {
        VFichier<<score;
    }
    VFichier.close();
}

void lecturefichier(int *score)//procédure de lecture de fichier
{
    *score=0;
    ifstream VFichier("score.txt");
    if(VFichier.is_open())
    {
        
        VFichier>>*score;
        VFichier.close();
    }
}

void lecturefichierimage(enemi Vlisteenemi[3])
{
    int Vi;
    char Vimage[20];
    ifstream VFichier("images.txt");
    if(VFichier.is_open())
    {
        for(Vi=0;Vi<4;Vi++)
        {
            VFichier>>Vimage;
            VFichier>>Vlisteenemi[Vi].Vpositionenemi.x;
            VFichier>>Vlisteenemi[Vi].Vpositionenemi.y;
            VFichier>>Vlisteenemi[Vi].Vtype;
            cout<<Vimage<<endl;
            cout<<Vlisteenemi[Vi].Vpositionenemi.x<<endl;
            cout<<Vlisteenemi[Vi].Vpositionenemi.y<<endl;
            cout<<Vlisteenemi[Vi].Vtype<<endl;
            Vlisteenemi[Vi].Venemi = SDL_LoadBMP(Vimage);
        }
    }
}
void supprimermissile(int *nbMissiles, enemi Vlisteenemi[4], missile Vlistemissile[30])
{
            bool supprimer;
            do
            {
              // Je n'ai pas supprimÈ de missile
              supprimer = false;
              int i = 0;
              while ((i<*nbMissiles)&&(supprimer==false))
              {
                  // Si le missile dÈpasse les 625 pixels ou si il est avant 0 je le dÈtruis du tableau
                 if ((Vlistemissile[i].Vpositionmissile.x>625)||(Vlistemissile[i].Vpositionmissile.x<0))
                 {
                   supprimer = true; // j'ai supprimÈ un missile donc je dois recommencer le parcours entier de mon tableau
                   for (int j = i ; j<*nbMissiles-1;j++)
                   {
                     Vlistemissile[j] =  Vlistemissile[j+1];  
                   } 
                   *nbMissiles = *nbMissiles -1;    
                 }
                 i++;
              }
            }
            while(supprimer==true);
            // Je suis certain d'avoir traitÈ tous mes missiles
}

bool check_collision( SDL_Rect A, SDL_Rect B )//fonction de collisions 
{
    //The sides of the rectangles
    int leftA, leftB;
    int rightA, rightB;
    int topA, topB;
    int bottomA, bottomB;

    //Calculate the sides of rect A
    leftA = A.x;
    rightA = A.x + A.w;
    topA = A.y;
    bottomA = A.y + A.h;
        
    //Calculate the sides of rect B
    leftB = B.x;
    rightB = B.x + B.w;
    topB = B.y;
    bottomB = B.y + B.h;
    //If any of the sides from A are outside of B
    if( bottomA <= topB )
    {
        return false;
    }
    
    if( topA >= bottomB )
    {
        return false;
    }
    
    if( rightA <= leftB )
    {
        return false;
    }
    
    if( leftA >= rightB )
    {
        return false;
    }
    
    //If none of the sides from A are outside B
    return true;
}
procedure.h
Bloc de code:
/*
 *  procedure.h
 *  aisser
 *
 *  Created by Soufiane EL KARNOUBI on 11/03/09.
 *  Copyright 2009 __MyCompanyName__. All rights reserved.
 *
 */
 
#ifndef DEF_INITILISATION
#define DEF_INITILISATION
#include <iostream>
#include <SDL/SDL.h>
#include "SDL_ttf.h"
#include <fstream>


using namespace std;

        struct trajectoire// structure qui va stocker les points à relier par les ennemis
        {
                int point1x;
                int point1y;
                int point2x;
                int point2y;    
                int point3x;
                int point3y;
                int point4x;
                int point4y;
                int Vsens;
        };
        
        struct enemi//structure pour stocker mes ennemis
        {
                SDL_Surface *Venemi;
                SDL_Rect Vpositionenemi;
                int Vtype;
        };
        
        struct missile//structure qui va stocker les images de mes missiles
        {
                SDL_Surface *Vmissile;
                SDL_Rect Vpositionmissile;

        };

        
void TrajectoireEnemie(trajectoire VpointTraj[1],enemi Vlisteenemi[3]);
void enregistrementfichier(int score);
void lecturefichier(int *score);
bool check_collision( SDL_Rect A, SDL_Rect B );//fonction de collisions 
void supprimermissile(int *nbMissiles, enemi Vlisteenemi[3], missile Vlistemissile[30]);
void lecturefichierimage(enemi Vlisteenemi[3]);

#endif
Je ne comprend pas le probléme.....
Je vous serez très reconnaissant de bien vouloir m'aider, merci d'avance.
Newbeurgeoisiestyle
 
voila ce que la console met :

2009-09-06 21:05:29.827 VaisseauSpace[785:10b] Warning once: This application, or a library it uses, is using NSQuickDrawView, which has been deprecated. Apps should cease use of QuickDraw and move to Quartz.

Je pense que ça peu aider..merci
 
Cela dit que ton code est obsolète et ça peut effectivement être la cause du plantage. Ton code date de quand ? Tu utilises bien une version de la SDL à jour ?
 
Mon code date de mai 2009, et peu etre que ça vient alors de la version SDL que je n'est pas mis à jours depuis ce moment la, mais comment mettre à jour ? puisque j'ai changer de version ?