gpt4 book ai didi

c++ - SFML Sprite 在第二次滴答时猛烈向下移动

转载 作者:行者123 更新时间:2023-11-27 23:32:19 25 4
gpt4 key购买 nike

我正在开发一款 SFML 游戏,由于某种原因,在生成玩家后,玩家被传送了下来。在第一个 tick 时,他的位置正确,但在 wards 之后,他被向下移动。关于如何诊断此问题的任何想法?我在移动机制中设置了断点,玩家坐标唯一发生变化的地方,它似乎是在函数结束后立即发生的。这是主要功能:

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

最佳答案

您没有在操作 sf::Sprite 对象的地方显示代码,所以我(或其他任何人,真的)不能肯定地说,但是......也就是说,我有一个强烈的猜测至于发生了什么。

我最近也在熟悉SFML,我自己也遇到了这个问题。我认为正在发生的事情是您正在调用 sf::Sprite::Move(x,y) 将 Sprite 移动到位置 (x,y)。这是不正确的;你应该调用的是 sf::Sprite::SetPosition(x,y)。 (顺便说一句,这两个函数都将采用 2d vector 作为参数)。

我假设您使用的是 SFML 1.6,是吗?看起来是这样……2.0 版稍微改变了 API,所以如果您使用 Sprite::Move() 变成 Sprite::move() 和 Sprite::SetPosition() 变成 Sprite::setPosition()。

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

同样,这是一个盲目的猜测,因为没有包含相关代码...那么我在黑暗中的猜测是否正确?

关于c++ - SFML Sprite 在第二次滴答时猛烈向下移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4295253/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com