コード例 #1
0
ファイル: PlayerAI.cpp プロジェクト: mikedw/synquake_stm
rect_t* PlayerAI::findNearObject( int ent_type, int attr_id, value_t min_value, value_t max_value)
{
	assert( ent_type < n_entity_types && attr_id < entity_types[ ent_type ]->n_attr );

	rect_t* closest_r = NULL;
	int min_dist = 1000000;

	elem_t* pos;
	pentity_set_t* pe_set = worldmap_get_entities( &cl.view_r, 1 << ent_type );
	pentity_set_for_each( pos, pe_set )
	{
		entity_t* ent = ((pentity_t*)pos)->ent;
		if( entity_is_eq( ent, cl.pl ) )		continue;
		if( ent->attrs[attr_id] < min_value || max_value < ent->attrs[attr_id] )
			continue;

		int dist = rect_distance( &cl.pl->r, &ent->r );
		if( dist < min_dist ){	min_dist = dist; closest_r = &ent->r;	}
	}
コード例 #2
0
ファイル: fdgl.hpp プロジェクト: EQ4/lad
/** Repelling charge force, ala Coulomb's law. */
inline Vector
repel_force(const Region& a, const Region& b)
{
	static const double MIN_DIST = 1.0;

	Vector vec;
	double dist = rect_distance(
		&vec,
		a.pos.x - (a.area.x / 2.0), a.pos.y - (a.area.y / 2.0),
		a.pos.x + (a.area.x / 2.0), a.pos.y + (a.area.y / 2.0),
		b.pos.x - (b.area.x / 2.0), b.pos.y - (b.area.y / 2.0),
		b.pos.x + (b.area.x / 2.0), b.pos.y + (b.area.y / 2.0));

	if (dist <= MIN_DIST) {
		dist = MIN_DIST;
		vec  = vec_sub(a.pos, b.pos);
	}
	return vec_mult(vec, (CHARGE_KE * 0.5 / (vec_mag(vec) * dist * dist)));
}