制作一款打飞机游戏19:碰撞检测
在这一章中,我们致力于办理碰撞检测问题,但它并不如我们所愿工作。碰撞检测问题
本日我想办理的是碰撞检测问题,这个令人畏惧的碰撞检测。我明白,这里有很多复杂的if语句,但我们可以做到。
不过,在此之前,我想尝试一种方法来办理我们总是必要做X轴滚动的问题。我想利用相机功能来办理这个问题。我们之前已经用相机功能来实现过震动效果,我想如今可以再次利用它来实现X轴滚动。
利用相机功能
根据PICO 8的wiki,相机功能可以设置绘制状态的相机偏移量。设置相机偏移量会导致全部后续的绘制操作在它们的x和y坐标上减去这个偏移量。相机指定了绘制函数的原点,默认环境下是0,0。这实际上在某种水平上就是我们X轴滚动所做的变乱,由于我们不必要为每个绘制操作添加一个变量,只必要在相机函数中设置一次,然后全部的后续绘制操作都会相应地移动。
让我们试试看这是否有效。看起来这行得通!如今,看看敌人的平行滚动,这看起来不错,我有点喜好这个效果。但是,如今全部东西都在移动,包括我们的飞船,这在某些环境下并不是我们想要的。比方,我们的飞船不应该受到X轴滚动的影响。以是,在绘制炮口闪光时,我们必要重置相机,然后在绘制敌人子弹时再恢复它。
碰撞检测的实现
如今,让我们继续处理碰撞检测。这是一个复杂的话题,但我们已经做过类似的变乱了。
碰撞检测有两个难点:一是数学盘算,我们必要盘算边缘的碰撞;二是数据存储和管理,每个碰撞盒都有四个值(x位置、y位置、宽度和高度),这些值必要被存储和管理。我们必要确保这些值被正确地通报到碰撞检测函数中,并且碰撞效果被正确地处理。
首先,我想创建一个简单的系统来测试底层的数学盘算。假如数学盘算没有问题,我们再考虑怎样实现数据的存储和管理。
https://i-blog.csdnimg.cn/direct/895fbb0a1b5a42f2be4393537ede36d6.png
示例碰撞
让我们在飞船四周绘制一个矩形作为碰撞盒,并定义一个会在屏幕上某处碰撞的矩形。当这两个矩形碰撞时,它们将改变颜色。
但是,我们碰到了一个问题:我们的飞船实际上并不是一个对象。将飞船定义为一个对象大概会使碰撞检测更容易,由于你可以直接将飞船作为对象通报给碰撞检测函数。不过,如今我们先将飞船的碰撞盒参数(x1, y1, width1, height1)和另一个矩形的参数(x2, y2, width2, height2)分开处理。
调试与修正
在调试过程中,我们发现了一些问题,好比飞船的位置是在精灵的中心而不是左上角,这导致了碰撞检测的不准确。我们通过调整位置参数办理了这个问题。
此外,我们还发现了子像素问题,纵然两个矩形在视觉上已经碰撞,但由于位置不是整数像素,碰撞检测函数大概没有正确地识别出碰撞。我们通过利用floor函数来确保位置是整数像素,从而办理了这个问题。
多种碰撞类型
我们必要处理三种碰撞类型:飞船与敌人、子弹与飞船、玩家射击与敌人。我们为每种碰撞类型创建了全局变量来跟踪是否发生了碰撞,并在更新函数中举行了相应的处理。
pcol=false
-- shots vs enemies
for e in all(enemies) do
e.iscol=false
end
for e in all(enemies) do
for s in all(shots) do
if col(flr(xscroll+s.x-3),flr(s.y),8,16,
flr(xscroll+e.x-6),flr(e.y-6),16,16) then
e.iscol=true
end
end
end
-- ship vs enemies
for e in all(enemies) do
if col(flr(px-7),flr(py-7),16,16,
flr(xscroll+e.x-6),flr(e.y-6),16,16) then
pcol=true
end
end
-- ship vs bullets
for b in all(buls) do
if col(flr(px-7),flr(py-7),16,16,
flr(xscroll+b.x-2),flr(b.y-3),7,7) then
pcol=true
end
end
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]