【问题标题】:SFML - Move object towards coordSFML - 将对象移向坐标
【发布时间】:2014-10-03 17:46:14
【问题描述】:

所以我正在使用 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();

【问题讨论】:

  • 这取决于你希望敌人如何表现。如果让敌人直接向玩家直线移动,玩家可能很难避开敌人。在开始编码之前,您必须首先考虑这一点。
  • 没错,但我可以使用节点让它以后有更弯曲的路径,但我仍然必须知道如何将敌人移动到一个位置,不是吗?
  • 最基本的形式,position += speed * Vector2(cos(angle), sin(angle))
  • @remyabel 谢谢你,我想我开始明白了,但是你如何将一个向量乘以一个常数,比如 2?你的意思是 2 * Vector2.x 和 2 * vector2.y?
  • 速度可以是 Vector2(如果 x 和 y 不同),也可以是标量(在这种情况下,它与您所说的相同。)

标签: c++ move sfml


【解决方案1】:

移动敌人的方向只是玩家位置和敌人位置之间的差异。但是,您希望敌人以恒定速度移动,因此您需要对结果进行归一化。这将为您提供长度为 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);

顺便说一句,在游戏开发中经常需要线性代数的基本知识,因此您可能会花钱参加在线课程。

【讨论】:

    【解决方案2】:

    您应该在计算中考虑经过的时间(从上一帧开始) - dt。

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

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

    你要计算敌人的新位置:

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

    并用 SetPosition() 影响它。

    【讨论】:

    • 他需要这个角度做什么?如果我理解正确,他只是想将 A 点移向 B,从而移动 speed * normalize(B - A)
    • 是的,你是对的,丹尼哈尔。我刚刚看到他正在使用角度并且也使用它们,但是您的解决方案更好!
    • @danijar 谢谢!这不仅修复了运动,而且使运动更加顺畅,谢谢!
    • @user3927922 很高兴能帮上忙。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-28
    • 2012-02-20
    • 2013-06-29
    • 2017-07-11
    • 2018-09-13
    • 1970-01-01
    相关资源
    最近更新 更多