我認爲你沒有正確處理事件。你在這裏做的是檢查每個事件(可能是鍵盤輸入與否)是否按下sf :: Key :: Down鍵(對於sf :: Key :: Left也是如此)。
首先,它不是有效的,因爲你沒有得到你想要的結果。其次,它執行無用的檢查,承認事件可能是鼠標移動,鼠標點擊或其他任何事情:在這種情況下檢查這些鍵是否被按下對您的程序毫無意義。
我看不到你的整個代碼,但你應該嘗試這種味道的東西作爲你的主循環:
bool isMovingLeft = false;
bool isMovingDown = false;
sf::Event event;
while (win.IsOpen())
{
// While window catches events...
while(win.GetEvent(event))
{
// If the caught event is a click on the close button, close the window
if (event.Type == sf::Event::Closed)
win.Close();
// If it's a key press, check which key and move consequently
else if (event.Type == sf::Event::KeyPressed)
{
if(event.Key.Code == sf::Key::Left)
isMovingLeft = true;
else if(event.Key.Code == sf::Key::Down)
isMovingDown = true;
}
// If it's a key release, stop moving in the following direction
else if (event.Type == sf::Event::KeyReleased)
{
if(event.Key.Code == sf::Key::Left)
isMovingLeft = false;
else if(event.Key.Code == sf::Key::Down)
isMovingDown = false;
}
}
// Now that we have caught events, we move the lil' thing if we need to.
if(isMovingLeft)
x = x - SPEED;
if(isMovingDown)
y = y - SPEED;
win.Clear();
// Draw things on the screen...
win.Display();
}
在此代碼,整個過程被分成兩個部分
我們首先攔截用戶輸入,看看是否需要改變事物的移動狀態。
然後,一旦每個事件都被捕獲並徹底分析,我們就將它移動到必要的位置。它是通過兩個布爾(你可能需要增加到四個,如果你想要四個方向的控制,如果你想處理對角線方向,使用枚舉比使用八個布爾更明智,這開始是內存 - 爲這樣一個簡單的任務。)
注意:您可能會注意到,我將「速度」更改爲「SPEED」。我看不出它是一個定義,一個常量變量還是簡單的var代碼,但最好的選擇將是兩個第一個之一。我更喜歡使用#define來處理這些事情,使常量容易到達(因爲它們被放置在預處理器中),並且完全封閉的文字使它在代碼中與經典變量更加可區分。但這只是我們在這裏談論的編碼風格:)