iloveas 发表于 2018-12-14 10:48:45

【9RIA—iloveas】— AS3游戏实用技巧(8):一行代码瞬间提升鼠标精确碰撞的效率

本帖最后由 TKCB 于 2019-3-19 09:07 编辑

转载:9RIA游戏开发者社区(天地会)
作者:iloveas(大神)


总目录:[原创]AS3游戏开发实用技巧汇总


说白了,这东西可以理解为鼠标穿透,即屏蔽图片透明区域的鼠标响应。相信大家对这样的需求都已经比较熟悉了,毕竟游戏开发里很多场合都会用到。

AS3的BitmapData提供了像素级的hitTest方法,但由于它的应用领域主要是两位图的碰撞检测(事实上还可以用它来检测位图跟点或者矩形的碰撞),所以对于鼠标跟位图的碰撞来说就未免有点大材小用了,而且还会造成不必要的性能损耗。因此大多数情况下,大家都更习惯于用bitmapData.getPixel32来代替以上方法。

殊不知getPixel32的执行效率也是相当的慢,我们可以写个代码来测试一下:

    var bd:BitmapData = new BitmapData(1000, 1000, true, 0x80000000);
    var now:int = getTimer();
    for(var j:int = 0, h:int = bd.height; j < h; j ++){
            for(var i:int = 0, w:int = bd.width; i < w; i ++){
                  var pixel:uint = bd.getPixel32(i, j);
            }
    }
    trace(getTimer() - now);

遍历这1000*1000个像素,在iloveas的机器上花费了51毫秒的时间,如果游戏对性能要求比较高,那这个方法可能就不太合适了。

其实,除了getPixel32以外,我们还可以通过以下方法来实现同样的功能:
**** Hidden Message *****
就这样,仅仅加入了一行代码,执行的时间就瞬间缩短到12毫秒,很厉害了有木有?!
其实吧,此法要以牺牲内存为代价,所以如果内存吃紧的话就还是得慎重考虑了,虽然内存的价钱要比cpu便宜不少。

今天本来有更好的心得分享给大家,无奈有些东西死活折腾不出来,就先来篇这个吧,估计大家还有机会用得上。

经过1周左右的折腾,iloveas已经习惯了回复可见,不然晚上睡不着。所以,为了让大家明天还能继续看到iloveas写的教程,我还是继续隐藏部分代码好了,还望大家多多包涵,谢谢!!



TKCB:
这里是根据格美大神教程做的代码练习:
http://www.11ria.com/forum.php?mod=viewthread&tid=1591

雪原xy 发表于 2019-1-14 22:03:35

看看代码!!!

心羽 发表于 2019-1-15 09:28:26

{:5_177:} 支持一下

1056480737 发表于 2021-12-23 23:49:16

看看代码大佬!!!!!{:5_178:}

Kona 发表于 2022-1-4 17:00:49

看看代码大佬!!!!!

jiqingxing 发表于 2022-3-7 16:11:21

1111111111111111111111111
页: [1]
查看完整版本: 【9RIA—iloveas】— AS3游戏实用技巧(8):一行代码瞬间提升鼠标精确碰撞的效率

感谢所有支持论坛的朋友:下面展示最新的5位赞助和充值的朋友……更多赞助和充值朋友的信息,请查看:永远的感谢名单

SGlW(66139)、 anghuo(841)、 whdsyes(255)、 longxia(60904)、 囫囵吞澡(58054)

下面展示总排行榜的前3名(T1-T3)和今年排行榜的前3名的朋友(C1-C3)……更多信息,请查看:总排行榜今年排行榜

T1. fhqu1462(969)、 T2. lwlpluto(14232)、 T3. 1367926921(962)  |  C1. anghuo(147)、 C2. fdisker(27945)、 C3. 囫囵吞澡(58054)