2010-11-28 7 views
0

SFML 게임에서 작업 중이며 플레이어를 스폰 한 후 어떤 이유로 플레이어가 텔레포트됩니다. 첫 번째 틱에서 그는 올바르게 배치되었지만 와드 후에 그는 아래로 내려갔습니다. 이 문제를 진단하는 방법에 대한 아이디어가 있습니까? 나는 플레이어의 좌표가 바뀌는 유일한 곳인 이동 메커니즘에 중단 점을 설정하고 함수가 끝난 직후에 발생하는 것으로 보입니다.SFML 스프라이트가 2 차 틱에서 격렬하게 움직입니다.

int main(){ 
App.ShowMouseCursor(false); 
mainch.mainchinventory.read(); 
while (App.IsOpened()) 
{ 
    sf::Event Event; 
    while (App.GetEvent(Event)) 
    { 
     if (Event.Type == sf::Event::Closed) 
      App.Close(); 
    } 

    float time = App.GetFrameTime(); 
    mainch.move(time); 
    App.Clear(); 
    drawall(); 
    App.Display(); 

} 
return EXIT_SUCCESS; 
} 

Mainch.move (t) : 간단한 진단

void cmainchar::move(float t){ 
if (App.GetInput().IsKeyDown(sf::Key::S)) mainchinventory.save(); 

if (App.GetInput().IsKeyDown(sf::Key::R)) mainchinventory.read(); 

if (App.GetInput().IsKeyDown(sf::Key::A)) A = true; 
else A = false; 

if (App.GetInput().IsKeyDown(sf::Key::D)) D = true; 
else D = false; 

if(grounded) 
    if (App.GetInput().IsKeyDown(sf::Key::W)) first = true; 

if ((App.GetInput().IsKeyDown(sf::Key::I)) && (keyreleased)){ 
    if (mainchinventory.drawmain){ 
     mainchinventory.drawmain = false; 
     mainchinventory.press(mainchinventory.selectionx, 3); 
    } 

    else{ 
     mainchinventory.drawmain = true; 
    } 

keyreleased = false; 
} 

else if (!App.GetInput().IsKeyDown(sf::Key::I)) 
    keyreleased = true; 



if(!mainchinventory.drawmain){ 
    if(App.GetInput().IsKeyDown(sf::Key::Num1)) mainchinventory.press(0, 3); 
    else if(App.GetInput().IsKeyDown(sf::Key::Num2)) mainchinventory.press(1, 3); 
    else if(App.GetInput().IsKeyDown(sf::Key::Num3)) mainchinventory.press(2, 3); 
    else if(App.GetInput().IsKeyDown(sf::Key::Num4)) mainchinventory.press(3, 3); 
    else if(App.GetInput().IsKeyDown(sf::Key::Num5)) mainchinventory.press(4, 3); 
    else if(App.GetInput().IsKeyDown(sf::Key::Num6)) mainchinventory.press(5, 3); 
    else if(App.GetInput().IsKeyDown(sf::Key::Num7)) mainchinventory.press(6, 3); 
    else if(App.GetInput().IsKeyDown(sf::Key::Num8)) mainchinventory.press(7, 3); 
    else if(App.GetInput().IsKeyDown(sf::Key::Num9)) mainchinventory.press(8, 3); 
    else if(App.GetInput().IsKeyDown(sf::Key::Num0)) mainchinventory.press(9, 3); 

    if(App.GetInput().IsMouseButtonDown(sf::Mouse::Button::Left)){ 
     mainchinventory.dockitems[mainchinventory.selectionx].use(); 
     spells.push_back(cspell()); 
    } 
} 

else if ((App.GetInput().IsMouseButtonDown(sf::Mouse::Button::Left)) && (mainchinventory.drawmain) && (buttonreleased)){ 
    mainchinventory.checkmouse(); 
    buttonreleased = false; 
} 


else if (!App.GetInput().IsMouseButtonDown(sf::Mouse::Button::Left)) 
    buttonreleased = true; 

int xmap = (View.GetCenter().x - 320)/40; 
int ymap = (View.GetCenter().y - 240)/40; 

if ((xmap != xmapold) || (ymap != ymapold)) 
    maps.read(); 

xmapold = xmap; 

ymapold = ymap; 

collisions(); 

for(std::list<cspell>::iterator i = mainch.spells.begin(); i != mainch.spells.end(); i++) 
    if (i->move(t)) 
     spells.erase(i); 

if (A && left){ 
    animate(2, t); 
    you.Move(-160 * t, 0); 
} 
if (D && right){ 
    animate(1, t); 
    you.Move(160 * t, 0); 
} 

if (!D && !A) 
    animate(0, t); 

if (up){ 
    if(grounded && first){ 
     jump = 1.25; 
     first = false; 
    } 
    if (jump > 0){ 
     you.Move (0,-250 * t * jump); 
     jump = jump - 1 * t; 
    } 
    if (jump <= 0){ 
     jump = 0.f; 
    } 
} 

else{ 
    first = false; 
    jump = 0.f; 
} 


if (down){ 
    fall = fall + 10 * t; 
    you.Move(0, 25 * fall * t); 
    grounded = false; 
} 

else{ 
    fall = 0.f; 
    grounded = true; 
} 

if(teleport){ 
    mainchinventory.spawn = true; 
    fall = 0.f; 
    jump = 0.f; 
    maps.changemap(maps.nxtmap); 
    teleport = false; 
} 

moveview(); 
} 
+0

