gpt4 book ai didi

vector - 游戏敌人向玩家移动

转载 作者:行者123 更新时间:2023-12-03 19:08:46 25 4
gpt4 key购买 nike

很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visit the help center .




11 年前关闭。




我正在用 C++ 和 OpenGL 创建一个游戏,并希望敌人向玩家移动。

使游戏对象向其他游戏对象移动的最佳方法是什么,既适用于 2D 又适用于 3D 游戏环境?

更新:

哇感谢大家的快速回复!

奇怪的是,我设法让它在我发布时起作用

尽管出于某种原因,我必须将 x 值乘以更多,以使它们与 y 方向的移动速度一样快。

任何人有任何想法为什么?或者如果我做的是错误的/不好的

float playerX = player.getXPos();
float playerY = player.getYPos();
float enemyX = XPos-*xscroll;
float enemyY = YPos-*yscroll;

glPushMatrix();

glTranslatef(enemyX, enemyY, 0.0);
glColor3f(1.0,0.0,0.0);
glBegin(GL_POLYGON);
glVertex2f(-40,40);
glVertex2f(-40,-40);
glVertex2f(40,-40);
glVertex2f(40,40);
glEnd();

glPopMatrix();


float xDistance = abs(playerX-enemyX);
float yDistance = abs(playerY-enemyY);

if((playerX - enemyX)*(playerX - enemyX)+(playerY - enemyY)*(playerY - enemyY) < 400*400){
float heading = asin(xDistance/yDistance);

if(playerY > enemyY){
YPos += timeFactor*(200*(sin((90+heading)*(PI/180.0f))));
}else{
YPos += -(timeFactor*(200*(sin((90+heading)*(PI/180.0f)))));
}

if(playerX > enemyX){
XPos += -(timeFactor*(10000*(cos((90+heading)*(PI/180.0f)))));
}else{
XPos += timeFactor*(10000*(cos((90+heading)*(PI/180.0f))));
}
}

最佳答案

在您希望敌人移动的方向上创建一个向量。这很容易:

dir.x = player.x - enemy.x;
dir.y = player.y - enemy.y;

现在标准化这个向量。这意味着将项除以向量的幅度(斜边)。
hyp = sqrt(dir.x*dir.x + dir.y*dir.y);
dir.x /= hyp;
dir.y /= hyp;

现在您只需将该向量添加到敌人的位置,乘以您希望敌人移动的速度:
enemy.x += dir.x*speed;
enemy.y += dir.y*speed;

这是它的工作原理 - 如果您将初始向量添加到敌人的位置,它将立即传输到玩家。你显然想让敌人以较慢的速度移动。当你对向量进行归一化时,你使它的大小(本质上是它形成的三角形的斜边)等于 1。所以现在,添加方向向量会使敌人移动一个单位。将 1 个单位乘以敌人的速度,现在它以正确的速度移动。

编辑:所有这些也扩展到 3D。您只需要一个 z 分量。

进一步编辑以评论您的代码:

你正在做很多额外的工作。一旦您计算出将敌人移向玩家的斜边,您就有足够的信息。您根本不需要使用任何触发器 - 请参阅我上面的代码。您还计算(某种程度)幅度两次:
float hypotenuse = sqrt((xDistance * xDistance) + (yDistance * yDistance));
...
(playerX - enemyX)*(playerX - enemyX)+(playerY - enemyY)*(playerY - enemyY)

第二次是距离平方,这是一个很好的优化,但在这里没有必要,因为您已经计算了距离和距离平方。

这是我会做的:
float xDistance = playerX-enemyX;
float yDistance = playerY-enemyY;
float hypotenuse = sqrt((xDistance * xDistance) + (yDistance * yDistance));

if(hypotenuse < 400){

YPos += timeFactor*200*(yDistance/hypotenuse);
XPos += timeFactor*200*(xDistance/hypotenuse);
}

您会注意到,通过删除 abs() 我还设法删除了 if(playerY >enemyY) 等部分。

关于vector - 游戏敌人向玩家移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2625021/

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