-
Notifications
You must be signed in to change notification settings - Fork 0
/
AESprite.h
135 lines (111 loc) · 4.41 KB
/
AESprite.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/**
* \file AESprite.h
* \brief Des classes pour gérer les sprites qui sont considérés comme une ou plusieurs images (animation) ayant une position et ne peuvent s'afficher que dans le surfaces
* \author Adam Cherti
* \version 0.1
* \date 29 Octobre 2010
*
* Sprites
*/
#ifndef AE_SPRITE_CLASS
#define AE_SPRITE_CLASS
#include <iostream>
#include <boost/shared_ptr.hpp>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include "AETypes.h"
#include "AEBasic.h"
#include "AELogger.h"
#include "AELoggerFile.h"
#include "AEObject.h"
#include "AESpriteBrain.h"
#include "AE_ClassWithType.h"
class SpriteBrain;
namespace AE
{
class Object;
class CollisionEvents;
struct SurfDeleter
{
void operator()(Surface surf)
{
surf.free();
}
};
/** Classe abstraite qui "décrit" ce qu'est initialement un Sprite */
class Spr : public ClassWithType
{
public:
Spr(Rect<Decimal> initial_position=Rect<Decimal>() );
virtual ~Spr();
/*bool isType(Type); // Pour savoir de quelle type de sprite s'agit-il
bool operator==(Type); // Pour savoir de quelle type de sprite s'agit-il
bool operator!=(Type);*/
/** Pour avancer */
virtual void avancer(DVector2D &vector);
/** On peut connecter le sprite avec un SpriteBrain qui permet d'affecter à un sprite un "cerveau" (par exemple, s'il y a collision, le sprite change d'état et de position, exemple : mort d'un personnage) */
virtual void connect( boost::shared_ptr<SpriteBrain> &brain );
virtual void disconnect();
virtual boost::shared_ptr<SpriteBrain> &connectedWith();
/** Quand il y a une collision entre une des formes connectée à ce Sprite et une autre forme connectée à un sprite différent, cette fonction est
appellée (en cas d'évènement de collision) et cette fonction prend en paramètre une
classe de type CollisionEvents qui indique les circonstances de la collision */
//virtual void thereIsCollision(boost::shared_ptr<Object>, DRect);
virtual DVector2D &getPos();
virtual void setPosition(DVector2D &);
virtual void setPosition(DVector2D);
virtual int width();
virtual int height();
/** Dessine le sprite dans une surface */
virtual void draw(Surface);
/** Retourne l'image courante du Sprite (car un sprite peut être composé de plusieurs images -> animation) */
virtual Surface currentImage();
public:
// Déclaration de types de sprites basiques (la classe Spr, Sprite et AnimSprite)
/** Un sprite quelconque dérivé de la classe Spr */
static Type Sprite;
/** Un sprite avec une seule image (peut-être soit de type Sprite ou d'une classe dérivée de cette dernière) */
static Type OneImageSprite;
/** Un sprite animé (peut-être soit de type AnimSprite ou d'une classe dérivée de cette dernière) */
static Type AnimatedSprite;
protected:
/** La vitesse du Sprite */
DRect m_vitesse;
/** La position du Sprite */
DVector2D m_position;
/** Le temps passé depuis le début de l'application jusqu'au dernier mouvement fait par le sprite */
Uint32 m_last_mouvement;
// /** Tableaux d'objets connectées à ce Sprites (ces objets sont par exemple des boites AABB, triangles etc. et ces objets
// * servent dans les tests de collision */
/** Le cerveau du sprite est celui qui agit en conséquences des évènements qui ont encourus au sprite (si c'est un personnage et qu'il y a eu collision avec un monstre, le personnage doit mourir par exemple) */
boost::shared_ptr<SpriteBrain> m_brain;
};
/** Classe dérivée de Spr, c'est un Sprite se composant d'une et unique image */
class Sprite : public Spr
{
public:
Sprite(std::string img_to_load, Rect<Decimal> initial_position=Rect<Decimal>() );
Sprite(SDL_Surface *img, Rect<Decimal> initial_position=Rect<Decimal>() );
Sprite(const Sprite &);
~Sprite();
int width();
int height();
void draw(Surface);
void free();
void load(std::string chemin);
void load(SDL_Surface *img);
Surface currentImage();
protected:
boost::shared_ptr<Surface> m_image;
};
/**
Classe dérivée de Spr, un Sprite se composant de plusieurs images (animation)
*/
class AnimSprite : public Spr
{
};
typedef boost::shared_ptr<Sprite> SpritePtr;
typedef boost::shared_ptr<Spr> SprPtr;
typedef boost::shared_ptr<AnimSprite> SprAnim;
}
#endif