我正在学习 SFML。我正在尝试使用“SFML 游戏开发”中的代码运行一个非常基本的 SFML 程序,但我有一个错误:
在 test-sfml.exe 中的 0x799BEA64 (sfml-window-d-2.dll) 抛出异常:0xC00000FD:堆栈溢出(参数:0x00000001)
环境是Microsoft Visual Studio 2022.
这是我的档案:
游戏.h
#pragma once
#include <SFML/Graphics.hpp>
class Game
{
public:
Game();
void run();
private:
void processEvents();
void update(sf::Time deltaTime);
void render();
void handlePlayerInput(sf::Keyboard::Key key, bool isPressed);
private:
bool mIsMovingUp, mIsMovingDown, mIsMovingRight, mIsMovingLeft;
float PlayerSpeed = 1.0f;
sf::Time TimePerFrame = sf::seconds(1.f / 60.f);
sf::RenderWindow mWindow;
sf::CircleShape mPlayer;
};
游戏.cpp
#include "Game.h"
Game::Game(): mWindow(sf::VideoMode(640, 480), "SFML Application")
, mPlayer()
, mIsMovingUp(false)
, mIsMovingDown(false)
, mIsMovingRight(false)
, mIsMovingLeft(false)
{
mPlayer.setRadius(40.f);
mPlayer.setPosition(100.f, 100.f);
mPlayer.setFillColor(sf::Color::Cyan);
}
void Game::run()
{
sf::Clock clock;
sf::Time timeSinceLastUpdate = sf::Time::Zero;
while (mWindow.isOpen())
{
processEvents();
timeSinceLastUpdate += clock.restart();
while (timeSinceLastUpdate > TimePerFrame)
{
timeSinceLastUpdate -= TimePerFrame;
processEvents();
update(TimePerFrame);
}
render();
}
}
void Game::processEvents()
{
sf::Event event;
while (mWindow.pollEvent(event))
{
switch (event.type)
{
case sf::Event::KeyPressed:
handlePlayerInput(event.key.code, true);
break;
case sf::Event::KeyReleased:
handlePlayerInput(event.key.code, false);
break;
case sf::Event::Closed:
mWindow.close();
break;
}
}
}
void Game::update(sf::Time deltaTime)
{
sf::Vector2f movement(0.f, 0.f);
if (mIsMovingUp)
movement.y -= PlayerSpeed;
if (mIsMovingDown)
movement.y += PlayerSpeed;
if (mIsMovingLeft)
movement.x -= PlayerSpeed;
if (mIsMovingRight)
movement.x += PlayerSpeed;
mPlayer.move(movement * deltaTime.asSeconds());
}
void Game::render()
{
sf::Clock clock;
while (mWindow.isOpen())
{
sf::Time deltaTime = clock.restart();
processEvents();
update(deltaTime);
render();
}
}
void Game::handlePlayerInput(sf::Keyboard::Key key, bool isPressed)
{
if (key == sf::Keyboard::W)
mIsMovingUp = isPressed;
else if (key == sf::Keyboard::S)
mIsMovingDown = isPressed;
else if (key == sf::Keyboard::A)
mIsMovingLeft = isPressed;
else if (key == sf::Keyboard::D)
mIsMovingRight = isPressed;
}
main.cpp
#include "Game.h"
int main()
{
Game game;
game.run();
}