Discuss Scratch

Nolan_Dong
New to Scratch
4 posts

是否有更好的办法处理两个克隆体的相撞事件?

如果是两个对象相撞很简单就不提了。
如果是一个对象撞另一个克隆体,可以在克隆体里写检测代码,再发广播通知对象。
但如果是两个克隆体相撞好像就很难处理了,比如飞行游戏里不限量的子弹与不限量的敌对飞机,如何处理?

我现在想到的是在双方克隆体内都写检测代码,然后各自处理事件,但我担心二者的并发机制并不保障都有相同的机会能够正确地检测到碰撞。
举例来说,敌方飞机即将碰到我的飞机,这时我打出一发子弹命中敌方飞机。敌方飞机检测到子弹相撞后是否应当立即销毁自己?
如果立即销毁,那么我的子弹有可能此时还没有检测到碰撞事件,这就变成了我的子弹打死了一架敌方飞机,但并没有按原计划那样的与敌同归于尽。
如果延时销毁,保留一点时间确保我的子弹有机会识别到碰撞事件,这又可能让我的飞机先检测到了碰撞事件,这样的后果就是我本来有机会先打爆敌机的,结果由于延时算法,我的飞机被撞了。

大家有什么好的解决思路可以提示我吗?
gejiarui
Scratcher
3 posts

是否有更好的办法处理两个克隆体的相撞事件?

可以让敌方飞机碰到我方子弹后先不立即销毁,但是取消碰到我方飞机的判定,延时一会再销毁。
Nolan_Dong
New to Scratch
4 posts

是否有更好的办法处理两个克隆体的相撞事件?

主要还是计算精度问题,延时销毁就会造成更多的误判,比如一架飞机吸收了我方多枚子弹,在飞机有一定血量的时候还有可能一次碰撞被重复计算了多次,本来二血的飞机被一颗子弹打没了。

当然,精度好像本身是个无解的问题,就算是实体撞击实体,由于代码不能跨对象操作,只能通过广播,除了代码形式上好看,并不能保证运行上一定被及时地优先处理。scratch本身还是不太适合做这些复杂的计算。
scientificscratch
Scratcher
65 posts

是否有更好的办法处理两个克隆体的相撞事件?

让我想想……
InCryst
Scratcher
1 post

是否有更好的办法处理两个克隆体的相撞事件?

我的操作方法是在销毁之前加一句“等待0秒”,这样销毁之前的时间会正好使碰撞判断1次(前提是你没有使用运行时不刷新屏幕)。
TwilightSparkleLover
Scratcher
58 posts

是否有更好的办法处理两个克隆体的相撞事件?

这是我方子弹的脚本
当作为克隆体启动时
重复执行
如果 <碰到 [敌方灰机 v] ?> 那么
等待 (0.000000000000000000000000000000000000000000000000000001) 秒
如果 <碰到 [敌方灰机 v] ?> 那么
删除本克隆体
end
end
end
这是我方灰机的脚本
当作为克隆体启动时
重复执行
如果 <碰到 [敌方灰机 v] ?> 那么
等待 (0.000000000000000000000000000000000000000000000000000001) 秒
如果 <碰到 [敌方灰机 v] ?> 那么
game over
end
end
end
这是敌方灰机的脚本
当作为克隆体启动时
重复执行
如果 <碰到 [我方子弹 v] ?> 那么
等待 (0.000000000000000000000000000000000000000000000000000001) 秒
如果 <碰到 [我方子弹 v] ?> 那么
删除本克隆体
end
end
end

Last edited by TwilightSparkleLover (Jan. 15, 2018 12:32:51)


当你想玩鳄鱼君大战贴吧Madam时 ::hat events
打开[电脑 ∨] ::motion
打开[Google Chrome ∨] ::motion
复制[https://scratch.mit.edu/projects/195683657/] ::motion
粘贴至[地址栏 ∨] ::motion
按下[Enter ∨] ::motion
在 <作品加载成功 ::boolean sensing>前一直等待 ::control
Nolan_Dong
New to Scratch
4 posts

是否有更好的办法处理两个克隆体的相撞事件?

等待0秒的思路有可能是可行的,我在处理多次广播消息的时候感觉scratch的表现和一些线程问题相关。
等待0秒还是0.000001秒应当都可以,重要的就是给了其他循环线程有机会处理自己的检测逻辑。
不过还没去试,先谢过楼上几位。

Powered by DjangoBB

Standard | Mobile