Tiled sprite improvements!

This commit is contained in:
2023-05-14 19:06:37 -07:00
parent f44fe25011
commit e6c966f3dd
10 changed files with 128 additions and 54 deletions

View File

@ -63,11 +63,11 @@ TilesetGrid::TilesetGrid(
}
}
float_t TilesetGrid::getTileWidth() {
float_t TilesetGrid::getTileWidth(int32_t tile) {
return this->divX;
}
float_t TilesetGrid::getTileHeight() {
float_t TilesetGrid::getTileHeight(int32_t tile) {
return this->divY;
}

View File

@ -24,6 +24,22 @@ namespace Dawn {
* @return Tile at that index.
*/
struct Tile getTile(int32_t tile);
/**
* Returns the width of an individual tile.
*
* @param tile The tile to get the width of.
* @return The tile width.
*/
virtual float_t getTileWidth(int32_t tile) = 0;
/**
* Returns the height of an individual tile.
*
* @param tile The tile to get the height of.
* @return The tile height.
*/
virtual float_t getTileHeight(int32_t tile) = 0;
};
struct TilesetGrid : public Tileset{
@ -61,19 +77,8 @@ namespace Dawn {
int32_t borderY
);
/**
* Returns the width of an individual tile.
*
* @return The tile width.
*/
float_t getTileWidth();
/**
* Returns the height of an individual tile.
*
* @return The tile height.
*/
float_t getTileHeight();
float_t getTileWidth(int32_t tile) override;
float_t getTileHeight(int32_t tile) override;
/**
* Returns the tile at a given grid position.

View File

@ -45,7 +45,7 @@ void BitmapFont::buffer(
size_t wordStart = 0;
glm::vec2 xy0(0, 0);
glm::vec2 tileSize =
glm::vec2(tileset->getTileWidth(), tileset->getTileHeight()) *
glm::vec2(tileset->getTileWidth(0), tileset->getTileHeight(0)) *
(fontSize / this->getDefaultFontSize())
;
@ -142,9 +142,9 @@ void BitmapFont::draw(Mesh *mesh, int32_t start, int32_t len) {
}
float_t BitmapFont::getLineHeight(float_t fontSize) {
return tileset->getTileHeight();
return tileset->getTileHeight(0);
}
float_t BitmapFont::getDefaultFontSize() {
return tileset->getTileHeight();
return tileset->getTileHeight(0);
}

View File

@ -10,6 +10,7 @@
#include "scene/debug/SceneDebugLine.hpp"
#include "physics/ScenePhysicsManager.hpp"
#include "state/StateEvent.hpp"
#include "state/StateOwner.hpp"
namespace Dawn {
class DawnGame;
@ -25,7 +26,7 @@ namespace Dawn {
template<class T>
std::vector<T*> _sceneForwardGetComponents(SceneItem *item);
class Scene {
class Scene : public StateOwner {
private:
sceneitemid_t nextId;
std::map<sceneitemid_t, SceneItem*> items;

View File

@ -12,7 +12,10 @@ TiledSprite::TiledSprite(SceneItem *item) :
SceneItemComponent(item),
tile(-1),
tileset(nullptr),
meshHost(nullptr)
meshHost(nullptr),
flip(TILED_SPRITE_FLIP_Y),
sizeType(TILED_SPRITE_SIZE_TYPE_SCALE),
size(1.0f)
{
}
@ -33,11 +36,60 @@ void TiledSprite::onStart() {
useEffect([&]{
if(this->meshHost == nullptr || this->tileset == nullptr) return;
auto tile = this->tileset->getTile(this->tile);
this->meshHost->uv0 = tile.uv0;
this->meshHost->uv1 = tile.uv1;
this->meshHost->uv0 = glm::vec2(
(((flag_t)this->flip) & TILED_SPRITE_FLIP_X) == 0 ? tile.uv0.x : tile.uv1.x,
(((flag_t)this->flip) & TILED_SPRITE_FLIP_Y) == 0 ? tile.uv0.y : tile.uv1.y
);
this->meshHost->uv1 = glm::vec2(
(((flag_t)this->flip) & TILED_SPRITE_FLIP_X) == 0 ? tile.uv1.x : tile.uv0.x,
(((flag_t)this->flip) & TILED_SPRITE_FLIP_Y) == 0 ? tile.uv1.y : tile.uv0.y
);
}, {
&this->tile,
&this->meshHost,
&this->tileset
&this->tileset,
&this->flip
})();
useEffect([&]{
if(this->meshHost == nullptr || this->tileset == nullptr) return;
auto tile = this->tileset->getTile(this->tile);
glm::vec2 size;
switch(this->sizeType) {
case TILED_SPRITE_SIZE_TYPE_SCALE: {
size = glm::vec2(
this->tileset->getTileWidth(this->tile),
this->tileset->getTileHeight(this->tile)
) * (float_t)this->size;
break;
}
case TILED_SPRITE_SIZE_TYPE_WIDTH_RATIO: {
float_t rw = this->tileset->getTileHeight(this->tile) / this->tileset->getTileWidth(this->tile);
size.x = (float_t)this->size;
size.y = size.x * rw;
break;
}
case TILED_SPRITE_SIZE_TYPE_HEIGHT_RATIO: {
float_t rh = this->tileset->getTileWidth(this->tile) / this->tileset->getTileHeight(this->tile);
size.y = (float_t)this->size;
size.x = size.y * rh;
break;
}
default:
assertUnreachable();
}
this->meshHost->xy0 = -size;
this->meshHost->xy1 = size;
}, {
&this->tile,
&this->meshHost,
&this->tileset,
&this->size
})();
}

View File

@ -7,7 +7,16 @@
#include "display/Tileset.hpp"
#include "scene/components/display/mesh/QuadMeshHost.hpp"
#define TILED_SPRITE_FLIP_Y FLAG_DEFINE(1)
#define TILED_SPRITE_FLIP_X FLAG_DEFINE(2)
namespace Dawn {
enum TiledSpriteSizeType {
TILED_SPRITE_SIZE_TYPE_SCALE,
TILED_SPRITE_SIZE_TYPE_WIDTH_RATIO,
TILED_SPRITE_SIZE_TYPE_HEIGHT_RATIO
};
class TiledSprite : public SceneItemComponent {
public:
// @optional
@ -16,6 +25,12 @@ namespace Dawn {
StateProperty<QuadMeshHost*> meshHost;
// @optional
StateProperty<int32_t> tile;
// @optional
StateProperty<flag_t> flip;
// @optional
StateProperty<enum TiledSpriteSizeType> sizeType;
// @optional
StateProperty<float_t> size;
TiledSprite(SceneItem *item);
std::vector<SceneItemComponent*> getDependencies();

View File

@ -42,8 +42,6 @@ namespace Dawn {
protected:
float_t width = 1;
float_t height = 1;
StateEvent<> eventAlignmentUpdated;
/**
* Simply returns this UI Components' dimensional parent, used for the
@ -60,6 +58,7 @@ namespace Dawn {
public:
StateProperty<bool_t> alignmentNeedsUpdating;
StateEvent<> eventAlignmentUpdated;
/**
* Method used to calculate alignment values.