2010-11-28 21 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 :: moveを移動 –

+0

(私はsfmlを使用していません)しかし、私の推測では、あなたのタイムステップは固定されていないと思います。 – ninMonkey

答えて

0

は残念ながら、あなたは簡単な診断のために十分なコードを提供していません。しかし、あなたが提供したもので、あなたのの転倒の変数が初期化されていないことを推測します。初期化されていない場合、その値は完全にランダムであり、予想よりもはるかに大きい可能性があります。これはあなたの「テレポート」行動を説明します。

4

あなたはsf :: Spriteオブジェクトを操作している場所にコードを表示しないので、私(または他の誰か、本当に)は確かに言うことができませんが...私は強い何が起こっているかを推測してください。

最近私もSFMLに慣れてきましたが、この問題は自分自身で発生しました。スプライトを位置(x、y)に移動するためにsf :: Sprite :: Move(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が新しいにスプライトを移動し、一方の移動は、その現在位置にスプライトの位置相対的に調整することである。これをラップするとにかく

、どこにあったかに関係なく

また、関連するコードが含まれていなかったので、これは盲目的な推測です...暗闇の中の私のショットは正しいですか?

関連する問題