Squashed basically all the compile bugs in UISprite, but UIEntity and UIGrid use textures as well, so they need to be fixed too before the project will build again
This commit is contained in:
parent
47d0e34a17
commit
bfd33102d1
|
@ -3,18 +3,24 @@
|
||||||
PyTexture::PyTexture(std::string filename, int sprite_w, int sprite_h)
|
PyTexture::PyTexture(std::string filename, int sprite_w, int sprite_h)
|
||||||
: sprite_width(sprite_w), sprite_height(sprite_h)
|
: sprite_width(sprite_w), sprite_height(sprite_h)
|
||||||
{
|
{
|
||||||
// TODO - get image resolution and get sheet width and height
|
texture = sf::Texture(source);
|
||||||
sheet_width = 0;
|
auto size = texture.getSize();
|
||||||
sheet_height = 0;
|
sheet_width = size.x;
|
||||||
|
sheet_height = size.y;
|
||||||
source = filename;
|
source = filename;
|
||||||
|
if (sheet_width % sprite_width != 0 || sheet_height % sprite_height != 0)
|
||||||
|
{
|
||||||
|
std::cout << "Warning: Texture `" << source << "` is not an even number of sprite widths or heights across." << std::endl
|
||||||
|
<< "Sprite size given was " << sprite_w << "x" << sprite_h << "px but the file has a resolution of " << sheet_width << "x" << sheet_height << "px." << std::endl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sf::Sprite PyTexture::sprite(int index, float x = 0.0, float y = 0.0, float s = 1.0)
|
sf::Sprite PyTexture::sprite(int index, sf::Vector2f pos = sf::Vector2f(0, 0), sf::Vector2f s = sf::Vector2f(1.0, 1.0))
|
||||||
{
|
{
|
||||||
int tx = index % sprite_width, ty = index / sprite_height;
|
int tx = index % sprite_width, ty = index / sprite_height;
|
||||||
auto ir = sf::IntRect(tx * sprite_width, ty * sprite_height, sprite_width, sprite_height);
|
auto ir = sf::IntRect(tx * sprite_width, ty * sprite_height, sprite_width, sprite_height);
|
||||||
auto sprite = sf::Sprite(texture, ir);
|
auto sprite = sf::Sprite(texture, ir);
|
||||||
sprite.setPosition(x, y);
|
sprite.setPosition(pos);
|
||||||
sprite.setScale(s, s);
|
sprite.setScale(s);
|
||||||
return sprite;
|
return sprite;
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,5 +10,5 @@ private:
|
||||||
int sprite_width, sprite_height, sheet_width, sheet_height;
|
int sprite_width, sprite_height, sheet_width, sheet_height;
|
||||||
public:
|
public:
|
||||||
PyTexture(std::string filename, int sprite_w, int sprite_h);
|
PyTexture(std::string filename, int sprite_w, int sprite_h);
|
||||||
sf::Sprite sprite(int index, float x = 0.0, float y = 0.0, float s = 1.0);
|
sf::Sprite sprite(int index, sf::Vector2f pos = sf::Vector2f(0, 0), sf::Vector2f s = sf::Vector2f(1.0, 1.0));
|
||||||
};
|
};
|
||||||
|
|
50
src/UI.cpp
50
src/UI.cpp
|
@ -168,7 +168,8 @@ void UICaption::render(sf::Vector2f offset)
|
||||||
}
|
}
|
||||||
|
|
||||||
UISprite::UISprite() {}
|
UISprite::UISprite() {}
|
||||||
|
/*
|
||||||
|
// * tearing down the old IndexTexture way of life
|
||||||
UISprite::UISprite(IndexTexture* _itex, int _sprite_index, float x = 0.0, float y = 0.0, float s = 1.0)
|
UISprite::UISprite(IndexTexture* _itex, int _sprite_index, float x = 0.0, float y = 0.0, float s = 1.0)
|
||||||
: itex(_itex), sprite_index(_sprite_index)
|
: itex(_itex), sprite_index(_sprite_index)
|
||||||
{
|
{
|
||||||
|
@ -186,6 +187,13 @@ UISprite::UISprite(IndexTexture* _itex, int _sprite_index, sf::Vector2f pos, flo
|
||||||
sprite.setPosition(pos);
|
sprite.setPosition(pos);
|
||||||
sprite.setScale(sf::Vector2f(s, s));
|
sprite.setScale(sf::Vector2f(s, s));
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
UISprite::UISprite(std::shared_ptr<PyTexture> _ptex, int _sprite_index, sf::Vector2f _pos, float _scale)
|
||||||
|
: ptex(_ptex), sprite_index(_sprite_index)
|
||||||
|
{
|
||||||
|
sprite = ptex(sprite_index, _pos, sf::Vector2f(_scale, _scale));
|
||||||
|
}
|
||||||
|
|
||||||
//void UISprite::update()
|
//void UISprite::update()
|
||||||
//{
|
//{
|
||||||
|
@ -212,19 +220,55 @@ void UISprite::render(sf::Vector2f offset, sf::RenderTexture& target)
|
||||||
sprite.move(-offset);
|
sprite.move(-offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
void UISprite::setPosition(float x, float y)
|
void UISprite::setPosition(float x, float y)
|
||||||
{
|
{
|
||||||
setPosition(sf::Vector2f(x, y));
|
setPosition(sf::Vector2f(x, y));
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
void UISprite::setPosition(sf::Vector2f pos)
|
void UISprite::setPosition(sf::Vector2f pos)
|
||||||
{
|
{
|
||||||
sprite.setPosition(pos);
|
sprite.setPosition(pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
void UISprite::setScale(float s)
|
void UISprite::setScale(sf::Vector2f s)
|
||||||
{
|
{
|
||||||
sprite.setScale(sf::Vector2f(s, s));
|
sprite.setScale(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UISprite::setTexture(std::shared_ptr<PyTexture> _ptex, int _sprite_index=-1)
|
||||||
|
{
|
||||||
|
ptex = _ptex;
|
||||||
|
if (_sprite_index != -1) // if you are changing textures, there's a good chance you need a new index too
|
||||||
|
sprite_index = _sprite_index;
|
||||||
|
sprite = ptex->sprite(sprite_index, sprite.getPosition(), sprite.getScale());
|
||||||
|
}
|
||||||
|
|
||||||
|
void UISprite::setSpriteIndex(int _sprite_index)
|
||||||
|
{
|
||||||
|
sprite_index = _sprite_index;
|
||||||
|
sprite = ptex->sprite(sprite_index, sprite.getPosition(), sprite.getScale());
|
||||||
|
}
|
||||||
|
|
||||||
|
sf::Vector2f UISprite::getScale()
|
||||||
|
{
|
||||||
|
return sprite.getScale();
|
||||||
|
}
|
||||||
|
|
||||||
|
sf::Vector2f UISprite::getPosition()
|
||||||
|
{
|
||||||
|
return sprite.getPosition();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<PyTexture> UISprite::getTexture()
|
||||||
|
{
|
||||||
|
return ptex;
|
||||||
|
}
|
||||||
|
|
||||||
|
int UISprite::getSpriteIndex()
|
||||||
|
{
|
||||||
|
return sprite_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
PyObjectsEnum UICaption::derived_type()
|
PyObjectsEnum UICaption::derived_type()
|
||||||
|
|
85
src/UI.h
85
src/UI.h
|
@ -6,6 +6,7 @@
|
||||||
#include "Resources.h"
|
#include "Resources.h"
|
||||||
#include <list>
|
#include <list>
|
||||||
#include "PyCallable.h"
|
#include "PyCallable.h"
|
||||||
|
#include "PyTexture.h"
|
||||||
|
|
||||||
enum PyObjectsEnum : int
|
enum PyObjectsEnum : int
|
||||||
{
|
{
|
||||||
|
@ -97,23 +98,36 @@ public:
|
||||||
|
|
||||||
class UISprite: public UIDrawable
|
class UISprite: public UIDrawable
|
||||||
{
|
{
|
||||||
|
private:
|
||||||
|
int sprite_index;
|
||||||
|
sf::Sprite sprite;
|
||||||
|
protected:
|
||||||
|
std::shared_ptr<PyTexture> ptex;
|
||||||
public:
|
public:
|
||||||
UISprite();
|
UISprite();
|
||||||
UISprite(IndexTexture*, int, float, float, float);
|
//UISprite(IndexTexture*, int, float, float, float);
|
||||||
UISprite(IndexTexture*, int, sf::Vector2f, float);
|
//UISprite(IndexTexture*, int, sf::Vector2f, float);
|
||||||
|
UISprite(std::shared_ptr<PyTexture>, int, sf::Vector2f, float);
|
||||||
void update();
|
void update();
|
||||||
void render(sf::Vector2f) override final;
|
void render(sf::Vector2f) override final;
|
||||||
virtual UIDrawable* click_at(sf::Vector2f point) override final;
|
virtual UIDrawable* click_at(sf::Vector2f point) override final;
|
||||||
|
|
||||||
// 7DRL hack - TODO apply RenderTexture concept to all UIDrawables (via `sf::RenderTarget`)
|
// 7DRL hack - TODO apply RenderTexture concept to all UIDrawables (via `sf::RenderTarget`)
|
||||||
void render(sf::Vector2f, sf::RenderTexture&);
|
void render(sf::Vector2f, sf::RenderTexture&);
|
||||||
int /*texture_index,*/ sprite_index;
|
//IndexTexture* itex;
|
||||||
IndexTexture* itex;
|
//sf::Vector2f pos;
|
||||||
//float x, y, scale;
|
//float scale;
|
||||||
sf::Sprite sprite;
|
//void setPosition(float, float);
|
||||||
void setPosition(float, float);
|
|
||||||
void setPosition(sf::Vector2f);
|
void setPosition(sf::Vector2f);
|
||||||
void setScale(float);
|
sf::Vector2f getPosition();
|
||||||
|
void setScale(sf::Vector2f);
|
||||||
|
sf::Vector2f getScale();
|
||||||
|
void setSpriteIndex(int);
|
||||||
|
int getSpriteIndex();
|
||||||
|
|
||||||
|
void setTexture(std::shared_ptr<PyTexture> _ptex, int _sprite_index=-1);
|
||||||
|
std::shared_ptr<PyTexture> getTexture();
|
||||||
|
|
||||||
PyObjectsEnum derived_type() override final; // { return PyObjectsEnum::UISprite; };
|
PyObjectsEnum derived_type() override final; // { return PyObjectsEnum::UISprite; };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -155,6 +169,8 @@ public:
|
||||||
|
|
||||||
class UIGrid: public UIDrawable
|
class UIGrid: public UIDrawable
|
||||||
{
|
{
|
||||||
|
private:
|
||||||
|
std::shared_ptr<PyTexture> ptex;
|
||||||
public:
|
public:
|
||||||
UIGrid();
|
UIGrid();
|
||||||
UIGrid(int, int, IndexTexture*, float, float, float, float);
|
UIGrid(int, int, IndexTexture*, float, float, float, float);
|
||||||
|
@ -170,7 +186,7 @@ public:
|
||||||
//int grid_size; // grid sizes are implied by IndexTexture now
|
//int grid_size; // grid sizes are implied by IndexTexture now
|
||||||
sf::RectangleShape box;
|
sf::RectangleShape box;
|
||||||
float center_x, center_y, zoom;
|
float center_x, center_y, zoom;
|
||||||
IndexTexture* itex;
|
//IndexTexture* itex;
|
||||||
sf::Sprite sprite, output;
|
sf::Sprite sprite, output;
|
||||||
sf::RenderTexture renderTexture;
|
sf::RenderTexture renderTexture;
|
||||||
std::vector<UIGridPoint> points;
|
std::vector<UIGridPoint> points;
|
||||||
|
@ -1071,7 +1087,7 @@ static int PyUIDrawable_set_click(PyUIGridObject* self, PyObject* value, void* c
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
PyObject_HEAD
|
PyObject_HEAD
|
||||||
std::shared_ptr<IndexTexture> data;
|
std::shared_ptr<PyTexture> data;
|
||||||
} PyTextureObject;
|
} PyTextureObject;
|
||||||
|
|
||||||
static int PyTexture_init(PyTextureObject* self, PyObject* args, PyObject* kwds)
|
static int PyTexture_init(PyTextureObject* self, PyObject* args, PyObject* kwds)
|
||||||
|
@ -1085,9 +1101,9 @@ static int PyUIDrawable_set_click(PyUIGridObject* self, PyObject* value, void* c
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
sf::Texture t = sf::Texture();
|
//sf::Texture t = sf::Texture();
|
||||||
t.loadFromFile((std::string)filename);
|
//t.loadFromFile((std::string)filename);
|
||||||
self->data = std::make_shared<IndexTexture>(t, grid_size, grid_width, grid_height);
|
self->data = std::make_shared<PyTexture>(filename, grid_size, grid_size);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1122,11 +1138,11 @@ static int PyUIDrawable_set_click(PyUIGridObject* self, PyObject* value, void* c
|
||||||
{
|
{
|
||||||
auto member_ptr = reinterpret_cast<long>(closure);
|
auto member_ptr = reinterpret_cast<long>(closure);
|
||||||
if (member_ptr == 0)
|
if (member_ptr == 0)
|
||||||
return PyFloat_FromDouble(self->data->sprite.getPosition().x);
|
return PyFloat_FromDouble(self->data->getPosition().x);
|
||||||
else if (member_ptr == 1)
|
else if (member_ptr == 1)
|
||||||
return PyFloat_FromDouble(self->data->sprite.getPosition().y);
|
return PyFloat_FromDouble(self->data->getPosition().y);
|
||||||
else if (member_ptr == 2)
|
else if (member_ptr == 2)
|
||||||
return PyFloat_FromDouble(self->data->sprite.getScale().x); // scale X and Y are identical, presently
|
return PyFloat_FromDouble(self->data->getScale().x); // scale X and Y are identical, presently
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
PyErr_SetString(PyExc_AttributeError, "Invalid attribute");
|
PyErr_SetString(PyExc_AttributeError, "Invalid attribute");
|
||||||
|
@ -1153,11 +1169,11 @@ static int PyUIDrawable_set_click(PyUIGridObject* self, PyObject* value, void* c
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (member_ptr == 0) //x
|
if (member_ptr == 0) //x
|
||||||
self->data->sprite.setPosition(val, self->data->sprite.getPosition().y);
|
self->data->setPosition(sf::Vector2f(val, self->data->getPosition().y));
|
||||||
else if (member_ptr == 1) //y
|
else if (member_ptr == 1) //y
|
||||||
self->data->sprite.setPosition(self->data->sprite.getPosition().x, val);
|
self->data->setPosition(sf::Vector2f(self->data->getPosition().x, val));
|
||||||
else if (member_ptr == 2) // scale
|
else if (member_ptr == 2) // scale
|
||||||
self->data->sprite.setScale(sf::Vector2f(val, val));
|
self->data->setScale(sf::Vector2f(val, val));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1171,7 +1187,7 @@ static int PyUIDrawable_set_click(PyUIGridObject* self, PyObject* value, void* c
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
return PyLong_FromDouble(self->data->sprite_index);
|
return PyLong_FromDouble(self->data->getSpriteIndex());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1188,8 +1204,9 @@ static int PyUIDrawable_set_click(PyUIGridObject* self, PyObject* value, void* c
|
||||||
PyErr_SetString(PyExc_TypeError, "Value must be an integer.");
|
PyErr_SetString(PyExc_TypeError, "Value must be an integer.");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
self->data->sprite_index = val;
|
//self->data->sprite_index = val;
|
||||||
self->data->sprite.setTextureRect(self->data->itex->spriteCoordinates(val));
|
//self->data->sprite.setTextureRect(self->data->itex->spriteCoordinates(val));
|
||||||
|
self->data->setSpriteIndex(val);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1218,10 +1235,10 @@ static int PyUIDrawable_set_click(PyUIGridObject* self, PyObject* value, void* c
|
||||||
std::ostringstream ss;
|
std::ostringstream ss;
|
||||||
if (!self->data) ss << "<Sprite (invalid internal object)>";
|
if (!self->data) ss << "<Sprite (invalid internal object)>";
|
||||||
else {
|
else {
|
||||||
auto sprite = self->data->sprite;
|
//auto sprite = self->data->sprite;
|
||||||
ss << "<Sprite (x=" << sprite.getPosition().x << ", y=" << sprite.getPosition().y << ", " <<
|
ss << "<Sprite (x=" << self->data->getPosition().x << ", y=" << self->data->getPosition().y << ", " <<
|
||||||
"scale=" << sprite.getScale().x << ", " <<
|
"scale=" << self->data->getScale().x << ", " <<
|
||||||
"sprite_number=" << self->data->sprite_index << ")>";
|
"sprite_number=" << self->data->getSpriteIndex() << ")>";
|
||||||
}
|
}
|
||||||
std::string repr_str = ss.str();
|
std::string repr_str = ss.str();
|
||||||
return PyUnicode_DecodeUTF8(repr_str.c_str(), repr_str.size(), "replace");
|
return PyUnicode_DecodeUTF8(repr_str.c_str(), repr_str.size(), "replace");
|
||||||
|
@ -1258,7 +1275,7 @@ static int PyUIDrawable_set_click(PyUIGridObject* self, PyObject* value, void* c
|
||||||
}
|
}
|
||||||
auto pytexture = (PyTextureObject*)texture;
|
auto pytexture = (PyTextureObject*)texture;
|
||||||
self->data = std::make_shared<UISprite>(pytexture->data.get(), sprite_index, sf::Vector2f(x, y), scale);
|
self->data = std::make_shared<UISprite>(pytexture->data.get(), sprite_index, sf::Vector2f(x, y), scale);
|
||||||
self->data->sprite.setPosition(sf::Vector2f(x, y));
|
self->data->setPosition(sf::Vector2f(x, y));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1548,7 +1565,7 @@ static PyObject* PyUIEntity_get_gridstate(PyUIEntityObject* self, void* closure)
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject* PyUIEntity_get_spritenumber(PyUIEntityObject* self, void* closure) {
|
static PyObject* PyUIEntity_get_spritenumber(PyUIEntityObject* self, void* closure) {
|
||||||
return PyLong_FromDouble(self->data->sprite.sprite_index);
|
return PyLong_FromDouble(self->data->sprite.getSpriteIndex());
|
||||||
}
|
}
|
||||||
|
|
||||||
static int PyUIEntity_set_spritenumber(PyUIEntityObject* self, PyObject* value, void* closure) {
|
static int PyUIEntity_set_spritenumber(PyUIEntityObject* self, PyObject* value, void* closure) {
|
||||||
|
@ -1560,8 +1577,8 @@ static int PyUIEntity_set_spritenumber(PyUIEntityObject* self, PyObject* value,
|
||||||
PyErr_SetString(PyExc_TypeError, "Value must be an integer.");
|
PyErr_SetString(PyExc_TypeError, "Value must be an integer.");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
self->data->sprite.sprite_index = val;
|
//self->data->sprite.sprite_index = val;
|
||||||
self->data->sprite.sprite.setTextureRect(self->data->sprite.itex->spriteCoordinates(val)); // TODO - I don't like ".sprite.sprite" in this stack of UIEntity.UISprite.sf::Sprite
|
self->data->sprite.setSpriteIndex(val); // todone - I don't like ".sprite.sprite" in this stack of UIEntity.UISprite.sf::Sprite
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1648,11 +1665,11 @@ static int PyUIGrid_init(PyUIGridObject* self, PyObject* args, PyObject* kwds) {
|
||||||
}
|
}
|
||||||
PyTextureObject* pyTexture = reinterpret_cast<PyTextureObject*>(textureObj);
|
PyTextureObject* pyTexture = reinterpret_cast<PyTextureObject*>(textureObj);
|
||||||
// TODO (7DRL day 2, item 4.) use shared_ptr / PyTextureObject on UIGrid
|
// TODO (7DRL day 2, item 4.) use shared_ptr / PyTextureObject on UIGrid
|
||||||
IndexTexture* texture = pyTexture->data.get();
|
//IndexTexture* texture = pyTexture->data.get();
|
||||||
|
|
||||||
// Initialize UIGrid
|
// Initialize UIGrid
|
||||||
//self->data = new UIGrid(grid_x, grid_y, texture, sf::Vector2f(box_x, box_y), sf::Vector2f(box_w, box_h));
|
//self->data = new UIGrid(grid_x, grid_y, texture, sf::Vector2f(box_x, box_y), sf::Vector2f(box_w, box_h));
|
||||||
self->data = std::make_shared<UIGrid>(grid_x, grid_y, texture, box_x, box_y, box_w, box_h);
|
self->data = std::make_shared<UIGrid>(grid_x, grid_y, pyTexture->data, box_x, box_y, box_w, box_h);
|
||||||
return 0; // Success
|
return 0; // Success
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1913,7 +1930,7 @@ static int PyUIEntity_init(PyUIEntityObject* self, PyObject* args, PyObject* kwd
|
||||||
self->data = std::make_shared<UIEntity>(*((PyUIGridObject*)grid)->data);
|
self->data = std::make_shared<UIEntity>(*((PyUIGridObject*)grid)->data);
|
||||||
|
|
||||||
// TODO - PyTextureObjects and IndexTextures are a little bit of a mess with shared/unshared pointers
|
// TODO - PyTextureObjects and IndexTextures are a little bit of a mess with shared/unshared pointers
|
||||||
self->data->sprite = UISprite(pytexture->data.get(), sprite_index, sf::Vector2f(0,0), 1.0);
|
self->data->sprite = UISprite(pytexture->data, sprite_index, sf::Vector2f(0,0), 1.0);
|
||||||
self->data->position = sf::Vector2f(x, y);
|
self->data->position = sf::Vector2f(x, y);
|
||||||
if (grid != NULL) {
|
if (grid != NULL) {
|
||||||
PyUIGridObject* pygrid = (PyUIGridObject*)grid;
|
PyUIGridObject* pygrid = (PyUIGridObject*)grid;
|
||||||
|
|
Loading…
Reference in New Issue