Движение игрока SFML

90
21 апреля 2022, 20:50
void update(RenderWindow& window)
    {
        Event event;
        if (Keyboard::isKeyPressed(Keyboard::W))
        {
            dy = -0.3;
        }
        if (Keyboard::isKeyPressed(Keyboard::A))
        {
            dx = -0.3;
        }
        if (Keyboard::isKeyPressed(Keyboard::S))
        {
            dy = 0.3;
        }
        if (Keyboard::isKeyPressed(Keyboard::D))
        {
            dx = 0.3;
        }
    
        x += dx;
        y += dy;
        dx = dy = 0;
        EntitySprite.setPosition(x, y);
        window.draw(EntitySprite);
        
    }
};

При движении описанном в таком коде, игрок движется угловато: либо влево, либо вверх, либо вправо, либо вниз, ли по диагонали под углом 45 градусов при нажатии двух кнопок вместе, например S и D. Можно ли этот угол сделать более плавным, чтобы само движение осуществлялось не только влево, вправо, по диагонали и т.д? Моих знаний по геометрии здесь не хватает, поэтому прошу у вас помощь).

Answer 1

Я сделал это так, добавив ускорение и дельта ускорение, дав возможность игроку контролировать не скорость, а ускорение!

void update(RenderWindow& window) 
{
    float decceleration = 0.3;
    if (Keyboard::isKeyPressed(Keyboard::W))
    {
        accelerationY -= decceleration;
    }
    if (Keyboard::isKeyPressed(Keyboard::S))
    {
        accelerationY += decceleration;
    }
    if (Keyboard::isKeyPressed(Keyboard::A))
    {
        accelerationX -= decceleration;
    }
    if (Keyboard::isKeyPressed(Keyboard::D))
    {
        accelerationX += decceleration;
    }
    dx += accelerationX;
    dy += accelerationY;
    speed = sqrt(dx * dx + dy * dy);
    if (speed > maxSpeed)
    {
        dx *= maxSpeed / speed;
        dy *= maxSpeed / speed;
    }
    x += dx;
    y += dy;
    dx *= 0.9;
    dy *= 0.9;
    accelerationX = 0;
    accelerationY = 0;
    EntitySprite.setPosition(x, y);
    window.draw(EntitySprite);
}
READ ALSO
За какую ассимптотику работает std::stoi?

За какую ассимптотику работает std::stoi?

В связи с решением одной задачи, в которой я из - за std::stoi получила TL, мне стало интересно - за сколько эта функция работает (в плане ассимптотики)Хотя...

90
Музыка в консоли на С++

Музыка в консоли на С++

Возник вопрос - Как запустить mp3-трек в консоли? Погуглил и все ответы были на тему "установить какие-то библиотеки и они будут на фоне подгружать...

87
Ошибка сегментации СИ

Ошибка сегментации СИ

В Visual Studio всё работает прекрасно, а при компиляции в c99 иногда появляется ошибка сегментации

83
Автовыведение типа

Автовыведение типа

я только начинаю свой путь в С++ поэтому задался таким вопросом как : Стоит ли вообще использовать auto в указании переменой или же лучше указывать...

99