Ejemplo n.º 1
0
void Player::move(const std::vector<Solid*>& solids)
{

	gapToReference = coord.x - (REF_X*800 + (scene->getCam().x-400));

	float rad = motion_angle*PI_ENGINE/180;
	float dx = 0;
	float dy = 0;

	// déplacement normal
	if(motion_angle >= -MAX_MOVE_ANGLE)
	{
		if(motion_angle <= MAX_MOVE_ANGLE)
		{
			dx = SPEED * (1-sin(rad)*std::abs(sin(rad))) * (1-tanh(gapToReference/50)/1.5);
			dy = GRAVITY * timer - 20;
		}
		if(motion_angle <= 90)
		{
			if(!jumping && jumpCommand)	
			{
				if(timer > 20)
					double_jumping = true;
				jumping = true;
				timer = 1;
			}
		}
	}

	// chute libre
	else if(motion_angle < MAX_MOVE_ANGLE && motion_angle >= MAX_MOVE_ANGLE-180)
	{
		dx = SPEED * cos(rad);
		dy = GRAVITY * timer;
	}

	// mode saut
	if(jumping)
	{
		dx = SPEED * (1-sin(rad)*std::abs(sin(rad))) * (1-tanh(gapToReference/50)/5);
		dy = GRAVITY * timer - 26;
		if(dy >= -DBLE_JUMP_SENSIBILITY && dy <= DBLE_JUMP_SENSIBILITY && !double_jumping && timer >= 1.20)
		{
			if(jumpCommand)
			{
				double_jumping = true;	
				timer = 1;
			}
		}
		if(motion_angle == 90 && double_jumping) dx = SPEED;
	}

	float x1 = coord.x;
	float y1 = coord.y;

	float x2 = x1 + dx;
	float y2 = y1 + dy;

	float d = sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1));
	int sub_pts = (int)round(d) - 1;

	std::vector<sf::Vector2f> sub_positions;
	sub_positions.push_back(sf::Vector2f(0, 0));
	for(int p = 1; p <= sub_pts; p++)
		sub_positions.push_back(sf::Vector2f(p*(x2-x1)/(sub_pts+1), p*(y2-y1)/(sub_pts+1)));
	sub_positions.push_back(sf::Vector2f(x2-x1, y2-y1));

	bool collisionDetected = false;

	for(int cur_pos = 1; cur_pos < sub_positions.size() && !collisionDetected; cur_pos++)
	{
		for(int i = 0; i < solids.size() && !collisionDetected; i++)
		{
			for(int j = 0; j < hitBox.getSegments().size() && !collisionDetected; j++)
			{
				Segment new_segm(
					hitBox.getSegments()[j].getP1() + sub_positions[cur_pos],
					hitBox.getSegments()[j].getP2() + sub_positions[cur_pos]
				);
				if((solids[i]->getHitBox()).intersectsWith(new_segm))
				{

          if(solids[i]->getEType() == Entity::PLATFORM){
              Platform* plat = (Platform*)(solids[i]);
                if(plat->getType()==Platform::DEADLY)
              dead=true;
          }


		                    	collisionDetected = true;
					jumping = false;
					double_jumping = false;
					timer = 1;
					move(sub_positions[cur_pos-1]);

					int angle = -90;
					float angle_rad;
					int pas = 1;
					bool possible = false;
					sf::Vector2f vect;
					float module = 2;

					while(!possible)
					{
						if(angle > MAX_MOVE_ANGLE)
						{
							angle = -91;
							pas = -1;
						}
						else if(angle < MAX_MOVE_ANGLE-180)
							break;
						angle_rad = angle*PI_ENGINE/180;
						possible = true;

						vect = sf::Vector2f(module*cos(angle_rad), -module*sin(angle_rad));
						for(int j = 0; (j < hitBox.getSegments().size()) && possible; j++)
						{
							Segment new_segm(
								hitBox.getSegments()[j].getP1() + vect,
								hitBox.getSegments()[j].getP2() + vect
							);
							for(int e = 0; e < solids.size(); e++)
								possible = possible && !(*(solids[e])).getHitBox().intersectsWith(new_segm);
						}
						angle += pas;
					}
					angle -= pas;
					if(!possible)
						motion_angle = 90;
					else
						motion_angle = angle;


				}
			}
		}
	}
	if(!collisionDetected)
	{
		move(sub_positions.back());
		timer += clockTime;
	}
	collided = collisionDetected;
	jumpCommand = false;
}