Animated wander demo (working out integer grid positions for entities), not exactly working
This commit is contained in:
parent
1d852f875b
commit
c975599251
|
@ -95,6 +95,10 @@ PyObject* sfVector2f_to_PyObject(sf::Vector2f vector) {
|
|||
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) {
|
||||
float 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);
|
||||
}
|
||||
|
||||
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
|
||||
PyObject* UIGridPointState_to_PyObject(const UIGridPointState& state) {
|
||||
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) {
|
||||
return sfVector2f_to_PyObject(self->data->position);
|
||||
if (reinterpret_cast<long>(closure) == 0) {
|
||||
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) {
|
||||
self->data->position = PyObject_to_sfVector2f(value);
|
||||
if (reinterpret_cast<long>(closure) == 0) {
|
||||
self->data->position = PyObject_to_sfVector2f(value);
|
||||
} else {
|
||||
self->data->collision_pos = PyObject_to_sfVector2i(value);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -158,7 +178,8 @@ PyMethodDef UIEntity::methods[] = {
|
|||
};
|
||||
|
||||
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},
|
||||
{"sprite_number", (getter)UIEntity::get_spritenumber, (setter)UIEntity::set_spritenumber, "Sprite number (index) on the texture on the display", NULL},
|
||||
{NULL} /* Sentinel */
|
||||
|
|
|
@ -40,6 +40,7 @@ public:
|
|||
std::vector<UIGridPointState> gridstate;
|
||||
UISprite sprite;
|
||||
sf::Vector2f position; //(x,y) in grid coordinates; float for animation
|
||||
sf::Vector2i collision_pos; //(x, y) in grid coordinates: int for collision
|
||||
//void render(sf::Vector2f); //override final;
|
||||
|
||||
UIEntity();
|
||||
|
|
|
@ -40,6 +40,7 @@ print("Lol, did it segfault?")
|
|||
s = mcrfpy.Sprite(25, 384+19, texture, 86, 9.0)
|
||||
# pos (LinkedVector / Vector): s.pos
|
||||
# texture (Texture): s.texture
|
||||
s.click = lambda *args, **kwargs: print("clicky", args, kwargs)
|
||||
|
||||
# Grid
|
||||
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)]
|
||||
|
||||
# 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!")
|
||||
|
||||
# tests
|
||||
|
|
Loading…
Reference in New Issue