Írjunk egy Sprite osztályt. Egy Sprite az egybe fog egy textúrát (Texture) és az ennek a kirajzolásához szükséges adatokat. (Pozíció, méret, stb). A lényege egy ilyne osztálynak, hogy ne kelljen sok külön textúrát létrehozni, és eltárolni a memóriában, ha csak egy textúrát többször több helyre akarunk kirajzolni. A Renderer-be van függvény, amik ezt használják, azokat ne felejtsátek el implementálni! Fontos, az include-olásos probléma ugyanúgy jelen van mint a textúra osztálynál! Figylejetek rá! |---------------------------------------------------------------------------------------| | class Sprite | |---------------------------------------------------------------------------------------| | + Rect2 get_texture_clip_rect() const | | + void set_texture_clip_rect(const Rect2 &rect) | | | | + Rect2 get_transform() const | | + void set_transform(const Rect2 &rect) | | | | + float get_x() const | | + void set_x(const float val) | | | | + float get_y() const | | + void set_y(const float val) | | | | + float get_w() const | | + void set_w(const float val) | | | | + float get_h() const | | + void set_h(const float val) | | | | + double get_angle() const | | + void set_angle(const double val) | | | | + float get_anchor_x() const | | + void set_anchor_x(const float val) | | | | + float get_anchor_y() const | | + void set_anchor_y(const float val) | | | | + void set_anchor(const float x, const float y) | | | | + SDL_RendererFlip get_flip() const | | + void set_flip(const SDL_RendererFlip val) | | | | + Color get_color_mod() const | | + void set_color_mod(const Color &color) | | | | + Texture *get_texture() | | + Texture *get_texture() const | | + void set_texture(Texture *texture) | | | | + void draw() | | | | + Sprite() | | + Sprite(Texture *texture) | | + Sprite(Texture *texture, const Color &color_mod) | | + Sprite(Texture *texture, const float x, const float y, const double angle = 0) | | | | + Sprite(Texture *texture, const float x, const float y, | | const Rect2 &texture_clip_rect, const double angle = 0) | | | | + Sprite(Texture *texture, const Rect2 &transform, | | const Rect2 &texture_clip_rect, const double angle = 0) | | | | + Sprite(Texture *texture, const float x, const float y, | | const float w, const float h, const double angle = 0) | | + virtual ~Sprite() | -> Üres | | | - Rect2 _texture_clip_rect | | - Rect2 _transform | | - double _angle | | | | - float _anchor_x | | - float _anchor_y | | | | - SDL_RendererFlip _flip | | | | - Color _color_mod | | | | - Texture *_texture | |---------------------------------------------------------------------------------------| ------------------------------------------------------------------------------------------ get_texture_clip_rect: return _texture_clip_rect Ezzel be lehet állítani, hogy a textúrának csak egy kis részletét rajzolja ki a sprite. Pl így lehet sprite sheet-eket, tile map-okat, de akár bitmap font-okat is csinálni. ------------------------------------------------------------------------------------------ set_texture_clip_rect: _texture_clip_rect = rect ------------------------------------------------------------------------------------------ get_transform: return _transform Transform-nak neveztem, de jó ha tudjátok, hogy játékmotorokban a transzformációk általában mátrixokat jelentenek. Ezek annyival jobbak, hogy a forgatások, és skálázások is beléjük fér. ------------------------------------------------------------------------------------------ set_transform: _transform = rect ------------------------------------------------------------------------------------------ get_x: return _transform.x ------------------------------------------------------------------------------------------ set_x: _transform.x = val ------------------------------------------------------------------------------------------ get_y: return _transform.y ------------------------------------------------------------------------------------------ set_y: _transform.y = val ------------------------------------------------------------------------------------------ get_w: return _transform.w ------------------------------------------------------------------------------------------ set_w: _transform.w = val ------------------------------------------------------------------------------------------ get_h: return _transform.h ------------------------------------------------------------------------------------------ set_h: _transform.h = val ------------------------------------------------------------------------------------------ get_angle: return _angle ------------------------------------------------------------------------------------------ set_angle: _angle = val ------------------------------------------------------------------------------------------ get_anchor_x: return _anchor_x ------------------------------------------------------------------------------------------ set_anchor_x: _anchor_x = val ------------------------------------------------------------------------------------------ get_anchor_y: return _anchor_y ------------------------------------------------------------------------------------------ set_anchor_y: _anchor_y = val ------------------------------------------------------------------------------------------ set_anchor: _anchor_x = x _anchor_y = y ------------------------------------------------------------------------------------------ get_flip: return _flip ------------------------------------------------------------------------------------------ set_flip: _flip = val ------------------------------------------------------------------------------------------ get_color_mod: return _color_mod ------------------------------------------------------------------------------------------ set_color_mod: _color_mod = color ------------------------------------------------------------------------------------------ get_texture(): return _texture ------------------------------------------------------------------------------------------ get_texture() const: return _texture ------------------------------------------------------------------------------------------ set_texture: _texture = texture ------------------------------------------------------------------------------------------ draw: Renderer::get_singleton()->draw_sprite(this) Kényelmi függvény, hogy ne kelljen mindenhol include-olni a renderert. Végül nem virtuálisnak csináltam, de nyugodtan át lehet rakni annak, jó dolgokat lehet vele csinálni, ha az. ------------------------------------------------------------------------------------------ Sprite(): _angle = 0 _anchor_x = 0 _anchor_y = 0 _flip = SDL_FLIP_NONE _texture = nullptr _color_mod = Color(255, 255, 255, 255) ------------------------------------------------------------------------------------------ Sprite(Texture *texture): _angle = 0 _anchor_x = 0 _anchor_y = 0 _flip = SDL_FLIP_NONE _texture = texture if (_texture != nullptr): _texture_clip_rect.w = texture->get_width() _texture_clip_rect.h = texture->get_height() _transform.w = texture->get_width() _transform.h = texture->get_height() _color_mod = Color(255, 255, 255, 255) ------------------------------------------------------------------------------------------ Sprite(Texture *texture, const Color &color_mod): _angle = 0 _anchor_x = 0 _anchor_y = 0 _flip = SDL_FLIP_NONE _texture = texture if (_texture != nullptr): _texture_clip_rect.w = texture->get_width() _texture_clip_rect.h = texture->get_height() _transform.w = texture->get_width() _transform.h = texture->get_height() _color_mod = color_mod ------------------------------------------------------------------------------------------ Sprite(Texture *texture, const float x, const float y, const double angle): _angle = angle _anchor_x = 0 _anchor_y = 0 _flip = SDL_FLIP_NONE _texture = texture _transform.x = x _transform.y = y if (_texture != nullptr): _texture_clip_rect.w = texture->get_width() _texture_clip_rect.h = texture->get_height() _transform.w = texture->get_width() _transform.h = texture->get_height() _color_mod = Color(255, 255, 255, 255) ------------------------------------------------------------------------------------------ Sprite(Texture *texture, const float x, const float y, const Rect2 &texture_clip_rect, const double angle): _angle = angle _anchor_x = 0 _anchor_y = 0 _flip = SDL_FLIP_NONE _texture = texture _transform.x = x _transform.y = y if (_texture != nullptr): _transform.w = texture->get_width() _transform.h = texture->get_height() _texture_clip_rect = texture_clip_rect _color_mod = Color(255, 255, 255, 255) ------------------------------------------------------------------------------------------ Sprite(Texture *texture, const Rect2 &transform, const Rect2 &texture_clip_rect, const double angle): _angle = angle _anchor_x = 0 _anchor_y = 0 _flip = SDL_FLIP_NONE _texture = texture _transform = transform _texture_clip_rect = texture_clip_rect _color_mod = Color(255, 255, 255, 255) ------------------------------------------------------------------------------------------ Sprite(Texture *texture, const float x, const float y, const float w, const float h, const double angle): _angle = angle _anchor_x = 0 _anchor_y = 0 _flip = SDL_FLIP_NONE _texture = texture _transform.x = x _transform.y = y _transform.w = w _transform.h = h if (_texture != nullptr): _texture_clip_rect.w = texture->get_width() _texture_clip_rect.h = texture->get_height() _color_mod = Color(255, 255, 255, 255) ------------------------------------------------------------------------------------------