所以对于我的游戏来说,有一个快速移动的Bullet对象,其精灵为5x5(大致)。以大约30的速度移动,它需要撞击相对较薄的敌人物体,其厚度仅为约5个像素。在某些规则的距离间隔内,子弹在没有碰撞的情况下穿过敌人。
我认为它是因为子弹移动得如此之快,以至于它“跳”过敌人,因此定期间隔。除了增加子弹或敌人的宽度,有没有办法保证正确检测到碰撞?
答案 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)
我使用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)
您可以更改碰撞框,但最终您会想要使用碰撞线,因为方向可能不同。 (如果没有,那么你可以使用碰撞盒)
始终将碰撞线指向子弹的前方,以避免它在被摧毁之前看起来像是通过了物体。使用距离为速度的方向来做到这一点。
您将需要取消任何碰撞检测方法,并且只使用适用于您的情况的方法来保持效率......无论如何。