2012-10-25 5 views
0

SFML 1.6에서 스프라이트를 움직이는 데 문제가 있습니다. 내 프로그램의 모든 변수가 올바르게 설정되어 있지만 sf::Sprite.Move() 함수는 main() 함수 내에서만 작동합니다. 아래 main.cpp 파일에있는 playerMoveTest() 함수의 문제를 복제했습니다. 누구든지이 버그에 대한 해결책을 알고 있거나 기꺼이 도울 수 있다면 많은 도움이 될 것입니다.SFML 1.6 - sf :: Sprite.Move()가 main() 함수 외부에서 작동하지 않습니다.

#include "main.h" 
#include "collision.cpp" 
#include "events.cpp" 
#include "animation.cpp" 
//#include "hud_pls_mnu.cpp" TODO Put Back in 
#include "physics.cpp" 

#define FPS 60 //Define frames per second for the program to run on 

#define WIN_DEM_X 800 
#define WIN_DEM_Y 600 

#define MNU_OFF 0 
#define MNU_MAIN 1 
#define MNU_PAUSE 2 
#define MNU_INV 3 
int menu=MNU_OFF; 

void playerMoveTest(void); 

int main() 
{ 
//Open a window 
sf::RenderWindow App(sf::VideoMode(WIN_DEM_X, WIN_DEM_Y), "Crispy Bacon"); 

bool firstframe=true; 

//Initialize the player 
if(!player_data.image.LoadFromFile("spritesheet.png")) 
    return EXIT_FAILURE; 
sf::Sprite player(player_data.image); 
player.SetPosition(10, 10); 
player_data.time_in_cycle.Reset(); 
player.Resize(300,300); //Resize "player" to be smaller than the window 

//Initialize an object 
if(!cursor_data.image.LoadFromFile("cursor.png")) 
    return EXIT_FAILURE; 
sf::Sprite cursor(cursor_data.image); 
cursor.SetPosition(400, 300); 
cursor_data.time_in_cycle.Reset(); 
cursor.Resize(50, 50); 

//NOTE Testing stuff here 
sf::Vector2f playerSize=player.GetSize(); 
sf::Vector2f objectSize=cursor.GetSize(); 
printf("Player size:\nX:%f\nY:%f\nObject Size:\nX:%f\nY:%f\n", playerSize.x, playerSize.y, objectSize.x, objectSize.y); 

App.SetFramerateLimit(60);//Set a FPS cap 

//Draw screen border.(Room 101) 
sf::Shape rm_101; 
rm_101.AddPoint(5, 5,      sf::Color(255, 0, 0),  sf::Color(0, 0, 0)); 
rm_101.AddPoint(5, WIN_DEM_Y-5,   sf::Color(255, 0, 0),  sf::Color(0, 0, 0)); 
rm_101.AddPoint(WIN_DEM_X-5, WIN_DEM_Y-5, sf::Color(255, 0, 0),  sf::Color(0, 0, 0)); 
rm_101.AddPoint(WIN_DEM_X-5, 5,   sf::Color(255, 0, 0),  sf::Color(0, 0, 0)); 
rm_101.SetOutlineWidth(20); 
rm_101.EnableFill(false); 

// Define a text string for version number 
sf::String version_num("Pre-Alpha v0.0.0"); 
version_num.SetPosition(10.f, 550.f); 
version_num.SetColor(sf::Color::Black); 

//Create a view 
sf::View view(sf::FloatRect(0, 0, 800, 600)); 


//Start running loop 
while (App.IsOpened()) 
{ 
    // Get elapsed time 
    Frametime = App.GetFrameTime(); 

    //Process Events(i.e. the window was told to close) 
    switch(menu) 
    { 
    case MNU_OFF: 
     game_events(App); 
     break; 

    case MNU_MAIN: 
     if(firstframe==true) break; 

    } 

    //Move stuff TODO:Make so uses linked lists(in phisics file? 
    move(player, player_data); 
    playerMoveTest(); 

    //Match proper player animation frame 
    animateBody(player, player_data); 

    //Clear Screen NOTEVarious screnclears for testing 
    if(collide_rec(player, cursor)) 
    App.Clear(sf::Color(100, 100, 100)); 
    else 
    App.Clear(sf::Color(255, 255, 255)); 

    //Set View to player 
    view.SetCenter(player.GetPosition()); 

    //Display stuff 
    App.SetView(view);//Set View to normal 
    App.Draw(rm_101); 
    App.Draw(player); 
    App.Draw(cursor); 


    //After the view is set to the HUD position 
    App.SetView(App.GetDefaultView());//Set veiw to HUD position 
    App.Draw(version_num); 

    App.Display(); 

    firstframe=false; 
} 
} 

void playerMoveTest(void) 
{ 
player.Move(50,50); 
} 
+0

몇 가지 질문 : 왜 아직도 2.0 대신 SFML 1.6을 사용하고 있습니까? 보고있는 버그를 보여주는 최소한의 샘플로 코드를 제거하려고 시도 했습니까? 함수'move'가 main에서 기능 만한다는 것은 무엇을 의미합니까? 정확히 무엇이 잘못 될까요? – Alex

답변

0

player 스프라이트은 그래서 당신이 (이 범위 밖이다) playerMoveTest(void)에서 참조 할 수 없습니다 main에 정의되어있다. 이것을 매개 변수로 전달하십시오.

int main(){ 
.... 
playerMoveTest(player); 
.... 
} 


void playerMoveTest(sf:Sprite& player) 
{ 
player.Move(50,50); 
} 
관련 문제