2017-01-01 96 views
-2

人們告訴我縮短程序後,我做了它,這裏是與上述相同的錯誤程序的縮短版本。它只出現如果我繼續下去,程序運行良好。但是看到移動函數嗎?它不起作用。精靈拒絕任何方向移動。但是,如果我在移動中給出了一個非常大的浮點值,那麼當我啓動程序時,精靈將從它的位置移開,並且它將停留在那個位置上,而不會進一步移動。例如,如果我寫入sprite.move(400.f,400.f),精靈將從(0, 0)到(400,400)並停留在那裏。它不再移動。 下面的代碼的簡化版本:在ConsoleApplication1.exe中引發0x00000000異常:0xC0000005:訪問衝突執行位置0x00000000

#include"SFML\Graphics.hpp" 
#include<iostream> 
int main() 

{ 
sf::RenderWindow window(sf::VideoMode(640, 480), "CHECK",sf::Style::Default); 
std::cout << "WORKS"; 
sf::Texture text; 
text.loadFromFile("bahamut.png"); 
sf::Sprite sprite; 
sf::Clock frap; 
sprite.setTexture(text); 
while (window.isOpen()) 
{ 
    float fps = frap.restart().asSeconds(); 
    sf::Vector2f movements; 
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::A)) 
    { 
     movements.y = 0; 
     movements.x = -1 * fps; 
    } 
    else 
    {if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::D)) 
    { 
     movements.y = 0; 
     movements.x = 1 * fps; 
    } 
    else 
    { if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::S)) 
    { 
     movements.y = 1 * fps; 
     movements.x = 0; 
    } 
     else 
    { 
     if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::W)) 
     { 
     movements.y = -1 * fps; 
     movements.x = 0; 
     } 
     else 
     { 
     movements.x = 0; 
     movements.y = 0; 
     } 
    } 
    } 
    } 
    sprite.move(movements); 
    window.clear(); 
    window.draw(sprite); 
    window.display(); 

} 
return 0; 
} 

我在代碼改進,它仍然產生相同的結果和錯誤。 使用我看到崩潰的dissassembler發生在

00B37AEE CMP ESI,在window.display ESP
()。 當我創建一個函數,並用它來顯示精靈,發生移動,但witthout恩膏虛無縹緲

+0

您應該首先將您的運動初始化爲零向量,如果您只允許向上或向下移動< >,那麼您不需要所有如果elses可以使用if語句執行此操作,因爲您重寫了每個無論如何在運動中的元素。你等待多久才能看到你的精靈動作?要注意到任何重要的移動,你必須按住一個鍵至少3秒,以便根據移動速度移動3個像素(假設它用一個浮點矢量來存儲它的位置)。至於錯誤信息,我無法看到你的調用堆棧。 – Eddge

回答

0

你的邏輯說,你的運動是0/0,如果W是按下。 W按下的塊的else將覆蓋所有之前的設置。移動精靈應該發生在你之前display

我看不到空指針異常的原因,但這是調試器的用途。下次發生這種情況時,調試。

哦,它是int main(),而不是void。我知道編譯器容忍這個錯誤,但它仍然是一個錯誤和未定義的行爲。

+0

等待我記得在C++中使用void爲什麼不能在這裏使用void?你能幫我調試這個部分嗎?我發現堆棧跟蹤完全沒有幫助。我不知道它是關於什麼的。 –

+0

如果您的編譯器允許,您可以使用'void main()',這只是錯誤的,如果它以'void main()'開頭,那麼您的編譯器或編譯器的下一個編譯器或版本可以正確地執行任何他喜歡的代碼。所以不要這樣做。調試部分是如果你不按「繼續」會發生什麼。我無法通過互聯網真正幫助你,你必須嘗試閱讀一本好書或教程。 – nvoigt

+0

嘿,我現在編輯了else語句的代碼,但它仍然不起作用。我試圖查找調試部分。如果我發佈堆棧跟蹤會有幫助嗎?請我知道我是愚蠢的東西但請幫助我我是這裏的新手 –

相關問題