Я пытался создать игру сверху вниз, похожую на игру в «царство безумных богов».У меня есть некоторые проблемы с тем, чтобы заставить движение моего игрока вести себя правильно с движением моего игрока.
Некоторые вещи, которые следует иметь в виду.На каждой стороне моего плеера расположены 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();
}
}