`

[转]由Timer事件驱动的Flash游戏或者动画的暂停方法

阅读更多
不久之前,我介绍了通过ACTIVATE和DEACTIVATE事件侦测焦点暂停Flash游戏或动画。
在使用Timer事件来驱动Flash游戏或者动画时,这个方法出现了意料之外的问题。
尽管你会认为,我只想需要停止和重新启动timer计时,然后重置内部计时器就可以了。
假如有一个timer事件每秒钟触发一次,如果暂停游戏,然后在小于1秒的时间内容恢复又暂停游戏,那么这个timer事件将无法再次被触发。
解决方法可以这样做,首先记录timer事件上一次触发到Flash暂停之间的时间差lapTime,用户恢复timer事件时,将timer的delay设置为普通计时器的delay与这个时间差lapTime之间的差值。
下面的代码可以说明“普通计时器”与“精确计时器”的差别:
package {
        import flash.display.Sprite;
        import flash.utils.Timer;
        import flash.utils.getTimer;
        import flash.events.TimerEvent;
        import flash.text.TextField;
        import flash.text.TextFormat;
        import flash.events.Event;
        import flash.text.TextFieldAutoSize;
        public class pauseTimer extends Sprite {
                // the interval between two ticks, in milliseconds
                private var interval:int=1000;
                // the "normal" timer
                private var normalTimer:Timer;
                // the "smart" timer
                private var smartTimer:Timer;
                // just some text field related variables
                private var normalTimerText:TextField = new TextField();
                private var smartTimerText:TextField = new TextField();
                private var normalTextFormat:TextFormat = new TextFormat();
                private var smartTextFormat:TextFormat = new TextFormat();
                // the "movie paused" screen
                private var pausedScreen:pausedMc=new pausedMc();
                // variables used to handle the smart timer
                private var lapTime:Number=0;
                private var currentTimer:Number=0;
                public function pauseTimer() {
                        // nothing interesting, only some layout settings
                        normalTextFormat.size=24;
                        normalTextFormat.color=0xA90000;
                        smartTextFormat.size=24;
                        smartTextFormat.color=0x00A900;
                        addChild(normalTimerText);
                        normalTimerText.autoSize=TextFieldAutoSize.LEFT;
                        addChild(smartTimerText);
                        smartTimerText.autoSize=TextFieldAutoSize.LEFT;
                        addChild(pausedScreen);
                        smartTimerText.y=50;
                        // timer initialization
                        normalTimer=new Timer(interval);
                        smartTimer=new Timer(interval);
                        // timer listeners
                        normalTimer.addEventListener(TimerEvent.TIMER, showNormalTime);
                        smartTimer.addEventListener(TimerEvent.TIMER, showSmartTime);
                        // activate/deactivate listeners
                        addEventListener(Event.ACTIVATE,onActivate);
                        addEventListener(Event.DEACTIVATE,onDeactivate);
                }
                private function showNormalTime(e:TimerEvent):void {
                        // just showing the number of ticks
                        normalTimerText.text="Normal counter: "+normalTimer.currentCount+" ticks counted";
                        normalTimerText.setTextFormat(normalTextFormat);
                }
                private function showSmartTime(e:TimerEvent):void {
                        // set the delay to "interval" value if it has a different value (it will happen)
                        if (smartTimer.delay!=interval) {
                                smartTimer.delay=interval;
                        }
                        // saving the current timer
                        currentTimer=getTimer();
                        smartTimerText.text="Smart counter: "+smartTimer.currentCount+" ticks counted";
                        smartTimerText.setTextFormat(smartTextFormat);
                }
                private function onActivate(e:Event):void {
                        pausedScreen.visible=false;
                        // smart timer delay management
                        if (smartTimer.delay-lapTime>0) {
                                smartTimer.delay=smartTimer.delay-lapTime;
                        }
                        // saving the curren time
                        currentTimer=getTimer();
                        // starting the timers
                        normalTimer.start();
                        smartTimer.start();
                }
                private function onDeactivate(e:Event):void {
                        pausedScreen.visible=true;
                        // stopping the timers
                        normalTimer.stop();
                        smartTimer.stop();
                        // determining how much time has passed since the last tick
                        lapTime=(getTimer()-currentTimer);
                        smartTimerText.text="Smart counter: "+smartTimer.currentCount+" ticks counted and "+(smartTimer.delay-lapTime)+"ms to next tick";
                        smartTimerText.setTextFormat(smartTextFormat);
                }
        }
}

分享到:
评论

相关推荐

    flash as3.0 游戏编程 源码

    总的来说,通过分析这个"蜗牛赛跑"的源码,我们可以学习到ActionScript 3.0的基本语法、事件处理、游戏逻辑设计、图形动画、状态管理和音频处理等多个方面的知识,这对于想要深入理解Flash游戏开发的初学者来说是一...

    Flash制作的坦克大战源码

    通过深入研究这份《Flash制作的坦克大战源码》,开发者不仅可以学习到ActionScript的基本语法和面向对象编程的概念,还能了解到游戏开发中的逻辑设计、事件驱动编程、图形绘制和动画制作等多个方面的知识。...

    flash as3.0 别踩白块

    在《别踩黑块》游戏中,开发者利用AS3.0的事件驱动编程模型,实现了对用户输入的实时响应,确保游戏的流畅性。 游戏的核心逻辑主要涉及以下几个方面: 1. **图形渲染**:Flash CS6提供了强大的图形绘制API,开发者...

    shubiao.zip_The Flash!_flash AS3.0

    7. **状态管理**:为了实现游戏逻辑,如生命值、分数、游戏状态(如开始、暂停、结束),开发者通常会使用状态机模式,定义不同的游戏状态,并根据事件来切换状态。 8. **用户输入处理**:除了鼠标控制外,游戏可能...

    FLASH 模拟植物大战僵尸效果代码

    在AS3中,我们可以使用事件驱动模型来处理用户的输入和游戏的更新。例如,当僵尸触碰到植物时,会触发一个碰撞事件,进而执行相应的游戏逻辑,如减少生命值或消灭僵尸。 在模拟PVZ的植物系统时,我们需要定义各种...

    flash 倒计时器 源码 两个版本

    在IT行业中,Flash是一款曾经广泛应用于网页动画和交互设计的软件,它的编程语言ActionScript是其核心组成部分。本文将深入探讨“Flash倒计时器”的源码,包括两个不同的版本,以及如何根据需求进行定制。 首先,让...

    VB 设计动画程序、及图形界面

    Flash提供了丰富的动画和交互性,VB可以通过调用Flash控件的方法来控制动画播放、暂停、停止等。 5. **界面设计**:在VB中,良好的界面设计包括选择合适的控件(如按钮、文本框、图片框等)、布局管理(如使用...

    MFC 动画

    MFС支持通过消息机制来驱动动画,开发者可以通过定时器类(如Ctimer)来设置周期性事件,进而更新动画的状态。此外,MFС也支持事件驱动的编程模型,这意味着用户交互,如点击按钮,可以触发特定的动画序列。 关于...

    flex游戏开发demo

    在Flex中,可以使用Timer或ENTER_FRAME事件来驱动游戏循环。 - **碰撞检测**:检测游戏对象间的碰撞是游戏逻辑的重要部分。可以使用矩形碰撞检测、像素级碰撞检测等方法。 - **物理引擎**:对于复杂的运动模拟,...

    教你用vb制作网页浏览器

    在这个案例中,我们将利用VB创建一个简单的Flash动画播放器,该播放器具备播放、暂停、调整播放质量、改变画面大小等功能。 **一、准备工作** 在制作Flash动画播放器之前,我们需要确保系统中安装了Flash的相关控件...

    delphi实现图片falsh

    在Delphi中实现图片Flash功能,主要是通过编程技术来创建一个动态展示图片的程序,让图片按照特定的方式进行动画播放,类似于我们常见的Flash动画效果。这个过程涉及到的主要知识点包括图像处理、时间控制、用户界面...

    Flash ActionScript 图片播放器1

    通过学习和实践这个Flash ActionScript图片播放器1的实例,开发者不仅可以掌握基本的图片处理技巧,还能深入了解ActionScript的事件驱动模型和面向对象编程思想,对提升Flash应用的开发能力大有裨益。同时,对于AS ...

    定时器.zip

    2. **倒计时**:在在线考试、拍卖网站或计时器应用中,倒计时功能由定时器驱动。 3. **游戏循环**:游戏中的每一帧更新、计分系统或角色移动都可能依赖于定时器。 4. **数据同步**:后台服务可能会用定时器来定期...

    Flash+XML滚动新闻代码

    这种结合使得内容更新变得极其简单,因为XML文件可以独立于Flash动画进行编辑,无需每次更新内容时都重新编译整个Flash项目。 在“Flash+XML滚动新闻代码”中,通常的流程如下: 1. **XML文件结构**:首先,我们...

    as3.0滚动菜单

    总之,AS3.0滚动菜单是Flash开发中一个实用且有趣的案例,它结合了面向对象编程、事件驱动和动画技术,展示了如何在Flash平台上创建互动性强、用户体验良好的界面元素。对于希望提升Flash开发技能或了解AS3.0的人来...

    ActionScript Lyric Effect Source Code

    1. **Timeline控制**:Flash的时间轴可以用来控制动画的播放,通过ActionScript可以暂停、播放、跳转到特定帧。 2. **文本字段**:ActionScript提供了TextField类,用于在舞台上创建和操作文本。开发者可能用它来...

    俄罗斯方块-as vs java

    首先,我们需要了解ActionScript,它是一种面向对象的编程语言,主要用于Adobe Flash平台,广泛应用于网页动画和游戏开发。AS的优点在于其强大的图形处理能力和与Flash Player的紧密集成,这使得它在创建交互式内容...

    as3滚动文字

    例如,可以监听`Timer`事件来控制滚动速度,或者监听`MouseEvent`来暂停或改变滚动方向。 7. **代码实现**: 创建一个`Timer`对象来定期更新文本,每次更新时移动文本的起始位置,使旧文本消失,新文本出现。例如...

    本地播放器(ActionScript 3.0实现)

    ActionScript 3.0 是Adobe Flash Platform的主要编程语言,用于创建交互式内容、游戏和动画。在本文中,我们将深入探讨如何使用ActionScript 3.0来实现一个本地播放器。 1. **ActionScript 3.0基础** 在开始开发...

    flash倒计时倒计时

    - 对于实时性要求极高的场景,可能需要用到消息队列(MQ)或者事件驱动架构来确保及时性。 8. **压缩包文件分析**: - 给定的压缩包文件名为“倒计时”,可能包含的是一个用于实现倒计时功能的代码示例、模板或者...

Global site tag (gtag.js) - Google Analytics