簡體   English   中英

SFML - 將對象移向coord

[英]SFML - Move object towards coord

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

移動敵人的方向只是玩家位置和敵人位置之間的差異。 但是,您希望敵人以恆定速度移動,因此您需要將結果標准化。 這將為您提供長度為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);

順便說一下,在游戲開發中經常需要線性代數的基本知識,因此您可能需要付費才能參加在線課程。

您應該在計算中考慮經過的時間(自上一幀起) - dt。

敵人有一個給定的速度:enemy_velocity。

我不會使用move()函數,而是使用SetPosition()。

你必須計算敵人的新位置:

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

並使用SetPosition()影響它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM