iloveas 发表于 2018-12-14 10:59:21

【9RIA—iloveas】— AS3游戏实用技巧(10):一行代码让MC播放完成事件更加优雅

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

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


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


今天4月30号,提前祝9ria的兄弟姐妹们五一快乐!

虽然现在越来越多的朋友使用Starling或者BitmapData来实现游戏里的动画播放,但既然昨天有版主问到了原生MovieClip的东东,那我还是来给大家分享一下。

在回合制战斗游戏中,一般都有多个动作连播的过程,为了实现各动画之间的无缝连接,我们希望一个动画播放结束后就开始播放下一个动画的第一帧。那么,如何判断MovieClip播放完成,也就是跑到最后一帧呢?大家很自然地会想到在MC的最后一帧发送一个自定义事件,然后在外面监听它。

没错,这办法确实很好,但如果动画数量很多(好像大部分页游都这样),那逐个添加就显得相当麻烦了,而且项目一旦重构,这些散布于不同MC上的帧代码估计就要“呵呵”了。

对于这样的体力活,用JSFL也不失为一个好方法。不过这在实际开发中也比较蛋疼。毕竟美术和程序同时操作一个文件,出问题的几率比较大。

为了避免维护问题以及各种冲突,程序员们都希望找到一个方法让代码和界面分离的更彻底。但很不幸,原生的MovieClip并未提供播放完成事件。如果不想在帧上写代码,那大家可能会倾向于用enterFrame进行判断:

    mc.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
    function enterFrameHandler(event:Event){
      if(mc.currentFrame == mc.totalFrames){
      //播放完毕
      }
    }

此法每帧都要监听,导致我们都对其运行效率非常担忧。而事实上,我们有更简单的方法:
**** Hidden Message *****
虽然我看很多人都知道这一用法,但我还是偷偷地把这部分代码给隐藏起来。

那么新的问题来了,受传参等因素的影响,此法有一定的局限性,无法得知到底是哪个MC播放完成,所以无法通过循环批量添加,这显然限制了该方法的应用。

所以iloveas在此基础上封装了一个类,大致思路如下:
**** Hidden Message *****
思路给了,具体的可以根据实际情况作进一步的完善。

补充一下题外话:MovieClip之所以效率不如bitmap,其实都是swf文件格式惹的祸。相信大神们都已经发表过相关的帖子,我就不在这儿班门弄斧了。

明天五一了,iloveas打算休息一下,也希望大家明天先别上来支持iloveas了。正事要紧啊兄弟们,你懂的。



早起的虫儿 发表于 2018-12-14 12:58:52

什么方法

早起的虫儿 发表于 2018-12-14 13:00:08

什么方法

SUPERSEIYA 发表于 2018-12-14 14:33:58

什么方法?

wgq341 发表于 2019-1-10 12:07:45

收藏学习#:)

Jason桃 发表于 2019-1-10 13:46:48

学习学习

zouyibin 发表于 2019-1-24 19:56:54

提示信息关闭
抱歉,您目前处于见习期间,需要等待 3 分钟后才能进行本操作

ysygm 发表于 2020-4-16 09:21:53

来和大佬们学习学习了

ysygm 发表于 2020-4-16 09:22:56

学习学习

xchx123 发表于 2020-4-21 20:09:27

我不知道
页: [1] 2
查看完整版本: 【9RIA—iloveas】— AS3游戏实用技巧(10):一行代码让MC播放完成事件更加优雅

感谢所有支持论坛的朋友:下面展示最新的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)