Bonjour à tous.
Voila, j'ai fait un petit moteur 2D avec SDL compilé avec Dev-Cpp, il est simple mais fonctionne très bien. J'aimerais parvenir au même résultat mais en POO et pour l'instant je me noie !
Voici mon code, j'espère qu'il n'est pas trop rébarbatif, en tous cas il est assez long !
fichier main.cpp#include "declarations.h"
int main(int argc, char* argv[])
{
Initialiser();
AttendreEvenements();
Afficher();
}
fichier initialisation.cpp :#include "declarations.h"
void Initialiser()
{
// Initialisation de la SDL
SDL_Init(SDL_INIT_VIDEO);
SDL_EnableKeyRepeat(1,150);
atexit(SDL_Quit);
// Position initiale de la caméra (coin haut-gauche)
XCamera = (LARGMAP/2) - (LARGECRAN/(2*LARGOBJET));
YCamera = (HAUTMAP/2) - (HAUTECRAN/(2*HAUTOBJET));
// Initialisation des surfaces à charger
Ecran = SDL_SetVideoMode(LARGECRAN,HAUTECRAN,16,SDL_SWSURFACE |
SDL_DOUBLEBUF | SDL_FULLSCREEN);
Objet Arbre1("./arbre.bmp",20,20);
Objet Arbre2("./arbre.bmp",15,25);
// Création de la fenêtre
SDL_WM_SetCaption(NULL,NULL);
}
fichier evenements.cpp :#include "declarations.h"
void AttendreEvenements()
{
while(1) // Boucle de jeu
{
SDL_Event Event;
if(SDL_PollEvent(&Event) && Event.type == SDL_KEYDOWN)
{
if(Event.key.state == SDL_PRESSED)
{
switch(Event.key.keysym.sym)
{
case SDLK_ESCAPE : exit(1); break;
}
}
}
Afficher();
}
}
fichier afficher.cpp :#include "declarations.h"
void Afficher()
{
// On parcourt la liste chaînée
Objet *pCurrent = pHead;
while(pCurrent)
{
pCurrent->Afficher();
pCurrent = pCurrent->pNext;
}
SDL_Flip(Ecran);
}
fichier declarations.h :#include <stdlib.h>
#include <Sdl/SDL.h>
#include "objet.h"
// Variables
const int LARGECRAN = 640, HAUTECRAN = 480; // en pixels
const int LARGOBJET = 32, HAUTOBJET = 32; // en pixels
const int LARGMAP = 50, HAUTMAP = 30; // en tiles
int XCamera, YCamera; // en tiles
SDL_Surface *Ecran = NULL;
Objet *pHead = NULL;
// Fonctions
void Initialiser();
void AttendreEvenements();
void Afficher();
fichier objet.h :class Objet
{
public:
Objet(char[],int,int);
void Afficher();
Objet *pNext;
private:
int x,y;
SDL_Surface *SurfObj;
SDL_Rect RectObj;
};
/* Le constructeur prend pour argument le chemin d'accès à la texture
à charger, l'abscisse de l'objet et son ordonnée (exprimées en tiles,
pas en pixels !). L'affichage se fait par l'appel de la fonction
Afficher(). */
fichier objet.cpp :#include "declarations.h"
Objet::Objet(char* texture, int abs, int ord)
{
SurfObj = SDL_LoadBMP(texture);
x = abs; y = ord;
// Ajout à la liste chaînée
pNext = pHead;
pHead = this;
}
void Objet::Afficher()
{
RectObj.x = (x - XCamera) * LARGOBJET;
RectObj.y = (y - YCamera) * HAUTOBJET;
if(RectObj.x >= 0 && RectObj.x < LARGECRAN &&
RectObj.y >= 0 && RectObj.y < HAUTECRAN)
{
SDL_SetColorKey(SurfObj,SDL_SRCCOLORKEY,SDL_MapRGB(SurfObj->format,
255,0,0));
SDL_BlitSurface(SurfObj,NULL,Ecran,&RectObj);
}
}
Erreurs de compilation :
Elles sont du type : multiple definition of `XCamera'
et :
[Linker error] undefined reference to `__gxx_personality_v0'
Voila, j'espère que vous aurez le courage d'examiner tout ça et de m'aider... merci d'avance !