HitResponse Player::collision(GameObject& other, const CollisionHit& ) { Bullet* bullet = dynamic_cast<Bullet*> (&other); if(bullet) { return FORCE_MOVE; } if(other.get_flags() & FLAG_PORTABLE) { Portable* portable = dynamic_cast<Portable*> (&other); assert(portable != NULL); if(portable && grabbed_object == NULL && controller->hold(Controller::ACTION) /*&& fabsf(hit.normal.x) > .9*/) { grabbed_object = portable; grabbed_object->grab(*this, get_pos(), dir); return CONTINUE; } } #ifdef DEBUG assert(dynamic_cast<MovingObject*> (&other) != NULL); #endif MovingObject* moving_object = static_cast<MovingObject*> (&other); if(moving_object->get_group() == COLGROUP_TOUCHABLE) { TriggerBase* trigger = dynamic_cast<TriggerBase*> (&other); if(trigger) { if(controller->pressed(Controller::UP)) trigger->event(*this, TriggerBase::EVENT_ACTIVATE); } return FORCE_MOVE; } BadGuy* badguy = dynamic_cast<BadGuy*> (&other); if(badguy != NULL) { if(safe_timer.started() || invincible_timer.started()) return FORCE_MOVE; return CONTINUE; } return FORCE_MOVE; }
HitResponse Player::collision(GameObject& other, const CollisionHit& hit) { Bullet* bullet = dynamic_cast<Bullet*> (&other); if(bullet) { return FORCE_MOVE; } Player* player = dynamic_cast<Player*> (&other); if(player) { return ABORT_MOVE; } if(hit.left || hit.right) { try_grab(); //grab objects right now, in update it will be too late } assert(dynamic_cast<MovingObject*> (&other) != NULL); MovingObject* moving_object = static_cast<MovingObject*> (&other); if(moving_object->get_group() == COLGROUP_TOUCHABLE) { TriggerBase* trigger = dynamic_cast<TriggerBase*> (&other); if(trigger) { if(controller->pressed(Controller::UP)) trigger->event(*this, TriggerBase::EVENT_ACTIVATE); } return FORCE_MOVE; } BadGuy* badguy = dynamic_cast<BadGuy*> (&other); if(badguy != NULL) { if(safe_timer.started() || invincible_timer.started()) return FORCE_MOVE; return CONTINUE; } return CONTINUE; }