2011-06-09 61 views
0

我想制作一个游戏,但我坚持的东西,应该是一个简单的计算。根据玩家与敌人的相对位置,我应该如何让敌人以恒定速度射击子弹,而不管玩家的方向和距离如何?一个对象的方向基于两个其他对象的位置,同时保持恒定速度,Java

我可以让敌人直接射向玩家,但玩家距离敌人越近,他的子弹就越慢。因此,玩家离敌人越远,敌人子弹的行进速度就越快。

我也尝试将玩家和敌人之间的直线斜率转换为弧度,并使用正弦和余弦作为X和Y中子弹更新时的变化,但Y值变得很小,因此子弹只会在X轴上向右移动,而在Y轴上会稍微向上移动。

帮助?

+0

你用什么样的坐标系的 斯特凡?我认为在建模每个人的位置时可能存在问题。 – Darien 2011-06-09 04:17:38

+0

向我们展示您当前实施的重要部分。看起来你在计算中使用距离 - 不要。子弹是速度恒定的东西(用于游戏目的),但方向可变。你只需要计算方向。 – Bohemian 2011-06-09 04:17:54

回答

1

假设你有这样的(X,Y)的相对位置 你的错误可能会计算这样的:

r = sqrt(x^2 + y^2); 
angle = arctan(y/x); 
speedx = r*cos(angle); 
speedy = r*sin(angle); 

您应该计算的话是这样的:

r = constantSpeed; 
angle = arctan(y/x); 
speedx = r*cos(angle); 
speedy = r*sin(angle); 

在首先,计算半径并使用它来缩放速度。当敌人离得更远时,这会加快速度。第二个乘以一个常数,所以无论距离如何,速度都是一样的。

+0

我假设y/x实际上意味着deltaY/deltaX是否正确?如两个坐标的Y的差值除以两个坐标的X的差值? – Kevin 2011-06-09 04:30:31

+0

是的,这是正确的。这是差异,还是相对的位置。 – scientiaesthete 2011-06-09 04:31:27

+0

嗯,当我尝试使用这种类型的计算时,我遇到了同样的问题。 – Kevin 2011-06-09 04:34:05

0

这是一个猜测,因为你不使用的代码是很难评价自己在做什么,但我抓住机会:

你不正常化,当你确定“,你得到的速度矢量玩家与敌人的相对位置“。

如果你有(有XP作为球员X坐标,氙为ennemy,依此类推):

double speedX = (Xp-Xe); 
double speedY = (Yp-Ye); 

那你还是要正常化是矢量得到一个“速度矢量独立的距离这两点”

double distance = Math.sqrt(speedx*speedx + speedy*speedy); 
speedX /= distance; 
speedY /= distance; 

。然后speedX和迅速,你可以在每个转弯处子弹(开始于氙,叶),再乘以一些实际速度的因素增加的数量,你会打你的播放器。

问候,

相关问题