• FLASH ActionScript 3.0 sns cocial game 开发中的定时器



     、、
    //

    package com.joyairport.model 
    {
        import flash.utils.Timer;
        import flash.events.TimerEvent;
        import flash.utils.getTimer;
        
        
    /**
         * ...
         * @author guolichun
         * JATimer  是JoyAirport 这个项目简称JA 的定时器,全局的唯一的定时器
         * 负责游戏中的所有定时器的维护
         
    */
        public class JATimer 
        {
            private static 
    var _instance:JATimer;
            private 
    var _timer:Timer;
            private 
    var _timerList:Array;
            
            
    /*
             * 获取 单例类 JATimer的实例
             * 
    */
            public static 
    function getInstance():JATimer 
            {
                
    if (_instance == null)
                    _instance 
    = new JATimer();
                
                
    return _instance;            
            }
            
            
    /**
             * 构造函数 用于防止单例类生成多个实例
             
    */
            public 
    function JATimer() 
            {
                
    if (_instance != null)
                    trace(
    "单例类,请不要实例化");
                
    return;
            }
            
            
    /*
             * 注册计时器,首先检查id是否存在,如果不存在,就将定时器插入数组_timerList中;否则啥都不做
             * 参数:
             *         id - 唯一标识一个定时器
             *         interval - 刷新间隔,单位为秒(s)
             *         repeatCount - 重复次数
             *         callback - 回调函数,每隔interval就执行一次
             *         ...args - 回调函数参数 ///注意,参数实际并没有用到,有待改进
             * 返回值:空
             
    */
            public 
    function registerTimer(id:String, interval:int, repeatCount:int, callback:Function, args:Array):void 
            {
                
    if (_timerList == null
                    _timerList 
    = new Array();
                    
                
    if (check(id) == -1) {
                    _timerList.push( { id:id, interval:interval, repeatCount:repeatCount, callback:callback, args:args, tempInterval:
    0 } );
                    startTimer();
                }
    else {
                    trace(id 
    + "已经存在!!!");
                }
            }
            
            
    /*
             * 注销计时器,首先检查id是否存在,如果存在,从数组_timerList中删除定时器
             * 参数:
             *         id - 唯一标识一个定时器
             * 返回值:空
             
    */
            public 
    function removeTimer(id:String):void
            {
                
    var index:int = check(id);
                
    if (index != -1)
                {
                    _timerList.splice(index, 
    1);    
                }
            }
            
             
    /*
             * 检查指定id的Object是否在_timerList数组中,
             * 如果存在返回在_timerList数组中的索引;否则返回-1
             * 参数:
             *         id - String,唯一标识一个定时器 
             * 返回值:
             *         -1 or 指定Object的索引
             
    */
            private 
    function check(id:String):int
            {
                
    var len:int = _timerList.length;            
                
                
    for (var index:int = 0; index < len; index++)
                {
                    
    if (_timerList[index]["id"== id)
                    {
                        
    return index;
                    }
                }            
                
                
    return -1;
            }
            
            
    /*
             * 启动计时器
             * 如果_timer为空,生成一个定时器Timer,事件发生间隔1000ms(1s);
             * 监听TimerEvent.TIMER,处理函数为timerHandler
             
    */        
            private 
    function startTimer():void
            {
                
    if (_timer == null)
                    _timer 
    = new Timer(1000);
                
    if (!_timer.running)
                {
                    _timer.addEventListener(TimerEvent.TIMER, timerHandler);
                    _timer.start();
                }
            }
            
            
    /*
             * 停止计时器
             * 当_timerList数组为空时,即没有用户注册定时器,停止_timer
             
    */
            private 
    function stopTimer():void 
            {
                _timer.stop();
                _timer.removeEventListener(TimerEvent.TIMER, timerHandler);
            }
     
            
    /*
             * 运行计时器
             * 如果_timerList数组为空,调用stopTimer()停止计时器;
             * 否则判断_timerList数组中的定时器间隔是否达到,
             *         如果达到,就调用回调函数;
             *         否则啥都不做
             
    */        
            public 
    function runTimer():void
            {
                
    var timerComplete:Array = new Array();
                
    var len:int = _timerList.length;            
                
    if (len == 0)
                {
                    stopTimer();
                    
    return;
                }
                
                
    for (var i:int = 0; i < len; i++)
                {
                    
    //运行JATimer管理的所有计时器
                    
                    _timerList[i][
    "tempInterval"+= 1;
                    
    //判断是否已经经过interval间隔
                    if (_timerList[i]["tempInterval"== _timerList[i]["interval"])
                    {
                        
    //如果callback不空,执行callback函数
                        if (_timerList[i]["callback"!= null)
                        {
                            _timerList[i][
    "callback"](_timerList[i]["args"]);
                        }
                        
                        _timerList[i][
    "tempInterval"= 0;
                        
                        
    //判断初始repeatCount是否=0,如果注册时为0,即无限次数
                        //否则每执行一次,就-1;然后判断repeatCount是否=0,如果=0就注销计时器
                        if (_timerList[i]["repeatCount"!= 0)
                        {
                            _timerList[i][
    "repeatCount"-= 1;
                            
    if (_timerList[i]["repeatCount"== 0)
                            {
                                trace(
    "执行完成......");
                                timerComplete.push(_timerList[i][
    "id"]);
                            }
                        }
                    }
                }
                
                
    //注销所有已完成的计时器
                len = timerComplete.length;
                
    if (len != 0)
                {
                    trace(
    "注销所有已经完成的计时器...");
                    
    for ( i = 0; i < len; i++)
                    {
                        removeTimer(timerComplete.pop());
                    }
                }
            }
                
            
    /*
             * timerHandler是_timer的TimerEvent.TIMER事件处理函数
             * 其中调用runTimer(),管理所有注册的计时器
             
    */
            private 
    function timerHandler(evt:TimerEvent):void
            {
                runTimer();
            }
            
        }

    }

  • 相关阅读:
    《Effective Java》 读书笔记(三) 使用私有构造方法或枚举实现单例类
    《Effective Java》 读书笔记(二) 在构造参数过多的时候优先考虑使用构造器
    读书笔记-《Maven实战》-2018/5/3
    读书笔记-《Maven实战》-关于Maven依赖传递的思考 2018/4/26
    MySQL基础篇(07):用户和权限管理,日志体系简介
    SpringCloud微服务:Sentinel哨兵组件,管理服务限流和降级
    MySQL基础篇(06):事务管理,锁机制案例详解
    Java并发编程(02):线程核心机制,基础概念扩展
    SpringBoot2 整合ElasticJob框架,定制化管理流程
    Java基础篇(02):特殊的String类,和相关扩展API
  • 原文地址:https://www.cnblogs.com/didi/p/2115589.html
Copyright © 2020-2023  润新知