2013-02-18 107 views
1

我希望这是一个可以接受的问题,因为这是一个数学问题而不是编程问题。根据旋转运动的精灵

我正在开发一个基本的太空射击游戏,使用cocos2d框架,用户控制太空飞船并射击小行星/敌人,敌人也在飞船处射击(原始呃?)。

被敌人击中的'激光'是一个形状似管的管子,通常只在x轴上从右到左移动。这是很容易实现的,移动与这行代码创建:

currentEnemyProjectile.position = ccp(currentEnemyProjectile.position.x - ((screenSize.width/kLaserSpeed)* dtSixty), currentEnemyProjectile.position.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操作可提供的更多控制。

在此先感谢您的帮助。

+0

我对你的变量有点困惑。 kLaserSpeed应该以​​距离/秒为单位。 dtSixty与60Hz时钟频率的增量时间相似吗?为什么xDiff依赖于屏幕宽度?所有你需要做的就是乘以速度* dt来得到移动的距离,称之为“d”,沿着三角形的斜边。因此,dx = d * sin(角度)和dy = d * cos(角度)。确保你检查了合适的标志。 – Pat 2013-02-19 01:37:33

+0

我用kLaserSpeed划分屏幕宽度的原因是,这会让我在不同设备(iPhone 4/iPhone 5/iPad)上获得持续的游戏体验,例如,如果kLaser速度为500,那么对象将行进1/500宽度屏幕的大小与屏幕大小无关。 dtSixty只是最后一帧乘以60后的时间。我原本是在没有调整当前帧速率的情况下启动该项目的,因此当我稍后想要这样做时,由于它运行速度为60 fps,如果我将自上一帧以来的时间乘以60,我可以保留相同的数字速度。 – SteveB 2013-02-19 07:38:53

+0

我会看看你玩我的方程式,看看我能不能把它运用起来,我想我可以做一些我的三角学习。谢谢您的帮助。 – SteveB 2013-02-19 07:39:52

回答

0

要使用起始位置,角度,以及距离找到的位置,该公式如下:

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

请注意,对于此公式的角度将必须在弧度,而不是度数。你可以把度数转换成这样的弧度:

radians = degrees * PI/180 
+0

完美的作品,非常感谢! – SteveB 2013-02-19 22:48:07

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;