SFML Sprite резко движется вниз на 2-м тике

Я работаю над игрой 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();
}

person Yelnats    schedule 28.11.2010    source источник
comment
(Я не использовал sfml) Но, глядя на этот код, я предполагаю, что ваш временной шаг не фиксирован.   -  person ninMonkey    schedule 22.11.2012


Ответы (2)


Вы не показываете код, в котором вы манипулируете объектом sf::Sprite, поэтому я (или кто-либо другой, на самом деле) не могу сказать наверняка, но... тем не менее, у меня есть сильное предположение относительно того, что происходит.

Я тоже недавно знакомился с SFML и сам столкнулся с этой проблемой. Я думаю, что происходит то, что вы вызываете sf::Sprite::Move(x,y) для перемещения спрайта в позицию (x,y). Это неправильно; то, что вы должны вызывать, это sf::Sprite::SetPosition(x,y). (Обе эти функции принимают в качестве аргумента двумерный вектор, кстати).

Я исхожу из предположения, что вы используете SFML 1.6, да? Выглядит так... версия 2.0 несколько меняет API, поэтому, если вы используете этот Sprite::Move(), он становится Sprite::move(), а Sprite::SetPosition() становится Sprite::setPosition().

В любом случае, подведем итог: разница между Move(x,y) и SetPosition(x,y) заключается в том, что Move регулирует положение спрайта относительно его текущего положения, тогда как SetPosition перемещает спрайт в новую позицию независимо от того, где она была раньше.

Опять же, это слепое предположение, поскольку соответствующий код не был включен ... так что мой выстрел в темноте был правильным?

person dsirus5    schedule 08.11.2012

К сожалению, вы не предоставили достаточно кода для прямой диагностики. Однако с учетом того, что вы предоставили, я думаю, что ваша переменная fall не была инициализирована. Если он не был инициализирован, его значения могут быть совершенно случайными и, вероятно, намного больше, чем ожидалось. Это объясняет ваше «телепортирующееся» поведение.

person epaik    schedule 08.04.2011