Ejemplo n.º 1
0
void trace_system::spawn_finishing_traces_for_destroyed_objects(logic_step& step) const {
	auto& cosmos = step.cosm;
	const auto& events = step.transient.messages.get_queue<messages::will_soon_be_deleted>();

	for (const auto& it : events) {
		const auto e = cosmos[it.subject];

		const auto* const trace = e.find<components::trace>();

		if (e.has<components::substance>() && trace && !trace->is_it_finishing_trace) {
			const auto finishing_trace = cosmos.create_entity("finishing_trace");
			auto copied_trace = *trace;
			copied_trace.lengthening_time_passed_ms = 0.f;
			copied_trace.chosen_lengthening_duration_ms /= 4;

			copied_trace.is_it_finishing_trace = true;
			finishing_trace += copied_trace;
			finishing_trace += e.get<components::sprite>();
			finishing_trace += e.logic_transform();
			finishing_trace += e.get<components::render>();

			//finishing_trace.get<components::transform>().rotation = 90;// e.get<components::physics>().velocity().degrees();

			if (e.find<components::damage>()) {
				finishing_trace.get<components::transform>().pos = e.get<components::damage>().saved_point_of_impact_before_death - 
					(e.get<components::sprite>().size/2).rotate(finishing_trace.get<components::transform>().rotation, vec2(0,0))
					;
			}

			finishing_trace.add_standard_components();
		}
	}
}
Ejemplo n.º 2
0
void spatial_properties_mixin<false, D>::set_logic_transform(const components::transform t) const {
	if (logic_transform() == t) {
		return;
	}
	
	const auto handle = *static_cast<const D*>(this);
	const auto owner = handle.get_owner_body();

	bool is_only_fixtural = owner.alive() && owner != handle;

	ensure(!is_only_fixtural);
	
	if (handle.has<components::physics>()) {
		ensure(!handle.has<components::transform>());
		const auto& phys = handle.get<components::physics>();
		phys.set_transform(t);
	}
	else {
		handle.get<components::transform>() = t;

		if (handle.has<components::dynamic_tree_node>()) {
			handle.get<components::dynamic_tree_node>().update_proxy();
		}
	}
}
Ejemplo n.º 3
0
	vec2 crosshair::calculate_aiming_displacement(const_entity_handle subject_crosshair, bool snap_epsilon_base_offset) {
		auto recoil_body = subject_crosshair[sub_entity_name::CROSSHAIR_RECOIL_BODY];

		auto considered_base_offset = subject_crosshair.get<components::crosshair>().base_offset;

		if (snap_epsilon_base_offset && considered_base_offset.is_epsilon(4))
			considered_base_offset.set(4, 0);

		considered_base_offset.rotate(recoil_body.logic_transform().rotation, vec2());

		return considered_base_offset;
	}
Ejemplo n.º 4
0
components::transform basic_spatial_properties_mixin<C, D>::logic_transform() const {
	const auto handle = *static_cast<const D*>(this);

	const auto owner = handle.get_owner_body();

	if (owner.alive() && owner != handle) {
		return components::fixtures::transform_around_body(handle, owner.logic_transform());
	}
	else if (handle.has<components::physics>()) {
		ensure(!handle.has<components::transform>());
		const auto& phys = handle.get<components::physics>();
		return{ phys.get_position(), phys.get_angle() };
	}
	else if (handle.has<components::wandering_pixels>()) {
		return handle.get<components::wandering_pixels>().reach.center();
	}
	else {
		return handle.get<components::transform>();
	}	
}
Ejemplo n.º 5
0
ltrb basic_renderable_mixin<C, D>::get_aabb(const renderable_positioning_type type) const {
	const auto handle = *static_cast<const D*>(this);

	return get_aabb(handle.logic_transform(), type);
}