C++ SFML精灵在第二次滴答声时猛烈向下移动

C++ SFML精灵在第二次滴答声时猛烈向下移动,c++,sfml,C++,Sfml,我正在制作一个SFML游戏,由于某种原因,在生成玩家后,玩家会被传送下来。在第一个滴答声中,他被正确定位,但在沃兹之后,他被向下移动。你知道如何诊断这个问题吗?我在移动机制中设置了断点,这是玩家坐标变化的唯一地方,而且似乎在函数结束后立即发生。这是主要功能: int main(){ App.ShowMouseCursor(false); mainch.mainchinventory.read(); while (App.IsOpened()) { sf::Event Event;

我正在制作一个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;
}
主通道移动(t):

void cmainchar::move(float t){
if(App.GetInput().IsKeyDown(sf::Key::S))mainchinventory.save();
if(App.GetInput().IsKeyDown(sf::Key::R))mainchinventory.read();
如果(App.GetInput().IsKeyDown(sf::Key::A))A=true;
否则A=假;
如果(App.GetInput().IsKeyDown(sf::Key::D))D=true;
否则D=假;
如果(接地)
if(App.GetInput().IsKeyDown(sf::Key::W))first=true;
if((App.GetInput().IsKeyDown(sf::Key::I))&&(keydreleased)){
if(主通风管和排水管){
mainchinventory.drawmain=false;
mainchinventory.按(mainchinventory.selectionx,3);
}
否则{
mainchinventory.drawmain=true;
}
密钥释放=假;
}
如果(!App.GetInput().IsKeyDown(sf::Key::I))
keyreleased=true;
如果(!mainchinventory.drawmain){
如果(App.GetInput().IsKeyDown(sf::Key::Num1))mainchinventory.press(0,3);
否则如果(App.GetInput().IsKeyDown(sf::Key::Num2))mainchinventory.press(1,3);
否则如果(App.GetInput().IsKeyDown(sf::Key::Num3))mainchinventory.press(2,3);
如果(App.GetInput().IsKeyDown(sf::Key::Num4))mainchinventory.press(3,3);
否则如果(App.GetInput().IsKeyDown(sf::Key::Num5))mainchinventory.press(4,3);
否则如果(App.GetInput().IsKeyDown(sf::Key::Num6))mainchinventory.press(5,3);
否则如果(App.GetInput().IsKeyDown(sf::Key::Num7))mainchinventory.press(6,3);
否则如果(App.GetInput().IsKeyDown(sf::Key::Num8))mainchinventory.press(7,3);
否则如果(App.GetInput().IsKeyDown(sf::Key::Num9))mainchinventory.press(8,3);
否则如果(App.GetInput().IsKeyDown(sf::Key::Num0))mainchinventory.press(9,3);
if(App.GetInput().IsMouseButtonDown(sf::Mouse::Button::Left)){
mainchinventory.dockitems[mainchinventory.selectionx].use();
咒语。推回(cspell());
}
}
如果((App.GetInput().IsMouseButtonDown(sf::Mouse::Button::Left))&&&&(mainchinventory.drawmain)&&&(buttonrenrelease)){
mainchinventory.checkmouse();
按钮释放=假;
}
如果(!App.GetInput().IsMouseButtonDown(sf::Mouse::Button::Left))
按钮释放=真;
intxmap=(View.GetCenter().x-320)/40;
int-ymap=(View.GetCenter().y-240)/40;
if((xmap!=xmapold)|(ymap!=ymapold))
maps.read();
xmapold=xmap;
ymapold=ymap;
碰撞();
for(std::list::迭代器i=mainch.spells.begin();i!=mainch.spells.end();i++)
如果(i->移动(t))
咒语。擦除(i);
如果(A&&左){
动画(2,t);
移动(-160*t,0);
}
如果(右和右){
动画(1,t);
移动(160*t,0);
}
如果(!D&&!A)
动画(0,t);
如果(向上){
如果(先接地(&F){
跳跃=1.25;
第一个=假;
}
如果(跳转>0){
移动(0,-250*t*跳跃);
跳跃=跳跃-1*t;
}

如果(jump不幸的是,您没有提供足够的代码来进行简单的诊断。然而,根据您提供的代码,我的最佳猜测是您的fall变量尚未初始化。如果尚未初始化,其值可能是完全随机的,可能比预期值大得多。这可以解释您的“远程传送”'行为。

不幸的是,您没有提供足够的代码来进行简单的诊断。但是,根据您提供的代码,我的最佳猜测是您的fall变量尚未初始化。如果尚未初始化,其值可能是完全随机的,可能比预期值大得多。这可以解释您的't'eReporting’behavior.

您没有显示操作sf::Sprite对象的代码,因此我(或其他任何人)无法确定,但……也就是说,我对发生的事情有很强的猜测

我最近也在熟悉SFML,我自己也遇到了这个问题。我认为现在发生的是,您正在调用sf::Sprite::Move(x,y)来将精灵移动到位置(x,y)。这是错误的;您应该调用的是sf::Sprite::SetPosition(x,y)。(顺便说一句,这两个函数都将2d向量作为参数)

我是在假设您使用的是SFML 1.6的情况下操作的,是吗?看起来是这样的…版本2.0在某种程度上改变了API,因此如果您使用的是Sprite::Move()变成Sprite::Move(),Sprite::SetPosition()变成Sprite::SetPosition()

总之,总结一下:Move(x,y)和SetPosition(x,y)之间的区别在于Move调整精灵相对于其当前位置的位置,而SetPosition将精灵移动到一个新位置,而不管它之前在哪里


同样,这是一个盲目的猜测,因为相关的代码没有包括在内……那么我在黑暗中拍摄的照片正确吗?

您没有显示操作sf::Sprite对象的代码,所以我(或其他任何人,真的)不能确定,但是……也就是说,我对发生的事情有很强的猜测

我最近也在熟悉SFML,我自己也遇到了这个问题。我认为现在发生的是,您正在调用sf::Sprite::Move(x,y)来将精灵移动到位置(x,y)。这是错误的;您应该调用的是sf::Sprite::SetPosition(x,y)。(顺便说一句,这两个函数都将2d向量作为参数)

我是在假设您使用的是SFML 1.6的情况下操作的,是吗?看起来是这样的…版本2.0在某种程度上改变了API,因此如果您使用的是Sprite::Move()变成Sprite::Move(),Sprite::SetPosition()变成Sprite::SetPosition()

总之,总结一下:移动(x,y)之间的区别
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();
}