快速射弹并不总能击中

时间:2013-08-28 02:13:55

标签: collision-detection collision game-maker

所以对于我的游戏来说,有一个快速移动的Bullet对象,其精灵为5x5(大致)。以大约30的速度移动,它需要撞击相对较薄的敌人物体,其厚度仅为约5个像素。在某些规则的距离间隔内,子弹在没有碰撞的情况下穿过敌人。

认为它是因为子弹移动得如此之快,以至于它“跳”过敌人,因此定期间隔。除了增加子弹或敌人的宽度,有没有办法保证正确检测到碰撞?

6 个答案:

答案 0 :(得分:2)

测试精灵跳跃的区域。

因此,对于碰撞盒,从子弹的前一个最前面的位置一直测试,直到它是新的最前方位置。因为如果子弹向右移动:

bullet.collisionbox.x = bullet.x
bullet.colisionbox.y = bullet.y
bullet.collisionbox.width = bullet.x + bullet.width + newpos.x
bullet.collisionbox.height = bullet.height

图形:

>[____________>]

因此你不会增加子弹或敌人的宽度,只需要检测子弹对敌人的碰撞。

答案 1 :(得分:0)

在Flash中

我使用HitTest方法来测试一个对象是否与另一个对象发生碰撞,我认为存在碰撞 你只需要添加一些代码来改变子弹的方向,速度或外观,当命中变为真时,它将通过对象,即使它遇到/接触它,如果你没有代码来改变其属性时命中事件发生

您可以测试子弹和移动物体的区域

IF (AreaofBullet=AreaofMovingobject)
Change The Appearance, properties of the bullets and the object
else
Do nothing

希望这有帮助

谢谢:)

答案 2 :(得分:0)

这个问题有很多解决方案,例如:

a)使用move_contact_...函数移动子弹

b)使用lengthdir_函数和手动碰撞检查循环移动子弹,如:

var i;
for (i = sprite_width; i <= speed; i += sprite_width)
{
   if place_meeting(x + lengthdir_x(i,direction), y + lengthdir_y(i,direction), o_wall) // is a wall in this position?
   {
       x += lengthdir_x(i, direction); // moving to position of the collision
       y += lengthdir_y(i, direction);
       event_perform(ev_collision, o_wall); // call collision event 
   }
}

c)更改位置后使用collision_line,例如if collision_line(x, y, xprevious, yprevious, obj, false, true)!=noone { ... }

以及其他许多......

答案 3 :(得分:0)

您可以将子弹的速度降低到4或更低,以确保检测到碰撞。此外,您可以增加末端后面的子弹的碰撞掩模,而不会使精灵更大。加倍子弹的面罩宽度可以使子弹的最大速度达到9。

答案 4 :(得分:0)

你的问题是你的子弹移动得太快了。子弹实际上并没有穿过太空。因此,如果你通过游戏循环每次将子弹的x速度设置为5,则子弹重绘5个像素。如果子弹的速度是30,则重新绘制30像素,而不实际经过这些像素。如果敌人在这两个位置之间,子弹将会被拔出,子弹将永远不会发生碰撞。

考虑一下。你的敌人位于(5,5)并且是5x5平方。你的子弹来自(0,7)的位置。并且是1像素大。如果您的子弹以20像素的速度沿x方向行进,则子弹将在(0,7)然后在(20,7)处绘制。这些位置都不会与你的敌人相交。

我的建议是放慢你的子弹或调整子弹精灵的大小。子弹精灵可能仍然是一个小颗粒,你可以让精灵的其余部分透明。有点像让你的子弹更大的碰撞盒。

希望这会有所帮助:)

答案 5 :(得分:0)

您可以更改碰撞框,但最终您会想要使用碰撞线,因为方向可能不同。 (如果没有,那么你可以使用碰撞盒)

始终将碰撞线指向子弹的前方,以避免它在被摧毁之前看起来像是通过了物体。使用距离为速度的方向来做到这一点。

您将需要取消任何碰撞检测方法,并且只使用适用于您的情况的方法来保持效率......无论如何。