示例#1
0
 void execute(const Param& tParam)
 {
   printf("KicktoGoal BotID: %d\n",botID);
   
   Vector2D<int> goal(HALF_FIELD_MAXX, 0);
   float finalSlope = Vector2D<int>::angle(goal, state->homePos[botID]);
   float turnAngleLeft = normalizeAngle(finalSlope - state->homeAngle[botID]); // Angle left to turn
   float dist = Vector2D<int>::dist(state->ballPos, state->homePos[botID]);
   if(dist > BOT_BALL_THRESH)
   {
     float finalSlope = Vector2D<int>::angle(Vector2D<int>(ForwardX(HALF_FIELD_MAXX, 0)), state->ballPos);
     captureBall();
     return;
   }
   if(fabs(turnAngleLeft) > 2 * SATISFIABLE_THETA)
   {
     turnToPoint(goal.x, goal.y);
     return;
   }
   //printf("should kick now %f\n", turnAngleLeft);
   kickBallForGoal();
   if (state->homePos[botID].absSq() < BOT_BALL_THRESH * BOT_BALL_THRESH)
   {
     tState = COMPLETED;
   }
 }
void Critter::Update(float _deltatime, sf::Vector2f _playerpos)
{
	//std::cout << "update" << std::endl;

	m_pos = m_sprite->getPosition();
	const float speed = 28.f;

	m_vel = sf::Vector2f(0,0);
	//std::cout << "m_vel: " << m_vel.x << ", " << m_vel.y << std::endl;

	if(m_pos == m_homePos)
	{
		m_home = true;
		m_collided = false;
		
		m_dir = sf::Vector2f(0,0);

		if(alt_sprite)
		{
			AnimatedSprite* spr_temp;
			spr_temp = m_sprite;

			m_sprite = m_sprite_alt;
			addSprite(spr_temp);

			alt_sprite = !alt_sprite;
		}
	}else{
		m_home = false;
	}

	if(getDistance(m_pos, _playerpos) < 150.f && m_home)
	{
		std::cout << "chase";
		m_chase = true;
	}

	if(m_timer > 5.f || m_collided)
	{
		m_chase = false;
	}

	if(m_chase)
	{
		m_timer += _deltatime;

		turnToPoint(_playerpos);
		m_dir = getDirection(m_pos, _playerpos);
	}

	if(!m_chase && !m_home)
	{
		m_timer = 0.f;
		
		turnToPoint(m_homePos);

		m_dir = getDirection(m_pos, m_homePos);
	}

	m_vel.x += speed*m_dir.x*_deltatime;
	m_vel.y += speed*m_dir.y*_deltatime;

	if(m_home && m_prevpos != m_homePos)
	{
		m_vel = sf::Vector2f(0,0);
	}
	
	//m_vel = sf::Vector2f(0,0);

	if(m_vel.x == 0 && m_vel.y == 0)
	{
		if(alt_sprite)
		{
			AnimatedSprite* spr_temp;
			spr_temp = m_sprite;

			m_sprite = m_sprite_alt;
			addSprite(spr_temp);

			alt_sprite = !alt_sprite;
		}
	}else{
		if(!alt_sprite)
		{
			AnimatedSprite* spr_temp;
			spr_temp = m_sprite;

			m_sprite = m_sprite_alt;
			addSprite(spr_temp);

			alt_sprite = !alt_sprite;
		}
	}

	m_sprite->play(_deltatime);

	std::cout << "m_dir: " << m_dir.x << ", " << m_dir.y << std::endl;

	m_prevpos = m_pos;
	doFriction();
	m_pos += m_vel;
	setPosition(m_pos);
}