bool Turret::canFollowTarget(DrawableObject & target, bool TargetInvisible)
{
	float distance = (float)sqrt(pow(target.getPosition().x - _position.x,2) +
			pow(target.getPosition().y - _position.y, 2));
	Angle direction = (float)atan2(_position.y - target.getPosition().y,
			_position.x - target.getPosition().x) / _pi * 180 ;

	if(distance < _lockDistance && (direction.getAngle() - DrawableObject::_direction.getAngle() < 5
			&& direction.getAngle() - DrawableObject::_direction.getAngle() > -5)
			&& (direction > _range.x && direction < _range.y)
			&& !TargetInvisible)
	{
		DrawableObject::_direction = direction;
		return true;
	}
	else
		return false;
}
Example #2
0
void DrawStack3D::updatePositions() {

	tilt*=0.95;

	int len = stack.length();

	float cosTilt = cos(tilt);
	float sinTilt = sin(tilt);

	for(int i = 0; i < len; i++) {
		DrawableObject* e = stack.getElement(i);

		vec3 charPos = e->getPosition();

		float dy = charPos.y-camera.y;
		float dx = charPos.x-camera.x;
		float dz = charPos.z-camera.z;

		float charAngle = atan2f(dy, dx);

		float dAngle = mod(angle, 2.0f*PI) - mod(charAngle, 2.0f*PI);

		//Clamp dAngle between -PI and PI
		if(dAngle > PI) {
			dAngle -= PI*2.0f;
		}

		if(dAngle < -PI) {
			dAngle += PI*2.0f;
		}

		float distance = length(vec3(dx, dy, dz));

		//Used for weapon 'raycasts'.
		e->setPlayerAngle2(charAngle);
		e->setPlayerAngle(dAngle);
		e->setPlayerDistance(distance);
		//

		float absDAngle = abs(dAngle);

		distance = length(vec3(dx, dy, dz));

		if(distance > DETAIL_OBJECT_DESTROY_DISTANCE && e->entityType == 1) {
			//Destroy detail object.
			e->destroy = true;
		}

		if(distance > 500.0f || dAngle > PI/2 || dAngle < -PI/2) {
			e->setVisibility(false);
		} else {
			e->setVisibility(true);

			//Fake some field of view perspective stuff.
			float dX = dAngle*FIELD_OF_VIEW_WIDTH*(0.9f+0.1f*abs(sin(dAngle)));

			float dZ = 400.0f*(dz)/distance;

			float scale = 1.0f/distance;


			if(distance < PI) {
				dZ += cos(distance/2.0f)*150.0f;
			}



			//Tilt offsets:
			float oX = -sinTilt*dZ+cosTilt*dX;
			float oY = sinTilt*dX+cosTilt*dZ;


			e->setImageParameters(vec2(640+oX, 360+oY), scale, tilt);
			e->priority = scale;
		}
	}
}