所以我正在开发一个使用C ++和SFML的AI系统,我想让敌人跟随玩家。我要创建它,以便敌人朝着玩家30帧前的点移动(所以它会不断更新)。但我的问题很简单,让敌人移动到特定点背后的数学是什么?就像让我们说玩家处于(230,400)并且敌人处于(100,200)时,我如何获得敌人(使用速度为3的.move()函数)移动到那一点?任何帮助都会很棒!
---更新下面的现行法规处理运动-----
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();
答案 0 :(得分:3)
移动敌人的方向只是玩家位置和敌人位置之间的差异。但是,您希望敌人以恒定速度移动,因此您需要将结果标准化。这将为您提供长度为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);
顺便说一下,在游戏开发中经常需要线性代数的基本知识,所以你可能需要付费才能参加在线课程。
答案 1 :(得分:0)
您应该在计算中考虑经过的时间(自上一帧) - dt - 。
敌人有一定的速度:enemy_velocity。
我不会使用move()函数,而是使用SetPosition()。
你必须计算敌人的新位置:
enemy.x += dt * enemy_velocity * cos(angle);
enemy.y += dt * enemy_velocity * sin(angle);
并使用SetPosition()来影响它。