Проблемы с взаимодействием движения игрока и столкновений - PullRequest
0 голосов
/ 11 июня 2018

Я пытался создать игру сверху вниз, похожую на игру в «царство безумных богов».У меня есть некоторые проблемы с тем, чтобы заставить движение моего игрока вести себя правильно с движением моего игрока.

Некоторые вещи, которые следует иметь в виду.На каждой стороне моего плеера расположены 4 буфера толщиной 1 пиксель.Когда игрок сталкивается со стеной со скоростью 1 пиксель, игрок останавливается и ведет себя, как ожидается.

Вот проблема.Я хочу, чтобы мой плеер двигался быстрее, чем на 1 пиксель, но когда я увеличу скорость игрока до 4 пикселей, он переместится в стену.это имеет смысл, но я принял меры, чтобы этого избежать, но пока что безуспешно.

Пример кода 1 показывает код движения.

Пример кода 2 показывает код триггера движения.

Я поместил остаток кода на GitHub, который можно найти по следующей ссылке: https://github.com/Quinn-R/top-down-tech-demo

Спасибо за любую помощь, которую я получаю.

РЕДАКТИРОВАТЬ: Myигрок не полностью превзойдет стену.И игрок, и стена имеют 32 пиксельные рамки.

EDIT2: Пример кода 3 - это код, отображающий игровой цикл.

Пример кода 1

void player::move(std::string direction, std::vector<wall> walls)
{
    if(direction == "left")
    {
        for(int i = 0; i < walls.size(); i++)
        {
            if(leftBuf.getGlobalBounds().intersects(walls[i].wall1.getGlobalBounds())/* || leftBuf.getGlobalBounds().intersects(walls2[i].wall1.getGlobalBounds())*/)
            {
                //collideTop = 0;
                //collideBottom = 0;
                collideLeft = 1;
                //collideRight = 0;
            }
        }
        if(collideLeft != 1)
        {
            character.move(-1, 0);
            collideTop = 0;
            collideBottom = 0;
            collideLeft = 0;
            collideRight = 0;
        }
    }

    if(direction == "right")
    {
        for(int i = 0; i < walls.size(); i++)
        {
            if(rightBuf.getGlobalBounds().intersects(walls[i].wall1.getGlobalBounds())/* || rightBuf.getGlobalBounds().intersects(walls2[i].wall1.getGlobalBounds())*/)
            {
                //collideTop = 0;
                //collideBottom = 0;
                //collideLeft = 0;
                collideRight = 1;
            }
        }
        if(collideRight != 1)
        {
            character.move(1, 0);
            collideTop = 0;
            collideBottom = 0;
            collideLeft = 0;
            collideRight = 0;
        }
    }

    if(direction == "up")
    {
        for(int i = 0; i < walls.size(); i++)
        {
            if(topBuf.getGlobalBounds().intersects(walls[i].wall1.getGlobalBounds())/* || topBuf.getGlobalBounds().intersects(walls2[i].wall1.getGlobalBounds())*/)
            {
                collideTop = 1;
                //collideBottom = 0;
                //collideLeft = 0;
                //collideRight = 0;
            }
        }
        if(collideTop != 1)
        {
            character.move(0, -1);
            collideTop = 0;
            collideBottom = 0;
            collideLeft = 0;
            collideRight = 0;
        }
    }

    if(direction == "down")
    {
        for(int i = 0; i < walls.size(); i++)
        {
            if(bottomBuf.getGlobalBounds().intersects(walls[i].wall1.getGlobalBounds())/* || bottomBuf.getGlobalBounds().intersects(walls2[i].wall1.getGlobalBounds()*/)
            {
                //collideTop = 0;
                collideBottom = 1;
                //collideLeft = 0;
                //collideRight = 0;
            }
        }
        if(collideBottom != 1)
        {
            character.move(0, 1);
            collideTop = 0;
            collideBottom = 0;
            collideLeft = 0;
            collideRight = 0;
        }
    }
}

Кодобразец 2

void sfml1::buttonPressed()
{

    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
    {
        for(int i = 0; i < speed; i++)
        {
            players[0].move("left", walls);
        }
    }

    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
    {
        for(int i = 0; i < speed; i++)
        {
            players[0].move("right", walls);
        }
    }

    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
    {
        for(int i = 0; i < speed; i++)
        {
            players[0].move("up", walls);
        }
    }

    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
    {
        for(int i = 0; i < speed; i++)
        {
            players[0].move("down", walls);
        }
    }
}    

образец кода 3

void sfml1::sfmlLoop()
{
    setWalls();
    while(window.isOpen())
    {

        update();
        buttonPressed();
        update();

        while(window.pollEvent(event))
        {
            if(event.type == sf::Event::Closed)
                window.close();

                /*if (event.type == sf::Event::Resized)
                {
                    // update the view to the new size of the window
                    //event.size.width, event.size.height);
                    //view1.setWidth();
                    //view1.setViewport(sf::FloatRect(0, 0, 1, 1.5f));
                    view1.scale(1, 1);
                    window.setView(view1);
                }*/
        }

        draw();

    }
}

1 Ответ

0 голосов
/ 11 июня 2018

Находясь внутри функции buttonPressed (), состояние вашего персонажа определяется его буферами столкновения.Когда вы делаете этот вызов:

for(int i = 0; i < speed; i++)
{
    players[0].move("right", walls);
}

Функция move () может изменить состояние игрока, но это не отражается в буфере столкновений игрока.Вы перемещаетесь скорость раз вправо, делая проверку столкновения с вашей начальной позиции скорость раз.

Все, что вам нужно сделать, это вызвать bufUpdate () в концевашей функции move ().Это обеспечит обновление буфера столкновений после разрешения движения.

...