我正在使用游戏状态创建一个简单的游戏。
我有一个gameLoop()
方法调用running()
方法,该方法包含正常工作的切换状态。
这是gameLoop()
方法:
void Game::gameLoop()
{
while (window.isOpen()) {
Event event;
while (window.pollEvent(event)) {
if (event.type == Event::Closed){
window.close();
}
}
if (Keyboard::isKeyPressed(Keyboard::Escape)) {
window.close();
}
window.clear();
running(); //this calls the states
window.display();
}
running()
方法调用所有状态:
void Game::running()
{
switch (state)
{
//other cases here
case s_play:
play();
break;
default:
break;
}
}
play()
方法绘制精灵并移动它:
void Game::play()
{
Texture myTexture; //I've also tried to declare these outside the method
Sprite mySprite;
///////////Graphics
myTexture.loadFromFile("res/img/player.png");
mySprite.setTexture(myTexture);
//////////Movement
static sf::Clock clock;
float dt = clock.restart().asSeconds();
Vector2f move;
if (Keyboard::isKeyPressed(Keyboard::A))
{
move.x--;
}
std::cout << mySprite.getPosition().x << "\n";
}
if (Keyboard::isKeyPressed(Keyboard::D))
{
move.x++;
}
std::cout << mySprite.getPosition().x << "\n";
}
mySprite.move(move*300.0f*dt);
window.draw(mySprite);
}
问题是精灵只是在现场移动,当按下A或D时,从std :: cout获得的输出如下:
运动的功能起作用,因为它在别处测试过。我认为我正确地更新或以错误的方式初始化某些东西,但我无法弄明白。
答案 0 :(得分:1)
我不熟悉SFML,所以我希望我不在这里,不过,看看你的代码。在play()方法中,创建一个局部变量move。从它的外观来看,move包含Sprite的x和y坐标。由于您在play()方法中定义了move,因此它的本地副本 每次代码运行play()方法时,都会在运行时在堆栈上创建此变量。然后检查按键,inc或dec 相应地移动。 move需要在全局范围内,这样每次调用play()时都不会重置它。 当你将myTexture和mySprite移到函数play()之外时,你是对的。您还应该将移动移到play()方法之外。
这样的事情:
Texture myTexture; //I've also tried to declare these outside the method
Sprite mySprite;
Vector2f move;
void Game::play()
{
///////////Graphics
myTexture.loadFromFile("res/img/player.png");
mySprite.setTexture(myTexture);
//////////Movement
static sf::Clock clock;
float dt = clock.restart().asSeconds();
if (Keyboard::isKeyPressed(Keyboard::A))
{
move.x--;
}
std::cout << mySprite.getPosition().x << "\n";
}
if (Keyboard::isKeyPressed(Keyboard::D))
{
move.x++;
}
std::cout << mySprite.getPosition().x << "\n";
}
mySprite.move(move*300.0f*dt);
window.draw(mySprite);
}
希望有所帮助
答案 1 :(得分:0)
您应该在循环之外的myTextureand
和mySprite
声明他们应该留下的地方。
目前,您在每次迭代中再次创建它们,这对性能有害(特别是myTexture.loadFromFile("res/img/player.png");
)。娱乐还重置了变换(位置,旋转等)