Tijee
Messages postés11Date d'inscriptionmardi 6 avril 2004StatutMembreDernière intervention22 juillet 2004
-
6 juil. 2004 à 18:51
Tijee
Messages postés11Date d'inscriptionmardi 6 avril 2004StatutMembreDernière intervention22 juillet 2004
-
7 juil. 2004 à 09:46
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);
}
// Variablesconst int LARGECRAN 640, HAUTECRAN 480; // en pixelsconst int LARGOBJET 32, HAUTOBJET 32; // en pixelsconst int LARGMAP 50, HAUTMAP 30; // en tiles
int XCamera, YCamera; // en tiles
SDL_Surface *Ecran = NULL;
Objet *pHead = NULL;
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;
}
Hylvenir
Messages postés364Date d'inscriptionmercredi 11 février 2004StatutMembreDernière intervention 5 octobre 20062 6 juil. 2004 à 19:52
Salut,
deux choses.
1. dans les fichiers d'include (.h) on met des include-guard
ex:
#ifndef __DECLARATIONS_H__INCLUDED__
#define __DECLARATIONS_H__INCLUDED__
... // tout ton code
#endif
2. Pour les variables globales, il faut les déclarer extern
dans le .h
int XCamera, YCamera; // en tiles
devient
extern int XCamera;
extern YCamera;
et tu crées un fichier .cpp contenant
les lignes
int XCamera, YCamera; // en tiles
...
que tu compiles/link avec ton projet final
Ces deux points devraient te permettre de corriger quelques erreurs.
// Variables
int XCamera, YCamera; // en tiles
SDL_Surface *Ecran = NULL;
Objet *pHead = NULL;
Mais j'ai toujours les mêmes problèmes... je pense que ça vient de moi, j'aimerais bien que tu m'expliques l'utilité de ce que tu m'as conseillé pour que je comprenne ce que je fais et que j'évite ainsi les bourdes que j'ai du commettre...
Thanks ! :)
Cette ligne n'est pas inclure comme tel ds un fichier en tete, il faut la personnaliser, et peu importe en fait le nom ke lon va utiliser, mais une syntaxe commune a tout les programmeurs a été décidé, une sorte de 'norme' :
exemple : ds ton fichier objet.h, tu feras ca :
#ifndef OBJET_H
#define OBJET_H
Et ensuite, pour ce ki est des declarations, jne suis pas d'acccord avec Hylvenir : il faut declarer les variables ds le header come ca : int X; et ensuite, facultativement, les redeclarer ds le fichier cpp comme suit : extern int X;
Hylvenir
Messages postés364Date d'inscriptionmercredi 11 février 2004StatutMembreDernière intervention 5 octobre 20062 7 juil. 2004 à 08:52
Tijee > tu n'as pas besoin de mettre extern si ta variable est const.
Tu remarqueras que tu n'as pas non plus besoin de mettre extern devant les déclérations de fonction car par défaut elle sont extern (d'ou le Undefined Symbol au link)
Les "include-guard" évite d'inclure plusieurs fois lors de la compilation des variables dites globales, ce qui évite de duplicate symbol . Le __DECLARATIONS_H__INCLUDED__ doit être adapté selon le nom de ton fichier .h
Tu choisis une norme, et tu t'y tiens pour ton projet.
__DECLARATIONS_H__INCLUDED__
__OBJET_H__INCLUDED__
...
tu as compris je pense ;-)
Quand tu déclares( extern int X; )une variables extern, tu dis juste au compilateur que cette variable existe donc pas besoin de faire "Declaration Missing" par exemple.
Quand tu définis cette même variable dans le .cpp ( int X; )
tu dis à l'éditeur de lien 'ou se trouve' cette variable
ce qui évite le Undefined Symbol.
Pour te rafraichir la mémoire regarde le Langage C++
de Stroustrup le chapitre sur les déclarations.
AlexMan > ce serait tellement plus simple si tous les programmeurs étaient d'accord ;-)
Mais tu risques d'avoir des duplicate symbol en cas de multiple inclusion de tes includes.
La norme que tu donnes sur les noms des defines est un peu légère. Prends plutôt celle de Lakos (Large Scale C++ Software Design)