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

用仿ActionScript的语法来编写html5——第四篇,继承与简单的rpg

第四篇,继承与简单的rpg用仿ActionScript的语法来编写html5——第一篇,用仿ActionScript的语法来编写html5——第二篇,利用Sprite来实现动画用仿ActionScript的语法来编写html5——第三篇,鼠标事件与

 

第四篇,继承与简单的rpg

用仿ActionScript的语法来编写html5——第一篇,

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

用仿ActionScript的语法来编写html5——第三篇,鼠标事件与游戏人物移动

 

这次用继承自LSprite的类来实现简单的rpg的demo

先看一下最后的代码与as的相似度

 

var backLayer; 

//地图 

var mapimg; 

//人物 

var playerimg; 

var loader 

var imageArray; 

var loadIndex = 0; 

var imgData = new Array({name:"back.jpg",img:null},{name:"1.png",img:null},{name:"2.png",img:null}); 

var chara; 

var charaList; 

 

 

function main(){ 

    loadImage(); 

function loadImage(){ 

    if(loadIndex >= imgData.length){ 

        gameInit(); 

        return; 

    } 

    loader = new LLoader(); 

    loader.addEventListener(LEvent.COMPLETE,loadComplete); 

    loader.load(imgData[loadIndex].name,"bitmapData"); 

function loadComplete(event){ 

    imgData[loadIndex].img = loader.content; 

    loadIndex++; 

    loadImage(); 

function gameInit(event){ 

    var bitmapdata; 

    bitmapdata = new LBitmapData(imgData[0].img); 

    mapimg = new LBitmap(bitmapdata); 

     

    document.getElementById("inittxt").innerHTML=""; 

    backLayer = new LSprite(); 

    addChild(backLayer); 

    backLayer.addChild(mapimg); 

     

    bitmapdata = new LBitmapData(imgData[1].img,0,0,70,92); 

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

    playerimg = new LBitmap(bitmapdata); 

    chara = new CharacterSprite(true,playerimg,imageArray,0,0); 

    backLayer.addChild(chara); 

 

 

    charaList = new Array(); 

    for(var i=0;i<10;i++){ 

        bitmapdata = new LBitmapData(imgData[2].img,0,0,80,91); 

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

        playerimg = new LBitmap(bitmapdata); 

        var npcx = parseInt(Math.random()*800/3)*3; 

        var npcy = parseInt(Math.random()*480/3)*3; 

        var npc = new CharacterSprite(false,playerimg,imageArray,npcx,npcy); 

        backLayer.addChild(npc); 

        charaList.push(npc); 

    } 

     

    backLayer.addEventListener(LEvent.ENTER_FRAME, onframe) 

    backLayer.addEventListener(LMouseEvent.MOUSE_DOWN, onmousedown); 

 

 

function onframe(){ 

    chara.onframe(); 

     

    for(var i=0;i

        charaList[i].onframe(); 

    } 

function onmousedown(event){ 

    chara.toCoordinate.x = parseInt(event.selfX/3)*3; 

    chara.toCoordinate.y = parseInt(event.selfY/3)*3; 

 

 

应该还算可以吧?

看一下成果吧,看不到效果的请下载支持html5的浏览器

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

 

 

下面说一说如何继承,继承的话,js没有办法像as那样继承,

js的继承看下面

 

function base(derive,baseSprite,baseArgs){ 

    baseSprite.apply(derive,baseArgs); 

     

    for(prop in baseSprite.prototype){ 

        var proto = derive.constructor.prototype; 

        if(!proto[prop]){ 

            proto[prop] = baseSprite.prototype[prop]; 

        } 

    } 

 

 

三个参数分别是child,base,base构造器参数数组

这个方法可以实现js的完美继承

现在来建立一个继承自LSprite的类CharacterSprite

只需要在构造器里调用base(this,LSprite,[])就可以实现继承

而且CharacterSprite因为继承了LSprite的方法,所以它有addChild等方法

CharacterSprite类代码如下

 

function CharacterSprite(ishero,bitmap,imageArray,x,y){ 

    base(this,LSprite,[]); 

    var self = this; 

    self.x = x; 

    self.y = y; 

    self.toCoordinate = {x:x,y:y}; 

    self.ishero = ishero; 

    self.animeIndex = 0; 

    self.dirindex = 0; 

    self.dirmark = {"0,1":0,"-1,0":1,"1,0":2,"0,-1":3,"-1,1":4,"1,1":5,"-1,-1":6,"1,-1":7}; 

     

    self.bitmap = bitmap; 

    self.imageArray = imageArray; 

    self.addChild(bitmap); 

CharacterSprite.prototype.Onframe= function (){ 

    var self = this; 

    self.animeIndex++; 

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

        self.animeIndex = 0; 

    } 

    var markx = 0,marky = 0; 

    var l = 3; 

    if(self.x > self.toCoordinate.x){ 

        self.x -= l; 

        markx = -1; 

    }else if(self.x

        self.x += l; 

        markx = 1;  

    } 

    if(self.y > self.toCoordinate.y){ 

        self.y -= l; 

        marky = -1; 

    }else if(self.y

        self.y += l; 

        marky = 1; 

    } 

    if(markx !=0 || marky != 0){ 

        var mark = markx+","+marky; 

        self.dirindex = self.dirmark[mark]; 

    }else if(!self.ishero){ 

        if(self.index > 0){ 

            self.index -= 1; 

        }else{ 

            self.index = parseInt(Math.random()*300); 

            self.toCoordinate.x = parseInt(Math.random()*800/3)*3; 

            self.toCoordinate.y = parseInt(Math.random()*480/3)*3; 

        } 

    } 

    self.bitmap.bitmapData.setCoordinate(self.imageArray[self.dirindex][self.animeIndex].x,self.imageArray[self.dirindex][self.animeIndex].y); 

     

 

 

然后,准备好图片,按照最开始的代码,就可以完成rpg人物的添加移动等内容了

 

 

下一篇,也不知该研究什么了,先试着做个小游戏,然后看缺什么吧


 

摘自 lufy小屋


推荐阅读
  • 前端图片合成技术_靠谱的前端需要做哪些准备?
    Web前端开发源于传统的互联网,互联网普及让人才需求量居高不下,随着移动互联网的高速发展,移动终端的前端开发也越来越受到重视, ... [详细]
  • Flash CS4/5与Flex/Flash Builder的配合编码
    FlashCS45与FlexFlashBuilder的配合编码注:为方便起见文中把FlashCS45简称为Flash,把FlexFlashBuilder ... [详细]
  • 导读:很多朋友问到关于php前端脚本语言有哪些的相关问题,本文编程笔记就来为大家做个详细解答,供大家参考,希望对大家有所帮助!一起来看看吧!本文目录一览: ... [详细]
  • 查看书籍详细信息:PHPforFlashFMS动态网站开发手札(附光……编辑推荐本书采用最新FlashRemoting技术,搭配开放原码,包括最新流行的Adobe官方支援Zend_ ... [详细]
  • setInterval()函数publicfunctionsetInterval(closure:Function,delay:Number,arguments):uint语 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 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字。 ... [详细]
  • 电销机器人作为一种人工智能技术载体,可以帮助企业提升电销效率并节省人工成本。然而,电销机器人市场缺乏统一的市场准入标准,产品品质良莠不齐。创业者在代理或购买电销机器人时应注意谨防用录音冒充真人语音通话以及宣传技术与实际效果不符的情况。选择电销机器人时需要考察公司资质和产品品质,尤其要关注语音识别率。 ... [详细]
author-avatar
孙一诺她爹_480
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有