2017-01-01 8 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에서 ESP
window.display에서 발생(). 내가 함수를 만들고 스프라이트를 표시하는 데 사용할 때 는, 운동은

+0

움직임을 0 벡터로 초기화해야합니다. < >의 움직임 만 허용하려면 위 또는 아래로 이동해야합니다. 모든 ifels if 문을 사용하여 모든 작업을 무시할 수 있습니다. 어쨌든 움직임의 요소. 스프라이트가 움직이기를 얼마나 기다리나요? 중요한 움직임을 알아 내려면 최소한 3 초 동안 키를 누르고 있으면 이동 속도에 따라 3 픽셀 씩 움직이는 것을 볼 수 있습니다 (플로트 벡터로 위치를 저장한다고 가정 할 때 ...). 오류 메시지에 관해서는, 나는 당신의 호출 스택을 보지 않고는 많은 것을 할 수 없다. – Eddge

답변

0

귀하의 논리 W를 누르면 하지 경우 귀하의 움직임이 0/0 말한다 기름 부음의 나다 witthout 발생했지만. W pressed 블록의 else은 이전의 모든 설정보다 우선합니다. 그리고 스프라이트 이동은 display 전에 일어나야합니다.

널 포인터 예외의 이유를 볼 수 없지만 디버거가 그 이유입니다. 다음에 이런 일이 발생하면 디버그합니다.

오, 그게 int main()이 아니라, void입니다. 컴파일러가이 오류를 허용한다는 것을 알고 있지만 여전히 오류 및 정의되지 않은 동작입니다.

+0

기다림 나는 C++에서 void를 사용하는 것을 기억합니다. 왜 우리는 여기서 void를 사용합니까? 그리고이 디버깅 부분에서 나를 도울 수 있겠습니까? 전혀 도움이되지 않는 스택 추적을 발견했습니다. 그게 무엇인지 전혀 몰랐습니다. –

+0

컴파일러가 허용하는 경우'void main()'을 사용할 수 있습니다. 단지 잘못되어 컴파일러의 다음 컴파일러가'void main()'으로 시작하면 코드에서 좋아하는 것을 정당하게 처리 할 수 ​​있습니다. 그러지 마라. 디버깅 부분은 "계속"을 누르지 않으면 발생합니다. 인터넷을 통해 정말 도움이되지 않습니다. 좋은 책이나 튜토리얼을 읽으십시오. – nvoigt

+0

지금 else 문을 사용하여 코드를 편집했지만 여전히 작동하지 않습니다. 디버깅 부분을 찾으려고합니다. 스택 추적을 게시하면 도움이 될까요? 제가 바보스럽고 물건이라고 알고 있습니다. 하지만 제발 나를 도와주세요 초보자입니다 –