热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用仿ActionScript的语法来编写html5——第二篇,利用Sprite来实现动画

上一篇,我已经模仿as,加入了LBitmap和LBitmapData类,并且用它们实现了静态图片的显示。这次用Sprite来动态显示图片。依然遵循上一篇对显示对象的处理的思路,添加LSprite类,并追加show方法,如下:function...SyntaxHighlighter

 

上一篇,我已经模仿as,加入了LBitmap和LBitmapData类,并且用它们实现了静态图片的显示。

这次用Sprite来动态显示图片。

依然遵循上一篇对显示对象的处理的思路,添加LSprite类,并追加show方法,如下:

 

function LSprite(){ 

    var self = this; 

    self.type = "LSprite"; 

    self.x = 0; 

    self.y = 0; 

    self.visible=true; 

    self.childList = new Array() 

LSprite.prototype = { 

    show:function (cood){ 

        if(cood==null)cood={x:0,y:0}; 

        var self = this; 

        if(!self.visible)return; 

        LGlobal.show(self.childList,{x:self.x+cood.x,y:self.y+cood.y}); 

    }, 

    addChild:function (DisplayObject){ 

        var self  = this; 

        self.childList.push(DisplayObject); 

    } 

 

 

因为Sprite上可以有图片等其他的可显示对象,所以我在其构造函数里,添加了childList,用来保存它上面的所有对象。然后在调用它本身的show方法的时候,将其LGlobal循环现实其子对象。

这样一来,我们上一篇中显示图片的代码,也可以利用Sprite来显示了,代码如下:

 

function main(){ 

    loader = new LLoader(); 

    loader.addEventListener(LEvent.COMPLETE,loadBitmapdata); 

    loader.load("1.png","bitmapData"); 

function loadBitmapdata(event){ 

    var bitmapdata = new LBitmapData(loader.content); 

    var mapimg = new LBitmap(bitmapdata); 

     

    var backLayer = new LSprite(); 

    addChild(backLayer); 

    backLayer.addChild(mapimg); 

 

 

我们知道,actionscript中的Sprite可以添加EnterFrame事件,用来动态显示图片,我这里也来模仿一下,因为在LSprite类中show方法是不断循环的,所以,我只需要在show方法中不断调用一个方法,就能让其循环。

我假设有一个数组,里面存储了所有不断循环的所有方法,然后我就可以在show方法中循环这个数组,这样就达到了所有方法的循环,看下面

 

function LSprite(){ 

    var self = this; 

    self.type = "LSprite"; 

    self.x = 0; 

    self.y = 0; 

    self.visible=true; 

    self.childList = new Array() 

    self.frameList = new Array(); 

LSprite.prototype = { 

    show:function (cood){ 

        if(cood==null)cood={x:0,y:0}; 

        var self = this; 

        if(!self.visible)return; 

        LGlobal.show(self.childList,{x:self.x+cood.x,y:self.y+cood.y}); 

        self.loopframe(); 

    }, 

    loopframe:function (){ 

        var self = this; 

        var key; 

        for(key in self.frameList){ 

            self.frameList[key](); 

        } 

    }, 

    addChild:function (DisplayObject){ 

        var self  = this; 

        self.childList.push(DisplayObject); 

    } 

 

 

光假设当然是不行的,我们需要有添加这个循环事件的方法,所以我们还需要addEventListener方法,以及移除这个事件的removeEventListener方法

 

addEventListener:function (type,listener){ 

        var self = this; 

        if(type == LEvent.ENTER_FRAME){ 

            self.frameList.push(listener); 

        } 

    }, 

    removeEventListener:function (type,listener){ 

        var self = this; 

        var i,length = self.frameList.length; 

        for(i=0;i

            if(type == LEvent.ENTER_FRAME){ 

                self.frameList.splice(i,1); 

                break; 

            } 

        } 

    } 

 

 

该添加的都添加了,接下来,就来简单实现一个人物的行走图

先来给BitmapData类添加几个方法,用来改变图片显示的区域位置等

 

LBitmapData.prototype = { 

        setProperties:function (x,y,width,height){ 

            var self = this; 

            self.x = x; 

            self.y = y; 

            self.width = width; 

            self.height = height; 

        }, 

        setCoordinate:function (x,y){ 

            var self = this; 

            self.x = x; 

            self.y = y; 

        } 

    } 

 

 

好了,现在准备一张人物的行走图,这就让它动起来

 

var list = new Array(); 

var index = 0; 

var mapimg; 

var loader 

var imageArray; 

var animeIndex = 0; 

var dirindex = 0; 

var dirarr = new Array({x:0,y:1},{x:-1,y:0},{x:1,y:0},{x:0,y:-1}); 

function main(){ 

    loader = new LLoader(); 

    loader.addEventListener(LEvent.COMPLETE,loadBitmapdata); 

    loader.load("1.png","bitmapData"); 

function loadBitmapdata(event){ 

    var bitmapdata = new LBitmapData(loader.content,0,0,70,92); 

    imageArray = LGlobal.divideCoordinate(bitmapdata.image.width,bitmapdata.image.height,8,8); 

    mapimg = new LBitmap(bitmapdata); 

    mapimg.x = 100; 

    mapimg.bitmapData.setCoordinate(0,0); 

    index = 0; 

    var backLayer = new LSprite(); 

    addChild(backLayer); 

    backLayer.addChild(mapimg); 

    backLayer.addEventListener(LEvent.ENTER_FRAME, onframe) 

 

 

function onframe(){ 

    index++; 

    if(index >= imageArray[0].length){ 

        index = 0; 

    } 

    mapimg.bitmapData.setCoordinate(imageArray[dirindex][index].x,imageArray[dirindex][index].y); 

     

    mapimg.x += dirarr[dirindex].x*3; 

    mapimg.y += dirarr[dirindex].y*3; 

    if(animeIndex++ > 20){ 

        dirindex++; 

        if(dirindex > 3)dirindex = 0; 

        animeIndex = 0; 

    } 

 

 

 

 

效果看下面的url,看不到效果的请下载支持html5的浏览器

http://fsanguo.comoj.com/html5/jstoas01/index.html

源码的话,直接用浏览器就可以查看了,地球人都知道


摘自 lufy小屋

推荐阅读
  • setInterval()函数publicfunctionsetInterval(closure:Function,delay:Number,arguments):uint语 ... [详细]
  • 查看书籍详细信息:PHPforFlashFMS动态网站开发手札(附光……编辑推荐本书采用最新FlashRemoting技术,搭配开放原码,包括最新流行的Adobe官方支援Zend_ ... [详细]
  • 游戏开发_Html5+Lufylegend.js游戏开发引擎介绍及原理
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Html5+Lufylegend.js游戏开发引擎介绍及原理相关的知识,希望对你有一定的参考价值。  ... [详细]
  • Flash 宝典2001-07-24星河整理yeskyalignrightmarginwidth0marginheight0srchttp:www.chinabyte ... [详细]
  • 总目录:http:blog.csdn.netiloveas2014articledetails383044774.5.7 卷积矩阵的高级技巧及其原理     很多图形学教程 ... [详细]
  • 必要的时候我们需要将过长的字符串截短为较短长度,比如最多显示4个中文字,多余4个字只显示4个字(英文则应该是8个字母)等情况。直接上函数:functiongetCh ... [详细]
  • Final关键字的含义及用法详解
    本文详细介绍了Java中final关键字的含义和用法。final关键字可以修饰非抽象类、非抽象类成员方法和变量。final类不能被继承,final类中的方法默认是final的。final方法不能被子类的方法覆盖,但可以被继承。final成员变量表示常量,只能被赋值一次,赋值后值不再改变。文章还讨论了final类和final方法的应用场景,以及使用final方法的两个原因:锁定方法防止修改和提高执行效率。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文介绍了求解gcdexgcd斐蜀定理的迭代法和递归法,并解释了exgcd的概念和应用。exgcd是指对于不完全为0的非负整数a和b,gcd(a,b)表示a和b的最大公约数,必然存在整数对x和y,使得gcd(a,b)=ax+by。此外,本文还给出了相应的代码示例。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
author-avatar
拍友2502914573
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有