SFML - 将对象移向坐标

3
我正在使用C++和SFML开发一个人工智能系统,希望敌人能够跟随玩家。我将创建一个机制,使得敌人向玩家30帧之前的位置移动(因此它将不断更新)。但我的问题很简单,如何通过数学计算让敌人移动到特定的点?比如说,玩家在(230, 400),敌人在(100, 200),我该如何使用.move()函数和速度为3来让敌人移动到那个点?任何帮助都将是fantastic!
---以下是处理移动的当前代码更新---
float angle = atan2(v2iEnemyPos[1].y - rsPlayer.getPosition().y, v2iEnemyPos[1].x - rsPlayer.getPosition().x);
    angle =angle * 180 / (atan(1) * 4);
   sf::Vector2f newpos((cos(angle))*2, (sin(angle))*2);
    std::cout << newpos.x << " " << newpos.y << std::endl;
    rsEnemy[1].move(newpos.x, newpos.y);
    rwWinOne.draw(rsPlayer);
    rwWinOne.display();
    rwWinOne.clear();

1
这取决于你想让敌人如何行动。如果你让敌人直接向玩家直线移动,那么玩家可能很难避开敌人。在开始编码之前,你必须先考虑这一点。 - user3920237
这是正确的,但是我可以使用节点使其后续具有更弯曲的路径,但是我仍然需要知道如何将敌人移动到一个位置,不是吗? - user3927922
速度可以是Vector2(如果x和y不同),也可以是标量(在这种情况下,它等同于您所说的内容)。 - user3920237
@remyabel 'float angle = atan2(v2iEnemyPos[1].y - rsPlayer.getPosition().y, v2iEnemyPos[1].x - rsPlayer.getPosition().x); angle =angle * 180 / (atan(1) * 4); sf::Vector2f newpos((cos(angle))*2, (sin(angle))*2); std::cout << newpos.x << " " << newpos.y << std::endl; rsEnemy[1].move(newpos.x, newpos.y); rwWinOne.draw(rsPlayer); rwWinOne.display(); rwWinOne.clear();' - user3927922
游戏逻辑不应该基于帧,而应该基于时间。 - Qix - MONICA WAS MISTREATED
显示剩余4条评论
2个回答

2

将敌人移动的方向仅为玩家位置与敌人位置之间的差异。然而,您希望敌人以恒定速度移动,因此需要对结果进行归一化处理。这将为您提供长度为1的向量作为方向。

Vector2u direction = normalize(player.getPosition() - enemy.getPosition());

您现在可以将此方向乘以该敌人类型的速度常数。结果是一个向量,其长度取决于速度因素而不是与玩家的距离。只需使用结果移动您的敌人即可。

enemy.move(speed * direction);

然而,您每帧执行一次此操作,帧速率可能因机器和配置而异。因此,您应将自上次移动调用以来的经过时间(可能是您的帧时间)作为方程式的因素添加进去。这样,如果一帧需要比平常更长的时间,敌人将被移动得更远,反之亦然。

// Initialize a timer
sf::Clock clock;

// Get elapsed time at the beginning of a frame
// I multiply this by target framerate to get a value around one
float delta = clock.restart().asSeconds() * 60;

// Move all objects based on elapsed time
Vector2u direction = normalize(player.getPosition() - enemy.getPosition());
enemy.move(delta * speed * direction);

顺便说一下,在游戏开发中经常需要线性代数的基础知识,因此你可能需要参加在线课程来学习。


0

在计算中应考虑经过的时间(自上一帧以来)- dt。

敌人有一个给定的速度:enemy_velocity。

我不会使用move()函数,而是使用SetPosition()。

您必须计算敌人的新位置:

enemy.x += dt * enemy_velocity * cos(angle);
enemy.y += dt * enemy_velocity * sin(angle);

并使用SetPosition()进行影响。


1
他需要角度做什么?如果我理解正确,他只是想将点A移向B,从而通过 speed * normalize(B - A) 进行移动。 - danijar
1
是的,你说得对,danijar。我刚看到他在使用角度,我也用了它们,但是你的解决方案更好! - Cirrus Minor
@danijar 谢谢!不仅修复了运动问题,而且使其更加流畅,感谢您! - user3927922
@user3927922,我很高兴能够帮忙。 - danijar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接