所以对于我的游戏,有一个快速移动的 Bullet 对象,其精灵大小为 5x5(大约)。以大约 30 的速度移动,它需要撞击一个相对较薄的 Enemy 物体,厚度只有大约 5 个像素。子弹以一定的固定距离穿过敌人而不会发生碰撞。
我认为这是因为子弹移动得如此之快,以至于它恰好“跳过”了敌人,因此有规律的间隔。除了增加子弹或敌人的宽度外,有没有办法保证正确检测到碰撞?
所以对于我的游戏,有一个快速移动的 Bullet 对象,其精灵大小为 5x5(大约)。以大约 30 的速度移动,它需要撞击一个相对较薄的 Enemy 物体,厚度只有大约 5 个像素。子弹以一定的固定距离穿过敌人而不会发生碰撞。
我认为这是因为子弹移动得如此之快,以至于它恰好“跳过”了敌人,因此有规律的间隔。除了增加子弹或敌人的宽度外,有没有办法保证正确检测到碰撞?
测试精灵跳跃的区域。
因此,对于碰撞盒,从子弹之前的最前位置一直测试到新的最前位置。所以如果子弹向右移动:
bullet.collisionbox.x = bullet.x
bullet.colisionbox.y = bullet.y
bullet.collisionbox.width = bullet.x + bullet.width + newpos.x
bullet.collisionbox.height = bullet.height
以图形方式:
>[____________>]
所以你没有增加子弹或敌人的宽度,只是子弹与敌人的碰撞检测。
在 Flash 中,我使用 HitTest 方法来测试一个对象是否与另一个对象发生碰撞,我认为您只需要添加一些代码来更改子弹的方向、速度或外观,当 Hit 变为真时,它就会通过如果在发生命中事件时没有更改其属性的代码,即使它命中/与它接触,该对象也是如此
或者
您可以测试子弹和移动对象的区域
IF (AreaofBullet=AreaofMovingobject)
Change The Appearance, properties of the bullets and the object
else
Do nothing
希望这可以帮助
谢谢 :)
您可以更改碰撞框,但最终您会想要使用碰撞线,因为方向可能不同。(如果没有,那么无论如何你都可以使用碰撞盒)
始终将碰撞线指向子弹所在的位置,以免它看起来像是在被摧毁之前穿过了物体。使用具有速度距离的方向度数来执行此操作。
您将希望取消任何碰撞检测方法,并仅使用适合您情况的方法来保持高效......无论如何。
你的问题是你的子弹移动得太快了。子弹实际上并没有在太空中移动。因此,如果您在游戏循环中每次将子弹的 x 速度设置为 5,则子弹将重绘 5 个像素。如果子弹的速度是 30,那么它会重新绘制 30 个像素,而实际上并没有穿过这些像素。如果敌人在两个位置之间,子弹将被抽出,子弹永远不会碰撞。
考虑一下。你的敌人在位置 (5, 5) 并且是一个 5x5 的正方形。您的子弹来自 (0, 7) 的位置。并且是 1 像素大。如果您的子弹以 20 像素的速度沿 x 方向行进,则子弹将在 (0, 7) 处绘制,然后在 (20, 7) 处绘制。这些位置都不会与你的敌人相交。
我的建议是减慢你的子弹或调整子弹精灵的大小。子弹精灵仍然可以是一个小颗粒,你可以让精灵的其余部分保持透明。有点像让你的子弹更大的碰撞箱。
希望这可以帮助 :)
这个问题有很多解决方案,比如:
a) 使用move_contact_...
移动子弹的函数
lengthdir_
b)使用功能和手动碰撞检查在循环中移动子弹,例如:
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 { ... }
和许多其他...
您可以将子弹的速度降低到 4 或更低,以确保检测到碰撞。此外,您可以在末端后面增加子弹的碰撞遮罩,而不会使精灵变大。将子弹的遮罩宽度加倍可以使子弹的最大速度为 9。