entity_handle create_character(cosmos& world, const components::transform spawn_transform, const vec2i screen_size, const std::string name, const assets::animation_response_id torso_set) { const auto character = world.create_entity(name); name_entity(character, entity_name::PERSON); const auto crosshair = create_character_crosshair(world, screen_size); crosshair.get<components::crosshair>().character_entity_to_chase = character; crosshair.set_logic_transform(spawn_transform.pos); ingredients::wsad_character(character, crosshair, torso_set); auto& element = character += components::gui_element(); element.rect_world.last_state.screen_size = screen_size; ingredients::wsad_character_physics(character); character.get<components::physics>().set_transform(spawn_transform); ingredients::character_inventory(character); const auto corpse_of_sentience = world.create_entity("corpse_of_sentience"); name_entity(corpse_of_sentience, entity_name::CORPSE); ingredients::wsad_character_corpse(corpse_of_sentience); character.map_sub_entity(sub_entity_name::CORPSE_OF_SENTIENCE, corpse_of_sentience); character.add_standard_components(); // LOG("Character mass: %x", character.get<components::physics>().get_mass()); return character; }
void relations_mixin<false, D>::make_cloned_sub_entities_recursive(const entity_id from) const { auto& self = *static_cast<const D*>(this); auto& cosmos = self.get_cosmos(); auto from_rels = cosmos[from].get_sub_entities_component(); for (const auto& id : from_rels.other_sub_entities) add_sub_entity(cosmos.clone_entity(id)); for (const auto& id : from_rels.sub_entities_by_name) map_sub_entity(id.first, cosmos.clone_entity(id.second)); }
entity_handle create_character_crosshair(cosmos& world, const vec2i screen_size) { auto root = world.create_entity("crosshair"); auto recoil = world.create_entity("crosshair_recoil_body"); auto zero_target = world.create_entity("zero_target"); { auto& sprite = root += components::sprite(); auto& render = root += components::render(); auto& transform = root += components::transform(); auto& crosshair = root += components::crosshair(); auto& processing = root += components::processing(); sprite.set(assets::texture_id::TEST_CROSSHAIR, rgba(255, 255, 255, 255)); render.layer = render_layer::CROSSHAIR; crosshair.base_offset.set(-20, 0); crosshair.sensitivity.set(3, 3); crosshair.visible_world_area.set(1920, 1080); crosshair.update_bounds(); ingredients::make_always_visible(root); } { auto& force_joint = recoil += components::force_joint(); zero_target += components::transform(); components::physics body; components::fixtures colliders; auto& sprite = recoil += components::sprite(); sprite.set(assets::texture_id::TEST_CROSSHAIR, rgba(0, 255, 0, 0)); auto& render = recoil += components::render(); render.layer = render_layer::OVER_CROSSHAIR; ingredients::make_always_visible(recoil); auto& info = colliders.new_collider(); info.shape.from_renderable(recoil); info.filter = filters::renderable(); //info.filter.categoryBits = 0; info.density = 0.1f; info.sensor = true; body.linear_damping = 5; body.angular_damping = 5; force_joint.chased_entity = zero_target; //force_joint.consider_rotation = false; //force_joint.distance_when_force_easing_starts = 10.f; //force_joint.force_towards_chased_entity = 1000.f; //force_joint.power_of_force_easing_multiplier = 1.f; force_joint.divide_transform_mode = true; recoil += body; recoil += colliders; recoil.get<components::fixtures>().set_owner_body(recoil); } root.map_sub_entity(sub_entity_name::CROSSHAIR_RECOIL_BODY, recoil); root.add_standard_components(); recoil.add_standard_components(); zero_target.add_standard_components(); return root; }