Dłuższy, ale nie wyższy skok

0

Witam! Napisałem sobie taki podstawowy skok, chciałbym go wydłużyć w taki sposób aby nie wpływało to na wysokość skoku. Jak mogę coś takiego uzyskać?

Player::Player()
{
	velX = 0;
	velY = 0;

	run = 0;

	activeButton = true;

	keyA = keyD = false;

	keyState = SDL_GetKeyboardState(NULL);
}

void Player::LoadContent(SDL_Renderer *renderer)
{
	Entity::LoadContent("Files/config/Player.cfg", renderer);

	moveSpeed = 0.5f;
	Gravity = 0.03f;
	jumpSpeed = 3.2f;
	pDirection = Direction::Right;
}
void Player::Draw(SDL_Renderer *renderer)
{
	Entity::DrawR(renderer);
}

void Player::Update(InputManager input)
{
	Entity::Update(input);
	posX += velX;
	posY += velY;
	if (activeGravity == true)
	{
		velY += Gravity;

		if (velY > jumpSpeed)
		{
			velY = jumpSpeed;
		}
	}
	else
	{
		velY = 0;
	}
}

void Player::UpdateEvent(SDL_Event &event)
{
	if (event.type == SDL_KEYDOWN)
	{
		switch (event.key.keysym.sym)
		{
		case SDLK_SPACE: 
			if (activeButton)
			{
				if (event.key.repeat == 0)
				{
					if (!activeGravity)
					{
						jumpSpeed *= 0.986;
						velY = -jumpSpeed;
						activeGravity = true;
					}
				}
			}
			break;
		}
	}

	if (event.type == SDL_KEYUP)
	{
		switch (event.key.keysym.sym)
		{
		case SDLK_SPACE:
			if (activeButton)
			{
				if (event.key.repeat == 0)
				{
					if (activeGravity)
					{
						if (velY < -1)
						{
							velY = -1;
						}
					}
				}
			}
			break;
		}
	}
}
0

Napisałem sobie taki podstawowy skok, chciałbym go wydłużyć w taki sposób aby nie wpływało to na wysokość skoku. Jak mogę coś takiego uzyskać?

W świecie rzeczywistym należałoby zwiększyć prędkość początkową a zmniejszyć kąt. O ile to już trzeba by było sobie wyliczyć.
Ale to gdyby kod używał wzorów fizycznych, a twój chyba jednak nie używa.

0

Postaraj się nie robić obliczeń w obsłudze zdarzeń. To bardzo zły nawyk.
Rób osobne funkcje/metody do takich obliczeń.

0

vpiotr, Rozumiem. To jest tylko taki testowy kod. Napisałem go już dość dawno, dlatego może nie jest jakiś średni, tylko wiadomo jaki :D. Azarien, nie, nie używa.

Co w takium razie powinienem zrobić żeby przedłużyć skok?

0

Wydaje mi się, że będzie działać ok:

void Player::Update(InputManager input)
{
    Entity::Update(input);
    float jumpFactor = 3.0f;

    posX += velX;
    posY += velY / jumpFactor;
    if (activeGravity == true)
    {
        velY += Gravity / jumpFactor;

        if (velY > jumpSpeed)
        {
            velY = jumpSpeed;
        }
    }
    else
    {
        velY = 0;
    }
}

W ten sposób woniej opada Ci prędkość pionowa, ale też wolniej postać się przesuwa w pionie.

1

Dzięki, działa :D. Dobrze wiedzieć, że daje to taki efekt.

1 użytkowników online, w tym zalogowanych: 0, gości: 1