aboutsummaryrefslogtreecommitdiffstats
path: root/include/components/sprite.hpp
blob: 0617620463107b93e9892b9661b8e8f0df82a128 (plain)
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
#ifndef COMPONENTS_SPRITE_HPP_
#define COMPONENTS_SPRITE_HPP_

#include "base.hpp"

#include <texture.hpp>
#include <vector2.hpp>

#include <vector>

struct SpriteData {
	SpriteData(void) = default;	
	SpriteData(Texture t);
	SpriteData(std::string path, vec2 off);
	SpriteData(std::string path, vec2 off, vec2 si);

	Texture tex;
	vec2 size;
	vec2 offset;
	
	vec2 offset_tex;
	vec2 size_tex;

	unsigned int limb;

	bool veltate = false;
};

using Frame = std::vector<std::pair<SpriteData, vec2>>;

std::vector<Frame> developFrame(XMLElement*);

/**
 * @struct Sprite
 * @brief If an entity is visible we want to be able to see it.
 * Each entity is given a sprite, a sprite can consist of manu frames or pieces to make one.
 */
struct Sprite : public Component {
	Sprite(bool left = false)
	 	: faceLeft(left) {}
	Sprite(XMLElement* imp, XMLElement* def) {
		fromXML(imp, def);
	}

	inline Frame getSprite(void) {
		return sprite;
	}

	int clearSprite(void);
	int addSpriteSegment(SpriteData data, vec2 loc);
	int changeSpriteSegment(SpriteData data, vec2 loc);
	vec2 getSpriteSize(); 

	void fromXML(XMLElement* imp, XMLElement* def) final {
		(void)imp;
		auto frames = developFrame(def);
		if (!frames.empty())
			sprite = frames.at(0);
	}

	Frame sprite;
	bool faceLeft;
};


#endif // COMPONENTS_SPRITE_HPP_