Compare commits
3 Commits
master
...
grid_entit
Author | SHA1 | Date |
---|---|---|
John McCardle | c975599251 | |
John McCardle | 1d852f875b | |
John McCardle | 3b86089128 |
|
@ -13,10 +13,11 @@ UIDrawable* UICaption::click_at(sf::Vector2f point)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void UICaption::render(sf::Vector2f offset)
|
void UICaption::render(sf::Vector2f offset, sf::RenderTarget& target)
|
||||||
{
|
{
|
||||||
text.move(offset);
|
text.move(offset);
|
||||||
Resources::game->getWindow().draw(text);
|
//Resources::game->getWindow().draw(text);
|
||||||
|
target.draw(text);
|
||||||
text.move(-offset);
|
text.move(-offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@ class UICaption: public UIDrawable
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
sf::Text text;
|
sf::Text text;
|
||||||
void render(sf::Vector2f) override final;
|
void render(sf::Vector2f, sf::RenderTarget&) override final;
|
||||||
PyObjectsEnum derived_type() override final;
|
PyObjectsEnum derived_type() override final;
|
||||||
virtual UIDrawable* click_at(sf::Vector2f point) override final;
|
virtual UIDrawable* click_at(sf::Vector2f point) override final;
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include "UICaption.h"
|
#include "UICaption.h"
|
||||||
#include "UISprite.h"
|
#include "UISprite.h"
|
||||||
#include "UIGrid.h"
|
#include "UIGrid.h"
|
||||||
|
#include "GameEngine.h"
|
||||||
|
|
||||||
UIDrawable::UIDrawable() { click_callable = NULL; }
|
UIDrawable::UIDrawable() { click_callable = NULL; }
|
||||||
|
|
||||||
|
@ -13,7 +14,7 @@ void UIDrawable::click_unregister()
|
||||||
|
|
||||||
void UIDrawable::render()
|
void UIDrawable::render()
|
||||||
{
|
{
|
||||||
render(sf::Vector2f());
|
render(sf::Vector2f(), Resources::game->getWindow());
|
||||||
}
|
}
|
||||||
|
|
||||||
PyObject* UIDrawable::get_click(PyObject* self, void* closure) {
|
PyObject* UIDrawable::get_click(PyObject* self, void* closure) {
|
||||||
|
|
|
@ -28,7 +28,8 @@ class UIDrawable
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
void render();
|
void render();
|
||||||
virtual void render(sf::Vector2f) = 0;
|
//virtual void render(sf::Vector2f) = 0;
|
||||||
|
virtual void render(sf::Vector2f, sf::RenderTarget&) = 0;
|
||||||
virtual PyObjectsEnum derived_type() = 0;
|
virtual PyObjectsEnum derived_type() = 0;
|
||||||
|
|
||||||
// Mouse input handling - callable object, methods to find event's destination
|
// Mouse input handling - callable object, methods to find event's destination
|
||||||
|
|
|
@ -95,6 +95,10 @@ PyObject* sfVector2f_to_PyObject(sf::Vector2f vector) {
|
||||||
return Py_BuildValue("(ff)", vector.x, vector.y);
|
return Py_BuildValue("(ff)", vector.x, vector.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PyObject* sfVector2i_to_PyObject(sf::Vector2i vector) {
|
||||||
|
return Py_BuildValue("(ii)", vector.x, vector.y);
|
||||||
|
}
|
||||||
|
|
||||||
sf::Vector2f PyObject_to_sfVector2f(PyObject* obj) {
|
sf::Vector2f PyObject_to_sfVector2f(PyObject* obj) {
|
||||||
float x, y;
|
float x, y;
|
||||||
if (!PyArg_ParseTuple(obj, "ff", &x, &y)) {
|
if (!PyArg_ParseTuple(obj, "ff", &x, &y)) {
|
||||||
|
@ -103,6 +107,14 @@ sf::Vector2f PyObject_to_sfVector2f(PyObject* obj) {
|
||||||
return sf::Vector2f(x, y);
|
return sf::Vector2f(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sf::Vector2i PyObject_to_sfVector2i(PyObject* obj) {
|
||||||
|
int x, y;
|
||||||
|
if (!PyArg_ParseTuple(obj, "ii", &x, &y)) {
|
||||||
|
return sf::Vector2i(); // TODO / reconsider this default: Return default vector on parse error
|
||||||
|
}
|
||||||
|
return sf::Vector2i(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
// TODO - deprecate / remove this helper
|
// TODO - deprecate / remove this helper
|
||||||
PyObject* UIGridPointState_to_PyObject(const UIGridPointState& state) {
|
PyObject* UIGridPointState_to_PyObject(const UIGridPointState& state) {
|
||||||
return PyObject_New(PyObject, (PyTypeObject*)PyObject_GetAttrString(McRFPy_API::mcrf_module, "GridPointState"));
|
return PyObject_New(PyObject, (PyTypeObject*)PyObject_GetAttrString(McRFPy_API::mcrf_module, "GridPointState"));
|
||||||
|
@ -125,11 +137,19 @@ PyObject* UIGridPointStateVector_to_PyList(const std::vector<UIGridPointState>&
|
||||||
}
|
}
|
||||||
|
|
||||||
PyObject* UIEntity::get_position(PyUIEntityObject* self, void* closure) {
|
PyObject* UIEntity::get_position(PyUIEntityObject* self, void* closure) {
|
||||||
|
if (reinterpret_cast<long>(closure) == 0) {
|
||||||
return sfVector2f_to_PyObject(self->data->position);
|
return sfVector2f_to_PyObject(self->data->position);
|
||||||
|
} else {
|
||||||
|
return sfVector2i_to_PyObject(self->data->collision_pos);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int UIEntity::set_position(PyUIEntityObject* self, PyObject* value, void* closure) {
|
int UIEntity::set_position(PyUIEntityObject* self, PyObject* value, void* closure) {
|
||||||
|
if (reinterpret_cast<long>(closure) == 0) {
|
||||||
self->data->position = PyObject_to_sfVector2f(value);
|
self->data->position = PyObject_to_sfVector2f(value);
|
||||||
|
} else {
|
||||||
|
self->data->collision_pos = PyObject_to_sfVector2i(value);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -158,7 +178,8 @@ PyMethodDef UIEntity::methods[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
PyGetSetDef UIEntity::getsetters[] = {
|
PyGetSetDef UIEntity::getsetters[] = {
|
||||||
{"position", (getter)UIEntity::get_position, (setter)UIEntity::set_position, "Entity position", NULL},
|
{"draw_pos", (getter)UIEntity::get_position, (setter)UIEntity::set_position, "Entity position (graphically)", (void*)0},
|
||||||
|
{"pos", (getter)UIEntity::get_position, (setter)UIEntity::set_position, "Entity position (integer grid coordinates)", (void*)1},
|
||||||
{"gridstate", (getter)UIEntity::get_gridstate, NULL, "Grid point states for the entity", NULL},
|
{"gridstate", (getter)UIEntity::get_gridstate, NULL, "Grid point states for the entity", NULL},
|
||||||
{"sprite_number", (getter)UIEntity::get_spritenumber, (setter)UIEntity::set_spritenumber, "Sprite number (index) on the texture on the display", NULL},
|
{"sprite_number", (getter)UIEntity::get_spritenumber, (setter)UIEntity::set_spritenumber, "Sprite number (index) on the texture on the display", NULL},
|
||||||
{NULL} /* Sentinel */
|
{NULL} /* Sentinel */
|
||||||
|
|
|
@ -40,7 +40,8 @@ public:
|
||||||
std::vector<UIGridPointState> gridstate;
|
std::vector<UIGridPointState> gridstate;
|
||||||
UISprite sprite;
|
UISprite sprite;
|
||||||
sf::Vector2f position; //(x,y) in grid coordinates; float for animation
|
sf::Vector2f position; //(x,y) in grid coordinates; float for animation
|
||||||
void render(sf::Vector2f); //override final;
|
sf::Vector2i collision_pos; //(x, y) in grid coordinates: int for collision
|
||||||
|
//void render(sf::Vector2f); //override final;
|
||||||
|
|
||||||
UIEntity();
|
UIEntity();
|
||||||
UIEntity(UIGrid&);
|
UIEntity(UIGrid&);
|
||||||
|
|
|
@ -44,14 +44,15 @@ PyObjectsEnum UIFrame::derived_type()
|
||||||
return PyObjectsEnum::UIFRAME;
|
return PyObjectsEnum::UIFRAME;
|
||||||
}
|
}
|
||||||
|
|
||||||
void UIFrame::render(sf::Vector2f offset)
|
void UIFrame::render(sf::Vector2f offset, sf::RenderTarget& target)
|
||||||
{
|
{
|
||||||
box.move(offset);
|
box.move(offset);
|
||||||
Resources::game->getWindow().draw(box);
|
//Resources::game->getWindow().draw(box);
|
||||||
|
target.draw(box);
|
||||||
box.move(-offset);
|
box.move(-offset);
|
||||||
|
|
||||||
for (auto drawable : *children) {
|
for (auto drawable : *children) {
|
||||||
drawable->render(offset + box.getPosition());
|
drawable->render(offset + box.getPosition(), target);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@ public:
|
||||||
sf::RectangleShape box;
|
sf::RectangleShape box;
|
||||||
float outline;
|
float outline;
|
||||||
std::shared_ptr<std::vector<std::shared_ptr<UIDrawable>>> children;
|
std::shared_ptr<std::vector<std::shared_ptr<UIDrawable>>> children;
|
||||||
void render(sf::Vector2f) override final;
|
void render(sf::Vector2f, sf::RenderTarget&) override final;
|
||||||
void move(sf::Vector2f);
|
void move(sf::Vector2f);
|
||||||
PyObjectsEnum derived_type() override final;
|
PyObjectsEnum derived_type() override final;
|
||||||
virtual UIDrawable* click_at(sf::Vector2f point) override final;
|
virtual UIDrawable* click_at(sf::Vector2f point) override final;
|
||||||
|
|
|
@ -32,9 +32,9 @@ UIGrid::UIGrid(int gx, int gy, std::shared_ptr<PyTexture> _ptex, sf::Vector2f _x
|
||||||
void UIGrid::update() {}
|
void UIGrid::update() {}
|
||||||
|
|
||||||
|
|
||||||
void UIGrid::render(sf::Vector2f)
|
void UIGrid::render(sf::Vector2f offset, sf::RenderTarget& target)
|
||||||
{
|
{
|
||||||
output.setPosition(box.getPosition()); // output sprite can move; update position when drawing
|
output.setPosition(box.getPosition() + offset); // output sprite can move; update position when drawing
|
||||||
// output size can change; update size when drawing
|
// output size can change; update size when drawing
|
||||||
output.setTextureRect(
|
output.setTextureRect(
|
||||||
sf::IntRect(0, 0,
|
sf::IntRect(0, 0,
|
||||||
|
@ -172,7 +172,8 @@ void UIGrid::render(sf::Vector2f)
|
||||||
|
|
||||||
// render to window
|
// render to window
|
||||||
renderTexture.display();
|
renderTexture.display();
|
||||||
Resources::game->getWindow().draw(output);
|
//Resources::game->getWindow().draw(output);
|
||||||
|
target.draw(output);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -423,22 +424,6 @@ PyObject* UIGrid::get_children(PyUIGridObject* self, void* closure)
|
||||||
|
|
||||||
PyObject* UIGrid::repr(PyUIGridObject* self)
|
PyObject* UIGrid::repr(PyUIGridObject* self)
|
||||||
{
|
{
|
||||||
|
|
||||||
// if (member_ptr == 0) // x
|
|
||||||
// self->data->box.setPosition(val, self->data->box.getPosition().y);
|
|
||||||
// else if (member_ptr == 1) // y
|
|
||||||
// self->data->box.setPosition(self->data->box.getPosition().x, val);
|
|
||||||
// else if (member_ptr == 2) // w
|
|
||||||
// self->data->box.setSize(sf::Vector2f(val, self->data->box.getSize().y));
|
|
||||||
// else if (member_ptr == 3) // h
|
|
||||||
// self->data->box.setSize(sf::Vector2f(self->data->box.getSize().x, val));
|
|
||||||
// else if (member_ptr == 4) // center_x
|
|
||||||
// self->data->center_x = val;
|
|
||||||
// else if (member_ptr == 5) // center_y
|
|
||||||
// self->data->center_y = val;
|
|
||||||
// else if (member_ptr == 6) // zoom
|
|
||||||
// self->data->zoom = val;
|
|
||||||
|
|
||||||
std::ostringstream ss;
|
std::ostringstream ss;
|
||||||
if (!self->data) ss << "<Grid (invalid internal object)>";
|
if (!self->data) ss << "<Grid (invalid internal object)>";
|
||||||
else {
|
else {
|
||||||
|
|
|
@ -26,7 +26,7 @@ public:
|
||||||
//UIGrid(int, int, IndexTexture*, float, float, float, float);
|
//UIGrid(int, int, IndexTexture*, float, float, float, float);
|
||||||
UIGrid(int, int, std::shared_ptr<PyTexture>, sf::Vector2f, sf::Vector2f);
|
UIGrid(int, int, std::shared_ptr<PyTexture>, sf::Vector2f, sf::Vector2f);
|
||||||
void update();
|
void update();
|
||||||
void render(sf::Vector2f) override final;
|
void render(sf::Vector2f, sf::RenderTarget&) override final;
|
||||||
UIGridPoint& at(int, int);
|
UIGridPoint& at(int, int);
|
||||||
PyObjectsEnum derived_type() override final;
|
PyObjectsEnum derived_type() override final;
|
||||||
//void setSprite(int);
|
//void setSprite(int);
|
||||||
|
|
|
@ -18,14 +18,16 @@ UISprite::UISprite(std::shared_ptr<PyTexture> _ptex, int _sprite_index, sf::Vect
|
||||||
sprite = ptex->sprite(sprite_index, _pos, sf::Vector2f(_scale, _scale));
|
sprite = ptex->sprite(sprite_index, _pos, sf::Vector2f(_scale, _scale));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
void UISprite::render(sf::Vector2f offset)
|
void UISprite::render(sf::Vector2f offset)
|
||||||
{
|
{
|
||||||
sprite.move(offset);
|
sprite.move(offset);
|
||||||
Resources::game->getWindow().draw(sprite);
|
Resources::game->getWindow().draw(sprite);
|
||||||
sprite.move(-offset);
|
sprite.move(-offset);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
void UISprite::render(sf::Vector2f offset, sf::RenderTexture& target)
|
void UISprite::render(sf::Vector2f offset, sf::RenderTarget& target)
|
||||||
{
|
{
|
||||||
sprite.move(offset);
|
sprite.move(offset);
|
||||||
target.draw(sprite);
|
target.draw(sprite);
|
||||||
|
|
|
@ -25,10 +25,10 @@ public:
|
||||||
UISprite();
|
UISprite();
|
||||||
UISprite(std::shared_ptr<PyTexture>, 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, sf::RenderTarget&) override final;
|
||||||
virtual UIDrawable* click_at(sf::Vector2f point) override final;
|
virtual UIDrawable* click_at(sf::Vector2f point) override final;
|
||||||
|
|
||||||
void render(sf::Vector2f, sf::RenderTexture&);
|
//void render(sf::Vector2f, sf::RenderTexture&);
|
||||||
|
|
||||||
void setPosition(sf::Vector2f);
|
void setPosition(sf::Vector2f);
|
||||||
sf::Vector2f getPosition();
|
sf::Vector2f getPosition();
|
||||||
|
|
|
@ -40,6 +40,7 @@ print("Lol, did it segfault?")
|
||||||
s = mcrfpy.Sprite(25, 384+19, texture, 86, 9.0)
|
s = mcrfpy.Sprite(25, 384+19, texture, 86, 9.0)
|
||||||
# pos (LinkedVector / Vector): s.pos
|
# pos (LinkedVector / Vector): s.pos
|
||||||
# texture (Texture): s.texture
|
# texture (Texture): s.texture
|
||||||
|
s.click = lambda *args, **kwargs: print("clicky", args, kwargs)
|
||||||
|
|
||||||
# Grid
|
# Grid
|
||||||
g = mcrfpy.Grid(10, 10, texture, 512+25, 384+19, 462, 346)
|
g = mcrfpy.Grid(10, 10, texture, 512+25, 384+19, 462, 346)
|
||||||
|
@ -54,6 +55,43 @@ g.zoom = 2.0
|
||||||
|
|
||||||
[ui.append(d) for d in (f, c, s, g)]
|
[ui.append(d) for d in (f, c, s, g)]
|
||||||
|
|
||||||
|
# Entity
|
||||||
|
e = mcrfpy.Entity(5, 5, mcrfpy.default_texture, 86)
|
||||||
|
e.pos = e.draw_pos # TODO - sync draw/collision positions on init
|
||||||
|
g.entities.append(e)
|
||||||
|
import random
|
||||||
|
def wander(*args, **kwargs):
|
||||||
|
p = e.pos
|
||||||
|
new_p = (p[0] + random.randint(-1, 1), p[1] + random.randint(-1, 1))
|
||||||
|
if g.grid_size[0] >= new_p[0] >= 0 and g.grid_size[1] >= new_p[1] >= 0:
|
||||||
|
e.pos = new_p
|
||||||
|
#print(e.pos)
|
||||||
|
|
||||||
|
mcrfpy.setTimer("wander", wander, 400)
|
||||||
|
|
||||||
|
last_anim = None
|
||||||
|
def anim(t, *args, **kwargs):
|
||||||
|
global last_anim
|
||||||
|
if last_anim is None:
|
||||||
|
last_anim = t
|
||||||
|
return
|
||||||
|
duration = t - last_anim
|
||||||
|
|
||||||
|
entity_speed = 1 / 250 # 250 milliseconds to move one square
|
||||||
|
if e.pos == e.draw_pos:
|
||||||
|
return
|
||||||
|
tx, ty = e.pos #"target" position - entity is already occupying that spot, animate them moving there.
|
||||||
|
dx, dy = e.draw_pos #"draw" position
|
||||||
|
newx = tx if (abs(dx - tx) < entity_speed * duration) else entity_speed * duration
|
||||||
|
if tx < dx: newx *= -1
|
||||||
|
newy = ty if (abs(dy - ty) < entity_speed * duration) else entity_speed * duration
|
||||||
|
if ty < dy: newx *= -1
|
||||||
|
|
||||||
|
print(f"({dx}, {dy}) -> ({tx}, {ty}) = ({newx}, {newy}) ; @{entity_speed} * {duration} = {entity_speed * duration}")
|
||||||
|
e.draw_pos = (newx, newy)
|
||||||
|
|
||||||
|
mcrfpy.setTimer("anim", anim, 67)
|
||||||
|
|
||||||
print("built!")
|
print("built!")
|
||||||
|
|
||||||
# tests
|
# tests
|
||||||
|
|
Loading…
Reference in New Issue