diff --git a/examples/micropython/space/space.py b/examples/micropython/space/space.py new file mode 100644 index 0000000..b3dfae4 --- /dev/null +++ b/examples/micropython/space/space.py @@ -0,0 +1,105 @@ +import random + +import dolp + +# Images +spaceship = bytearray(b'\x10\x10\x00\x00\xb4\x00\x00\xc0\xfc\x15\x15\xfc\xc0\x00\x00\xb4\x00\x00\x40\xfc\x7f\x20\x38\x98\x49\xef\xef\x49\x98\x38\x20\x7f\xfc\x40') +enemy1 = bytearray(b'\x10\x10\x00\x80\xc0\x60\xf5\x35\x60\xc8\xc8\x60\x35\xf5\x60\xc0\x80\x00\x00\x36\x02\x00\x1d\x26\x4c\x93\x93\x4c\x26\x1d\x00\x02\x36\x00') +enemy1mask = bytearray(b'\x10\x10\x00\x80\xc0\x60\xff\xff\xf0\xf8\xf8\xf0\xff\xff\x60\xc0\x80\x00\x00\x3f\x03\x00\x1d\x3f\x7f\xff\xff\x7f\x3f\x1d\x00\x03\x3f\x00') +enemy2 = bytearray(b'\x10\x10\x00\xfc\x46\x23\x16\xdc\xa1\x6e\x6e\xa1\xdc\x16\x23\x46\xfc\x00\x00\x55\x10\x0a\x00\x02\x08\x10\x10\x08\x02\x00\x0a\x10\x55\x00') +enemy2mask = bytearray(b'\x10\x10\x00\xfc\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xfc\x00\x00\x7f\x1f\x0f\x07\x07\x0f\x1f\x1f\x0f\x07\x07\x0f\x1f\x7f\x00') +explosion1 = bytearray(b'\x10\x10\x00\x00\x00\x00\x90\x40\x40\x20\x40\x40\x84\x00\x10\x00\x00\x00\x00\x00\x04\x00\x00\x05\x01\x02\x01\x21\x00\x04\x00\x00\x00\x00') +explosion2 = bytearray(b'\x10\x10\x00\x00\x00\x00\x88\x60\x24\x10\x20\x60\x80\x00\x12\x00\x00\x00\x00\x40\x02\x00\x00\x03\x02\x24\x02\x03\x00\x00\x00\x44\x00\x00') +explosion3 = bytearray(b'\x10\x10\x00\x00\x60\x44\x84\x40\xa6\x14\x10\x20\x42\x82\x00\x08\x40\x00\x00\x08\x00\x08\x01\x22\x04\x4b\x48\x05\x02\x01\x00\x60\x06\x00') +explosion4 = bytearray(b'\x10\x10\x00\x00\x00\x18\xa8\xc8\xf0\xf0\xf0\xe0\xe8\xb8\x08\x00\x00\x00\x00\x00\x00\x30\x39\x17\x17\x1f\x0f\x17\x13\x21\x78\x20\x00\x00') +explosionAnim = dolp.Animation([explosion1, explosion2, explosion3, explosion4], [100, 100, 100, 100]) + +# Entity types +BULLET_TYPE = 0 +ENEMY_TYPE = 1 + +LIVE_TIMEOUT = 0 +def update_explosion(obj): + t = obj.get_timeout(LIVE_TIMEOUT) + if dolp.check_timeout(t): + dolp.delete_entity(obj) +def explosion(x, y): + obj = dolp.new_entity() + obj.configure(x, y, 0, 0) + t = obj.new_timeout(LIVE_TIMEOUT) + dolp.set_timeout(t, 400, False) + obj.set_animation(explosionAnim) + obj.update(update_explosion) + +def update_bullet(obj): + if not obj.is_moving(): + dolp.delete_entity(obj) +def spawn_bullet(x, y): + w, h = 2, 4 + speed = 10 + obj = dolp.new_entity() + obj.set_type(BULLET_TYPE) + obj.configure(x, y, w, h) + obj.move_to(x, dolp.height() - 10, speed) + obj.collision() + obj.update(update_bullet) + +def update_ship(obj): + w, h = 16, 16 + if dolp.pressed(dolp.BUTTON_A): + spawn_bullet(obj.get_x(), obj.get_y() + int(h/2)) +def spawn_ship(): + w, h = 16, 16 + obj = dolp.new_entity() + obj.configure(int(dolp.width() / 2), int(w/2), w, h) + obj.set_image(spaceship) + obj.update(update_ship) + +class Enemy: + ENEMY_HIT_STATE = 0 + w, h = 16, 16 + count = 0 + + def collision(obj, other): + if other.get_type() != BULLET_TYPE: + return + if obj.get_state(Enemy.ENEMY_HIT_STATE) == 1: + return + dolp.delete_entity(obj) + dolp.delete_entity(other) + explosion(obj.get_x(), obj.get_y()) + obj.set_state(Enemy.ENEMY_HIT_STATE, 1) + Enemy.count -= 1 + + def update(obj): + if not obj.is_moving(): + randX = random.randint(10, 100) + randY = random.randint(16 + 8, dolp.height() - 8) + obj.move_to(randX, randY, 5) + + def spawn(): + if Enemy.count > 4: + return + obj = dolp.new_entity() + Enemy.count += 1 + obj.configure(0, dolp.height() - 8, 16, 16) + obj.set_type(ENEMY_TYPE) + obj.set_image(enemy2, enemy2mask) + if random.randint(0, 1) == 1: + obj.set_image(enemy1, enemy1mask) + obj.update(Enemy.update) + obj.collision(Enemy.collision) + obj.set_state(Enemy.ENEMY_HIT_STATE, 0) + +# setup +dolp.begin() +spawn_timeout = dolp.new_timeout() +dolp.set_timeout(spawn_timeout, 1000, True) +spawn_ship() + +# loop +while True: + dolp.loop_begin() + if dolp.check_timeout(spawn_timeout): + Enemy.spawn() + dolp.loop_end() diff --git a/micropython/dolpmodule.c b/micropython/dolpmodule.c index b892195..3dcd26a 100644 --- a/micropython/dolpmodule.c +++ b/micropython/dolpmodule.c @@ -15,7 +15,9 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(dolp_pentity_new_timeout_obj, dolp_pentity_obj_ STATIC MP_DEFINE_CONST_FUN_OBJ_2(dolp_pentity_delete_timeout_obj, dolp_pentity_obj_delete_timeout); STATIC MP_DEFINE_CONST_FUN_OBJ_2(dolp_pentity_get_timeout_obj, dolp_pentity_obj_get_timeout); STATIC MP_DEFINE_CONST_FUN_OBJ_1(dolp_pentity_get_x_obj, dolp_pentity_obj_get_x); +STATIC MP_DEFINE_CONST_FUN_OBJ_2(dolp_pentity_set_x_obj, dolp_pentity_obj_set_x); STATIC MP_DEFINE_CONST_FUN_OBJ_1(dolp_pentity_get_y_obj, dolp_pentity_obj_get_y); +STATIC MP_DEFINE_CONST_FUN_OBJ_2(dolp_pentity_set_y_obj, dolp_pentity_obj_set_y); STATIC MP_DEFINE_CONST_FUN_OBJ_1(dolp_pentity_delete_obj, dolp_pentity_obj_delete); STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(dolp_pentity_set_image_obj, 2, 3, dolp_pentity_obj_set_image); STATIC MP_DEFINE_CONST_FUN_OBJ_2(dolp_pentity_set_animation_obj, dolp_pentity_obj_set_animation); @@ -37,7 +39,9 @@ STATIC const mp_rom_map_elem_t dolp_pentity_locals_dict_table[] = { {MP_ROM_QSTR(MP_QSTR_delete_timeout), MP_ROM_PTR(&dolp_pentity_delete_timeout_obj)}, {MP_ROM_QSTR(MP_QSTR_get_timeout), MP_ROM_PTR(&dolp_pentity_get_timeout_obj)}, {MP_ROM_QSTR(MP_QSTR_get_x), MP_ROM_PTR(&dolp_pentity_get_x_obj)}, + {MP_ROM_QSTR(MP_QSTR_set_x), MP_ROM_PTR(&dolp_pentity_set_x_obj)}, {MP_ROM_QSTR(MP_QSTR_get_y), MP_ROM_PTR(&dolp_pentity_get_y_obj)}, + {MP_ROM_QSTR(MP_QSTR_set_y), MP_ROM_PTR(&dolp_pentity_set_y_obj)}, {MP_ROM_QSTR(MP_QSTR_delete), MP_ROM_PTR(&dolp_pentity_delete_obj)}, }; @@ -97,7 +101,6 @@ STATIC const mp_rom_map_elem_t dolp_module_globals_table[] = { {MP_ROM_QSTR(MP_QSTR_BUTTON_C), MP_ROM_INT(2)}, {MP_ROM_QSTR(MP_QSTR_BUTTON_D), MP_ROM_INT(3)}, - {MP_OBJ_NEW_QSTR(MP_QSTR_PEntity), (mp_obj_t)&dolp_pentity_type}, {MP_OBJ_NEW_QSTR(MP_QSTR_Animation), (mp_obj_t)&dolp_animation_type}, }; STATIC MP_DEFINE_CONST_DICT(dolp_module_globals, dolp_module_globals_table); diff --git a/micropython/dolpmodule.h b/micropython/dolpmodule.h index d9e4d19..8eda43e 100644 --- a/micropython/dolpmodule.h +++ b/micropython/dolpmodule.h @@ -33,7 +33,9 @@ extern mp_obj_t dolp_pentity_obj_new_timeout(mp_obj_t self_in, mp_obj_t index); extern mp_obj_t dolp_pentity_obj_delete_timeout(mp_obj_t self_in, mp_obj_t index); extern mp_obj_t dolp_pentity_obj_get_timeout(mp_obj_t self_in, mp_obj_t index); extern mp_obj_t dolp_pentity_obj_get_x(mp_obj_t self_in); +extern mp_obj_t dolp_pentity_obj_set_x(mp_obj_t self_in, mp_obj_t value); extern mp_obj_t dolp_pentity_obj_get_y(mp_obj_t self_in); +extern mp_obj_t dolp_pentity_obj_set_y(mp_obj_t self_in, mp_obj_t value); extern mp_obj_t dolp_pentity_obj_delete(mp_obj_t self_in); extern mp_obj_t pentity_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args); extern void pentity_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind); diff --git a/micropython/pentity.cpp b/micropython/pentity.cpp index 048664f..fb44df2 100644 --- a/micropython/pentity.cpp +++ b/micropython/pentity.cpp @@ -162,12 +162,28 @@ mp_obj_t dolp_pentity_obj_get_x(mp_obj_t self_in) return mp_obj_new_int(self->pentity.getX()); } +mp_obj_t dolp_pentity_obj_set_x(mp_obj_t self_in, mp_obj_t value) +{ + dolp_pentity_obj_t *self = (dolp_pentity_obj_t *)MP_OBJ_TO_PTR(self_in); + int val = mp_obj_get_int(value); + self->pentity.setX(val); + return mp_const_none; +} + mp_obj_t dolp_pentity_obj_get_y(mp_obj_t self_in) { dolp_pentity_obj_t *self = (dolp_pentity_obj_t *)MP_OBJ_TO_PTR(self_in); return mp_obj_new_int(self->pentity.getY()); } +mp_obj_t dolp_pentity_obj_set_y(mp_obj_t self_in, mp_obj_t value) +{ + dolp_pentity_obj_t *self = (dolp_pentity_obj_t *)MP_OBJ_TO_PTR(self_in); + int val = mp_obj_get_int(value); + self->pentity.setY(val); + return mp_const_none; +} + mp_obj_t dolp_pentity_obj_delete(mp_obj_t self_in) { dolp_pentity_obj_t *self = (dolp_pentity_obj_t *)MP_OBJ_TO_PTR(self_in); diff --git a/src/engine/PEntity.cpp b/src/engine/PEntity.cpp index 08d1b75..352a3b9 100644 --- a/src/engine/PEntity.cpp +++ b/src/engine/PEntity.cpp @@ -217,6 +217,14 @@ int PEntity::getX() return 0; } +void PEntity::setX(int x) +{ + if (_entity) + { + _entity->_bodyComponent->setX(x); + } +} + int PEntity::getY() { if (_entity) @@ -225,3 +233,11 @@ int PEntity::getY() } return 0; } + +void PEntity::setY(int y) +{ + if (_entity) + { + _entity->_bodyComponent->setY(y); + } +} diff --git a/src/engine/PEntity.h b/src/engine/PEntity.h index e9d4c22..48fd426 100644 --- a/src/engine/PEntity.h +++ b/src/engine/PEntity.h @@ -54,7 +54,9 @@ class PEntity void deleteTimeout(uint8_t index); int getX(); + void setX(int x); int getY(); + void setY(int y); private: friend class World; diff --git a/src/engine/components/BodyComponent.cpp b/src/engine/components/BodyComponent.cpp index e1b621b..9d0dd8c 100644 --- a/src/engine/components/BodyComponent.cpp +++ b/src/engine/components/BodyComponent.cpp @@ -61,6 +61,16 @@ void BodyComponent::update() #endif } +void BodyComponent::setX(int x) +{ + _position.x = x; +} + +void BodyComponent::setY(int y) +{ + _position.y = y; +} + Vect2 &BodyComponent::getPosition() { return _position; diff --git a/src/engine/components/BodyComponent.h b/src/engine/components/BodyComponent.h index 1033b10..ddc5636 100644 --- a/src/engine/components/BodyComponent.h +++ b/src/engine/components/BodyComponent.h @@ -31,6 +31,8 @@ class BodyComponent : public Poolable virtual ~BodyComponent(); void configure(int x, int y, int width, int height); + void setX(int x); + void setY(int y); Vect2 &getPosition(); Vect2 &getSize(); Vect2 &getMaxHitbox(); diff --git a/src/engine/components/CollisionComponent.cpp b/src/engine/components/CollisionComponent.cpp index ca451c0..73c095b 100644 --- a/src/engine/components/CollisionComponent.cpp +++ b/src/engine/components/CollisionComponent.cpp @@ -12,6 +12,10 @@ extern "C" CollisionComponent::CollisionComponent() : _entity(NULL), _onCollision(NULL) +#if defined(MICROPYTHON) + , + _mpCollision(NULL) +#endif { } @@ -23,18 +27,27 @@ void CollisionComponent::init(Entity *entity) { _entity = entity; _onCollision = NULL; +#if defined(MICROPYTHON) + _mpCollision = NULL; +#endif } void CollisionComponent::init(Entity *entity, CollisionCallback onCollision) { _entity = entity; _onCollision = onCollision; +#if defined(MICROPYTHON) + _mpCollision = NULL; +#endif } void CollisionComponent::deinit() { _entity = NULL; _onCollision = NULL; +#if defined(MICROPYTHON) + _mpCollision = NULL; +#endif } void CollisionComponent::configure(CollisionCallback onCollision) diff --git a/src/engine/components/UpdateComponent.cpp b/src/engine/components/UpdateComponent.cpp index 10ad29c..82e6d3a 100644 --- a/src/engine/components/UpdateComponent.cpp +++ b/src/engine/components/UpdateComponent.cpp @@ -12,6 +12,10 @@ extern "C" UpdateComponent::UpdateComponent() : _entity(NULL), _update(NULL) +#if defined(MICROPYTHON) + , + _mpUpdate(NULL) +#endif { } @@ -23,6 +27,9 @@ void UpdateComponent::init(Entity *entity, UpdateCallback callback) { _entity = entity; _update = callback; +#if defined(MICROPYTHON) + _mpUpdate = NULL; +#endif } void UpdateComponent::config(UpdateCallback callback) @@ -34,6 +41,9 @@ void UpdateComponent::deinit() { _entity = NULL; _update = NULL; +#if defined(MICROPYTHON) + _mpUpdate = NULL; +#endif } #if defined(MICROPYTHON)