공유 mainch 우리 –

+0

로 이동 :: (나는 sfml을 사용하지 않는 한)하지만 그 코드를보고 내 생각 엔 당신의 시간 단계가 해결되지 않은 것입니다. – ninMonkey

답변

0

불행하게도, 당신이 제공하지 않은만큼 코드이 주요 기능입니다. 당신이 제공 한 것과 함께, 내 가장 좋은 추측은 가을 변수가 초기화되지 않은 것입니다. 초기화되지 않은 경우 해당 값은 완전히 임의적 일 수 있으며 예상보다 훨씬 클 수 있습니다. 이렇게하면 '순간 이동'동작이 설명됩니다.

4

당신은 당신이 SF :: Sprite 객체를 조작하고있는 코드를 표시하지 않습니다, 그래서 (또는 다른 사람이 정말이) 나는 강한이 말했다 ... 확실히 말할 수는 없지만 무슨 일이 일어나는 지 짐작하십시오.

최근 SFML에 익숙해 져서이 문제가 직접 발생했습니다. 내가 생각하는 것은 sf :: Sprite :: Move (x, y)를 호출하여 스프라이트를 위치 (x, y)로 이동시키는 것입니다. 이것은 잘못되었습니다. 당신이 호출해야하는 것은 sf :: Sprite :: SetPosition (x, y)입니다. (이 두 함수는 모두 인수로 2d 벡터를 사용합니다 (btw).

나는 그래, 당신이 SFML 1.6을 사용하고있는 가정하에 운영하고있어? 경우에 당신은 스프라이트 :: 이동()는 스프라이트 :: 이동()와 스프라이트 ::로 setPosition을() 될 것을 사용하고, 그래서 그 방법은 ... 버전 2.0은 다소 API를 변경 보이는 것은 스프라이트 ::로 setPosition이됩니다().

여하튼

이를 포장하는 : 이동 (X, Y) 및 setPosition를 (X, Y) 사이의 차이로 setPosition 새에 스프라이트 이동 반면, 그 이동, 현재 위치에 스프라이트 순위 대하여 조정이며 위치에 관계없이 이전 위치.

다시, 이것은 관련 코드가 포함되지 않은 이후 장님 추측은 너무 어두운 올바른 내 촬영했습니다 ...인가?