void HeroHurt::enter(Hero *object) { // 面向对你造成伤害者 int entity_id = object->getStateMachine()->userdata().hurt_source; BaseGameEntity *entity = object->getEntityManger()->getEntityByID(entity_id); if (entity != nullptr) { if (entity->getPositionX() < object->getPositionX()) { object->setDirection(BaseGameEntity::kLeftDirection); } else { object->setDirection(BaseGameEntity::kRightDirection); } } system_clock::time_point current_time = system_clock::now(); system_clock::time_point last_hurt_time = object->getStateMachine()->userdata().was_hit_time; system_clock::duration duration = current_time - last_hurt_time; if (duration_cast<milliseconds>(duration).count() < 1000) { ++object->getStateMachine()->userdata().was_hit_count; } else { object->getStateMachine()->userdata().was_hit_count = 1; } if (object->getStateMachine()->userdata().was_hit_count < 3) { Animation *animation = AnimationManger::instance()->getAnimation("hero_hurt"); Animate *animate = Animate::create(animation); animate->setTag(ActionTags::kHeroHurt); object->runAction(animate); object->getStateMachine()->userdata().was_hit_time = system_clock::now(); } else { object->getStateMachine()->change_state(HeroKnockout::instance()); } if (object->hasWeapon()) { auto current_level = object->getEntityManger()->getCurrentLevel(); current_level->dropWeapon(object); } }