2010-11-28 26 views
0

我正在开发SFML游戏,并且在产生玩家后出于某种原因,玩家会被传送下来。在第一次打勾时,他被正确定位,但在病房后,他被击倒。有关如何诊断此问题的任何想法?我在移动机制中设置了断点,这是玩家坐标变化的唯一位置,并且在功能结束之后似乎就会发生。这是主要的功能:SFML Sprite在第二个勾号上猛烈地向下移动

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

share mainch ::移动我们 – 2010-11-28 09:20:46

回答

0

一个简单的诊断不幸的是,你还没有提供了足够的代码。但是,根据您提供的内容,我最好的猜测是您的秋天变量尚未初始化。如果它没有被初始化,它的值可能是完全随机的,可能比预期的要大得多。这将解释你的'传送'行为。

4

你不显示你操纵sf :: Sprite对象的代码,所以我(或其他任何人)不能肯定地说,但是......我说,我有一个强大的猜猜发生了什么事。

我最近也很熟悉SFML,自己也遇到过这个问题。我认为正在发生的是你调用sf :: Sprite :: Move(x,y)将精灵移动到位置(x,y)。这是不正确的;你应该调用的是sf :: Sprite :: SetPosition(x,y)。 (这两个函数都将采用2d向量作为参数,而btw)。

我正在使用SFML 1.6的假设下运行,是吗?看起来这样...版本2.0在一定程度上改变了API,所以如果你使用的是Sprite :: Move()变成Sprite :: move(),Sprite :: SetPosition()变成Sprite :: setPosition()。

不管怎么说,包裹该作业:移动(X,Y)和SETPOSITION(X,Y)之间的不同之处在于移动精灵的位置相对调整到其当前位置,而SETPOSITION移动子画面到一个新的无论以前是在哪里。

再次,这是一个盲目的猜测,因为相关的代码不包括在内......所以我在黑暗中的镜头是否正确?