1

我希望这个论坛可以接受这个问题,因为它更像是一个数学问题而不是编程问题。

我正在使用 cocos2d 框架开发一个基本的太空射击游戏,其中用户控制宇宙飞船并射击小行星/敌人,而敌人也向宇宙飞船射击(原来的嗯?)。

敌人发射的“激光”是管状的,通常只能在 x 轴上从右到左移动。这很容易实现,运动是用这行代码创建的:

currentEnemyProjectile.position = ccp(currentEnemyProjectile.position.x - ((screenSize.width/kLaserSpeed)* dtSixty), currentEnemyProjectile.position.y);

我还有一个特定的敌人,它位于屏幕中间并旋转以向宇宙飞船发射它的弹丸,所以如果宇宙飞船与敌人处于不同的 y 位置,那么弹丸精灵将旋转然后移动到飞船的位置,所以它也需要通过 y 轴。

我目前正在使用代码来实现这一点:

float xDiff = ((screenSize.width/kLaserSpeed)* dtSixty);
float yDiff = (xDiff / 57) * currentEnemyProjectile.rotation;

currentEnemyProjectile.position = ccp(currentEnemyProjectile.position.x - xDiff, currentEnemyProjectile.position.y + yDiff);

我只是将其作为临时解决方案解决,我知道这不是最佳的做事方式。它有点工作,但是当我计算出沿 x 轴运动的 y 偏移量时,如果射弹沿 y 轴移动得更远,它们将移动得更快。理想情况下,如果它们进一步向上或向下移动,它们应该沿着 x 轴移动得更慢,这样任何轨迹的移动速率都是恒定的。(我希望我已经解释得足够好)

我上次上数学课已经大约 10 年了,所以我的几何/三角函数相当模糊/不存在,任何人都可以阐明如何做到这一点吗?

另外,值得注意的是,我想在不使用 cocos2d 操作的情况下执行此操作。我宁愿每帧都移动我的精灵,因为我在作为游戏的一部分操纵时间流时一直在做,所以我需要比 cocos2d 动作所能提供的更多的控制。

提前感谢您的帮助。

4

2 回答 2

0

试试这个。我意识到既然你知道玩家的向量,你就不需要三角了。您只需要计算 v 和 h 一次,因此您可能希望保存这些值而不是在每一帧上计算它们。

// Vector from enemy to player
CGPoint v = enemy.position - player.position;

// distance from enemy to player (sqrt of the dot product of v with v)
float h = sqrt(v.x*v.x+v.y*v.y);

// Desired distance to move along v
delta = ((screenSize.width/kLaserSpeed)* dtSixty);

// delta/h is the % moved along v, find the % moved in the x and y direction 
xDiff = v.x * delta/h;
yDiff = v.y * delta/h;
于 2013-02-19T10:51:44.813 回答
0

使用起始位置、角度和距离来查找位置,公式如下:

ccp( x + ( distance * sin( angle ) ), y + ( distance * cos( angle) ) )

请记住,此公式的角度必须以弧度为单位,而不是度数。您可以像这样将度数转换为弧度:

radians = degrees * PI / 180
于 2013-02-19T16:48:26.023 回答