0

私は SFML ゲームに取り組んでいますが、何らかの理由でプレーヤーをスポーンした後、プレーヤーがテレポートします。最初のティックでは、彼は正しく配置されていますが、ワードの後、彼は下に移動します。この問題を診断する方法について何か考えはありますか? プレーヤーの座標が変化する唯一の場所であるムーブ メカニズムにブレークポイントを設定しました。関数が終了した直後にブレークポイントが発生するようです。これが主な機能です:

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();
}
4

2 に答える 2

4

sf :: Spriteオブジェクトを操作しているコードを表示しないので、私(または他の誰か)は確かに言うことはできませんが...とはいえ、私は何が何であるかについて強い推測を持っていますハプニング。

私も最近SFMLに慣れてきましたが、この問題に自分で遭遇しました。私が起こっていると思うのは、sf :: Sprite :: Move(x、y)を呼び出して、スプライトを位置(x、y)に移動しているということです。これは正しくありません。呼び出す必要があるのはsf::Sprite :: SetPosition(x、y)です。(これらの関数はどちらも、代わりに2次元ベクトルを引数として取ります)。

私はあなたがSFML1.6を使用しているという仮定の下で動作しています、そうですか?そのように見えます...バージョン2.0はAPIを多少変更するため、そのSprite :: Move()を使用している場合はSprite :: move()になり、Sprite :: SetPosition()はSprite :: setPosition()になります。

とにかく、これをまとめると、Move(x、y)とSetPosition(x、y)の違い​​は、Moveが現在の位置に対するスプライトの位置を調整するのに対し、SetPositionはスプライトがどこにあったかに関係なく新しい位置に移動することです。前。

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

于 2012-11-08T06:38:23.950 に答える
0

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

于 2011-04-08T20:37:18.220 に答える