SFML Sprite резко снижается на втором тике - PullRequest
0 голосов
/ 28 ноября 2010

Я работаю над 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 (т):

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

Ответы [ 2 ]

4 голосов
/ 08 ноября 2012

Вы не показываете код, которым манипулируете объектом 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 перемещает спрайт на новую должность независимо от того, где она была раньше.

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

0 голосов
/ 09 апреля 2011

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

...