: MovingSprite(lisp, LAYER_TILES, COLGROUP_STATIC), state(STATE_NORMAL)
{
sprite->set_action("normal");
- flags |= FLAG_SOLID;
}
HitResponse
-UnstableTile::collision(GameObject& other, const CollisionHit& hit)
+UnstableTile::collision(GameObject& other, const CollisionHit& )
{
- switch (state) {
-
- case STATE_NORMAL:
- if ((hit.normal.y >= 0.8 ) && (dynamic_cast<Player*>(&other))) {
- state = STATE_CRUMBLING;
- sprite->set_action("crumbling", 1);
- return FORCE_MOVE;
- }
- return FORCE_MOVE;
- break;
-
- case STATE_CRUMBLING:
- return FORCE_MOVE;
- break;
-
- case STATE_DISINTEGRATING:
- return FORCE_MOVE;
- break;
-
+ if(state == STATE_NORMAL) {
+ Player* player = dynamic_cast<Player*> (&other);
+ if(player != NULL &&
+ player->get_bbox().get_bottom() < get_bbox().get_top() + 7.0) {
+ state = STATE_CRUMBLING;
+ sprite->set_action("crumbling", 1);
+ }
}
-
- log_debug << "unhandled state" << std::endl;
- return FORCE_MOVE;
+ return SOLID;
}
void
case STATE_CRUMBLING:
if (sprite->animation_done()) {
- state = STATE_DISINTEGRATING;
- sprite->set_action("disintegrating", 1);
- flags &= ~FLAG_SOLID;
+ state = STATE_DISINTEGRATING;
+ sprite->set_action("disintegrating", 1);
set_group(COLGROUP_DISABLED);
- physic.enable_gravity(true);
+ physic.enable_gravity(true);
}
break;
return;
}
break;
-
}
}