• 如何实现一个HTML5 RPG游戏引擎——第五章,实现人物和人物特效


    上一次,我们实现了对话类,今天就来做一个游戏中不可缺少的——人物类。

    当然,你全然是能够自己写一个人物类,可是为了方便起见,还是决定把人物类封装到这个引擎里。

    为了使这个类更有意义,我还给人物类加了几个特效,在以下解说中会提到。

    以下是本系列文章的文件夹:

    怎样制作一款HTML5 RPG游戏引擎——第一篇,地图类的实现

    http://blog.csdn.net/yorhomwang/article/details/8892305

    怎样制作一款HTML5 RPG游戏引擎——第二篇,烟雨+飞雪效果

    http://blog.csdn.net/yorhomwang/article/details/8915020

    怎样制作一款HTML5 RPG游戏引擎——第三篇,利用幕布切换场景

    http://blog.csdn.net/yorhomwang/article/details/9042571

    怎样制作一款HTML5 RPG游戏引擎——第四篇,情景对话

    http://blog.csdn.net/yorhomwang/article/details/9076103

    该引擎是基于lufylegend开发的,学习时请先了解lufylegend。

    官方站点地址:http://lufylegend.com/lufylegend

    API地址:http://lufylegend.com/lufylegend/api

    一,人物类LCharacter

    首先来看LCharacter构造器:

    [javascript] view plaincopy
     
    1. /** 
    2. *LCharacter.js 
    3. */  
    4. function LCharacter(data,row,col,speed,isFighter){  
    5.     var s = this;  
    6.     base(s,LSprite,[]);  
    7.     s.type = "LCharacter";  
    8.     if(!speed)speed = 0;  
    9.     if(isFighter == undefined)isFighter = false;  
    10.     s.speed = speed;  
    11.     s.speedIndex = 0;  
    12.     s.x = 0;  
    13.     s.y = 0;  
    14.     s.mode = "";  
    15.     s.index = 0;  
    16.     if(isFighter == true){  
    17.         s.hp = 0;  
    18.         s.attack = 0;  
    19.         s.defense = 0;  
    20.     }  
    21.     s.effect = null;  
    22.     s.avatarNum = 0;  
    23.     s.flickerNum = 0;  
    24.     s.img = data;  
    25.     s.row = row;  
    26.     s.col = col;  
    27.     s.effectSprite = new LSprite();  
    28.     s.addChild(s.effectSprite);  
    29.     s.nameSprite = new LSprite();  
    30.     s.addChild(s.nameSprite);  
    31.     var imgData = new LBitmapData(data);  
    32.     imgData.setProperties(0,0,imgData.image.width/col,imgData.image.height/row);  
    33.     var list = LGlobal.divideCoordinate(imgData.image.width,imgData.image.height,row,col);  
    34.     s.imgWidth = imgData.image.width/col;  
    35.     s.imgHeight = imgData.image.height/row;  
    36.     s.anime = new LAnimation(s,imgData,list);  
    37.     s.addEventListener(LEvent.ENTER_FRAME,function(){  
    38.         if(s.effect != null){  
    39.             s.showEffect(s,s.effect);  
    40.         }  
    41.     });  
    42. }  

    这个类有5个參数,功能例如以下:

    [javascript] view plaincopy
     
    1. data:人物图片  
    2. row:将图片切成多少行,以方便运行动画  
    3. col:将图片切成多少列,以方便运行动画  
    4. speed:人物动画播放频率相对屏幕刷新频率的倍数  
    5. isFighter:是否处于战斗状态  

    上面的介绍有些含糊,我接着解释一下。首先,data所代表的图片是一个装有每帧动画的图片,比方以下这样的图片:

    然后我们的參数row和參数col就是用来表示这个图片能够分成几行,几列。比方上图,row就赋值成4,col也赋值成4,这样恰好能将每帧都切割出来。

    speed是用来表示播放动画频率的,假设我们在用init初始化游戏时,传入游戏频率为30毫秒,那假设不给这个參数赋值,播放动画的频率就是30毫秒,可是假设你认为30毫秒播放一帧太快了,想慢一点,便能够用到这个參数。比方说你想让播放频率达到每120毫秒播放一帧,而游戏频率设的是30毫秒,那就能够把这个參数设置为4。假设达到每150毫秒播放一帧,那就能够把这个參数设置为5。但要注意,这个參数赋值必须是正整数。

    isFighter这个參数是用来推断是否这个角色是处于战斗状态的。假设是就设为true,不是就设为false,当然你不设定就默认为false。当这个參数为true时,人物类就能够加几个属性,它们用来控制人物的hp,战斗力,防御力等,推断代码例如以下:

    [javascript] view plaincopy
     
    1. if(isFighter == true){  
    2.     s.hp = 0;  
    3.     s.attack = 0;  
    4.     s.defense = 0;  
    5. }  

    为了给这个类更方便地增加特效,我给它自身创建了一个叫effectLayer的LSprite。用于特效的几个属性还例如以下几个:

    s.effect = null;
    s.avatarNum = 0;
    s.flickerNum = 0;

    接着我创建了一个LAnimation对象,用它来显示人物动画,代码例如以下:

    [javascript] view plaincopy
     
    1. var imgData = new LBitmapData(data);  
    2. imgData.setProperties(0,0,imgData.image.width/col,imgData.image.height/row);  
    3. var list = LGlobal.divideCoordinate(imgData.image.width,imgData.image.height,row,col);  
    4. s.imgWidth = imgData.image.width/col;  
    5. s.imgHeight = imgData.image.height/row;  
    6. s.anime = new LAnimation(s,imgData,list);  

    详细LAnimation用法能够去lufylegend官方API中查看。这里就先不多讲了~

    为了使特效使用方便,我设计为直接通过调整effect属性来完成。可是effect在实例化前值是null,所以假设不做处理就调整了属性依旧是不会显示的。所以我添加了一个时间轴事件,让它不断地推断effect属性,以至于达到一改effect属性就能立马显示效果。代码例如以下:

    [javascript] view plaincopy
     
    1. s.addEventListener(LEvent.ENTER_FRAME,function(){  
    2.     if(s.effect != null){  
    3.         s.showEffect(s,s.effect);  
    4.     }  
    5. });  

    关于时间轴,说白了就是一个死循环,仅仅只是是停顿一段时间调用一次,javascript中通常常使用setInerval来实现,详细方法Google一下或百度一下就OK,我不多解释了。

    当然,详细怎样显示效果留到以下讲,我们先看其它方法。

    因为我们在开发的过程中要用到改动数据的方法,因此我们还得加一个setData方法:

    [javascript] view plaincopy
     
    1. LCharacter.prototype.setData = function(data,row,col,speed,isFighter){  
    2.     var s = this;  
    3.     if(!speed)speed = 0;  
    4.     if(isFighter == undefined)isFighter = false;  
    5.     s.speed = speed;  
    6.     s.img = data;  
    7.     s.row = row;  
    8.     s.col = col;  
    9.     if(isFighter == true){  
    10.         s.hp = 0;  
    11.         s.attack = 0;  
    12.         s.defense = 0;  
    13.     }  
    14.     var imgData = new LBitmapData(data);  
    15.     imgData.setProperties(0,0,imgData.image.width/col,imgData.image.height/row);  
    16.     var list = LGlobal.divideCoordinate(imgData.image.width,imgData.image.height,row,col);  
    17.     s.imgWidth = imgData.image.width/col;  
    18.     s.imgHeight = imgData.image.height/row;  
    19.     s.removeChild(s.anime);  
    20.     s.anime = new LAnimation(s,imgData,list);  
    21. }  

    參数和构造器的參数是一样的,方法也几乎相同,大家能够自己看一下。

    二,动画操作

    上面我们做好了构造器和重设数据方法,并解释了大半天,接下来就要讲讲动画操作了。

    动画操作一般有这几种:1,设置动画 2,获取动画信息 3,添加动画监听事件 4,播放动画

    还好,这三种方法在lufylegend中都封装得有,我们用起来就非常方便了。增加addActionEventListener方法,以达到给动画添加监听事件:

    [javascript] view plaincopy
     
    1. LCharacter.prototype.addActionEventListener = function(type,listener){  
    2.     var s = this;  
    3.     s.anime.addEventListener(type,listener);  
    4. }  

    增加setAction方法,以达到设置动画:

    [javascript] view plaincopy
     
    1. LCharacter.prototype.setAction = function(rowIndex,colIndex,mode,isMirror){  
    2.     var s = this;  
    3.     s.anime.setAction(rowIndex,colIndex,mode,isMirror);  
    4. }  

    增加getAction方法,以达到获取动画信息:

    [javascript] view plaincopy
     
    1. LCharacter.prototype.getAction = function(){  
    2.     var s = this;  
    3.     var returnAction = s.anime.getAction();  
    4.     return returnAction;  
    5. }  

    增加onframe方法,以达到播放动画:

    [javascript] view plaincopy
     
    1. LCharacter.prototype.onframe = function(){  
    2.     var s = this;  
    3.     if(s.speedIndex++ < s.speed)return;  
    4.     s.speedIndex = 0;  
    5.     s.anime.onframe();  
    6. }  


    有了这些使用时就方便多了。开发到这里,事实上是已经能够显示人物动画了。仅仅用这样写即可:

    [javascript] view plaincopy
     
    1. var backLayer = new LSprite();  
    2. addChild(backLayer);  
    3. var chara = new LCharacter(imglist["player"],4,4,3);  
    4. backLayer.addChild(chara);  
    5. backLayer.addEventListener(LEvent.ENTER_FRAME,onframe);  
    6. function onframe(){  
    7.     chara.onframe();  
    8. }  

    三,moveTo方法

    为了简化操作,我添加moveTo方法来控制人物移动。

    moveTo方法的代码:

    [javascript] view plaincopy
     
    1. LCharacter.prototype.moveTo = function(x,y,timer,type,style,completefunc){  
    2.     var s = this;  
    3.     if(!timer)timer = 1;  
    4.     if(!type)type = Quad.easeIn;  
    5.     if(!style)style = LMoveStyle.direct;  
    6.       
    7.     switch(style){  
    8.         case LMoveStyle.direct:  
    9.             var vars = {  
    10.                 x:x,  
    11.                 y:y,  
    12.                 ease:type,  
    13.                 onComplete:completefunc  
    14.             };  
    15.             LTweenLite.to(s,timer,vars);  
    16.             break;  
    17.         case LMoveStyle.horizontal:  
    18.             LTweenLite.to(s,timer,{  
    19.                 x:x,  
    20.                 ease:type,  
    21.                 onComplete:function(){  
    22.                     LTweenLite.to(s,timer,{  
    23.                         y:y,  
    24.                         ease:type,  
    25.                         onComplete:completefunc  
    26.                     });  
    27.                 }  
    28.             });  
    29.             break;  
    30.         case LMoveStyle.vertical:  
    31.             LTweenLite.to(s,timer,{  
    32.                 y:y,  
    33.                 ease:type,  
    34.                 onComplete:function(){  
    35.                     LTweenLite.to(s,timer,{  
    36.                         x:x,  
    37.                         ease:type,  
    38.                         onComplete:completefunc  
    39.                     });  
    40.                 }  
    41.             });  
    42.             break;  
    43.         default:  
    44.             trace("Error: Value of last param is wrong!");  
    45.     }  
    46. }  


    參数分别为:目标x坐标,目标y坐标,移动时间,缓动类型,移动样式,移动完成后调用的函数

    目标x坐标,目标y坐标不用解释。关键是后面几个比較重要。首先,因为这个效果我使用lufylegend的缓动类LTweenLite做的,所以timer就代表LTweenLite參数$duration,type就代表LTweenLite中的ease(缓动函数),LTweenLite的用法非常广,能够上官网看看。

    我们创建一个JSON对象,叫LMoveStyle,例如以下:

    [javascript] view plaincopy
     
    1. var LMoveStyle = {  
    2.     horizontal:"horizontal",  
    3.     vertical:"vertical",  
    4.     direct:"direct"  
    5. };  

    style这个參数传得值为LMoveStyle中的成员,就是LMoveStyle.horizontal,LMoveStyle.vertical,LMoveStyle.direct。LMoveStyle.horizontal是先横向移动,再竖向移动;LMoveStyle.vertical则是先竖向移动,再横向移动;LMoveStyle.direct则是直接移到该地点。以后也许还会加许多其他效果,这里就先做3个。

    使用时这么写就可以了:

    [javascript] view plaincopy
     
    1. charaObj.moveTo(200,100,10,Quad.easeIn,LMoveStyle.direct,function(){});  



    四,添加角色名称

    曾经在lufy博客上看到有人问怎样给人物加一个名称,当时看到了就想到了要加这个方案。事实上实现起来非常easy,代码例如以下:

    [javascript] view plaincopy
     
    1. LCharacter.prototype.addName = function(name,style){  
    2.     var s = this;  
    3.     s.nameSprite.removeAllChild();  
    4.     if(!name)name = 0;  
    5.     if(!style)style = [];  
    6.     if(!style[0])style[0] = 0;  
    7.     if(!style[1])style[1] = 0;  
    8.     if(!style[2])style[2] = "black";  
    9.     if(!style[3])style[3] = "11";  
    10.     if(!style[4])style[4] = "utf-8";  
    11.     var nameText = new LTextField();  
    12.     nameText.text = name;  
    13.     nameText.x = style[0];  
    14.     nameText.y = style[1];  
    15.     nameText.color = style[2];  
    16.     nameText.size = style[3];  
    17.     nameText.font = style[4];  
    18.     s.nameSprite.addChild(nameText);  
    19. }  

    代码非常easy,要用的时候直接这么写:

    [javascript] view plaincopy
     
    1. charaObj.addName("yorhom",[0,0,"black",10,"黑体"]);  

    五,人物特效

    1,分身术

    分身效果一般是出如今游戏的战斗过程中放大招什么的,实现起来也不是非常难,主要也是用到LTweenLite缓动类。

    首先我们来看看showEffect方法:

    [javascript] view plaincopy
     
    1. LCharacter.prototype.showEffect = function(s,type){  
    2.     switch(type){  
    3.           
    4.     }  
    5. }  

    这个方案是用时间轴驱动的,因此里面的内容是不断调用的。这个參数非常特别,首先是将自身指针传入,然后将效果类型传入。接着在内部推断类型为何,然后依据类型来作出对应的效果。

    我们创建一个LSkill对象,它是一个JSON对象,例如以下:

    [javascript] view plaincopy
     
    1. var LSkill = {  
    2.     avatar:"LSkillAvatar"  
    3. };  

    avatar音译为阿凡达,分身的意思(据我初步地了解应该是这样)。在这里就代表分身效果。写的时候就仅仅用写:

    [javascript] view plaincopy
     
    1. charaObj.effect = LSkill.avatar;  

    但详细怎么实现呢,能够看看以下代码:

    [javascript] view plaincopy
     
    1. LCharacter.prototype.showEffect = function(s,type){  
    2.     switch(type){  
    3.         case LSkill.avatar:  
    4.             if(s.avatarNum++ < 3){  
    5.                 var nowImg = s.anime.getAction();  
    6.                 var nowY = nowImg[0];  
    7.                 var nowX = nowImg[1];  
    8.                   
    9.                 var bitmapData = new LBitmapData(s.img,nowX*s.imgWidth,nowY*s.imgHeight,s.imgWidth,s.imgHeight);  
    10.                 var bitmap = new LBitmap(bitmapData);  
    11.                 bitmap.x = 0;  
    12.                 bitmap.y = 0;  
    13.                 LTweenLite.to(bitmap,0.5,{  
    14.                     x:(s.imgWidth)*s.avatarNum,  
    15.                     alpha:0.2,  
    16.                     ease:Quad.easeIn,  
    17.                     onComplete:function(){  
    18.                         LTweenLite.to(bitmap,0.5,{  
    19.                             x:(s.imgWidth)*s.avatarNum,  
    20.                             ease:Quad.easeIn,  
    21.                         });  
    22.                     }  
    23.                 });  
    24.                 s.effectSprite.addChild(bitmap);  
    25.                   
    26.                 var bitmapData2 = new LBitmapData(s.img,nowX*s.imgWidth,nowY*s.imgHeight,s.imgWidth,s.imgHeight);  
    27.                 var bitmap2 = new LBitmap(bitmapData2);  
    28.                 bitmap2.x = 0;  
    29.                 bitmap2.y = 0;  
    30.                 LTweenLite.to(bitmap2,0.5,{  
    31.                     x:(s.imgWidth)*s.avatarNum * -1,  
    32.                     alpha:0.2,  
    33.                     ease:Quad.easeIn,  
    34.                     onComplete:function(){  
    35.                         LTweenLite.to(bitmap2,0.5,{  
    36.                             x:(s.imgWidth)*s.avatarNum * -1,  
    37.                             ease:Quad.easeIn,  
    38.                             onComplete:function(){  
    39.                                 s.avatarNum = 0;  
    40.                                 s.effect = null;  
    41.                                 s.effectSprite.removeAllChild();  
    42.                             }  
    43.                         });  
    44.                     }  
    45.                 });  
    46.                 s.effectSprite.addChild(bitmap2);  
    47.             }  
    48.             break;  
    49.     }  
    50. }  


    代码非常长,只是逻辑非常easy,我们慢慢解释:

    首先我们的分身有六个也就是3对,然后我们推断是否达到3对,假设是就不再显示分身。接着我们取出动画的前几帧,作为分身的图片,例如以下:

    [javascript] view plaincopy
     
    1. var nowImg = s.anime.getAction();  
    2. var nowY = nowImg[0];  
    3. var nowX = nowImg[1];  

    然后创建左边分身的LBitmap对象,例如以下:

    [javascript] view plaincopy
     
    1. var bitmapData = new LBitmapData(s.img,nowX*s.imgWidth,nowY*s.imgHeight,s.imgWidth,s.imgHeight);  
    2. var bitmap = new LBitmap(bitmapData);  
    3. bitmap.x = 0;  
    4. bitmap.y = 0;  

    bitmap对象的显示区域大小就是人物动画的显示区域大小,图片就是人物本身那张图片。有了这些,就能够将人物的分身和人物本身做得一模一样了,仅仅只是分身是静态的,人物本身是动态的。

    接着我们開始将右边的分身缓动操作:

    [javascript] view plaincopy
     
    1. LTweenLite.to(bitmap,0.5,{  
    2.     x:(s.imgWidth)*s.avatarNum,  
    3.     alpha:0.2,  
    4.     ease:Quad.easeIn,  
    5.     onComplete:function(){  
    6.         LTweenLite.to(bitmap,0.5,{  
    7.             x:(s.imgWidth)*s.avatarNum,  
    8.             ease:Quad.easeIn,  
    9.         });  
    10.     }  
    11. });  
    12. s.effectSprite.addChild(bitmap);  

    这个缓动是一个特别的缓动,因为它是缓动套缓动,这样做就能够让分身移动的速度达到 慢->快->慢->快 的效果。并切在移动的过程中改变透明度。

    右边的分身效果非常左边得几乎相同,就是改一改方向而已。例如以下:

    [javascript] view plaincopy
     
    1. var bitmapData2 = new LBitmapData(s.img,nowX*s.imgWidth,nowY*s.imgHeight,s.imgWidth,s.imgHeight);  
    2. var bitmap2 = new LBitmap(bitmapData2);  
    3. bitmap2.x = 0;  
    4. bitmap2.y = 0;  
    5. LTweenLite.to(bitmap2,0.5,{  
    6.     x:(s.imgWidth)*s.avatarNum * -1,  
    7.     alpha:0.2,  
    8.     ease:Quad.easeIn,  
    9.     onComplete:function(){  
    10.         LTweenLite.to(bitmap2,0.5,{  
    11.             x:(s.imgWidth)*s.avatarNum * -1,  
    12.             ease:Quad.easeIn,  
    13.             onComplete:function(){  
    14.                 s.avatarNum = 0;  
    15.                 s.effect = null;  
    16.                 s.effectSprite.removeAllChild();  
    17.             }  
    18.         });  
    19.     }  
    20. });  
    21. s.effectSprite.addChild(bitmap2);  

    当右边缓动结束后,就会将effect属性设为null,然后移除全部分身。

    为了让大家见证一下分身效果,发两张截图:

    2,闪烁

    闪烁非常easy,直接用缓动调整透明度就可以了。例如以下:

    [javascript] view plaincopy
     
    1. if(s.flickerNum++ < 3){  
    2.     LTweenLite.to(s,0.3,{  
    3.         alpha:0.5,  
    4.         ease:Quad.easeIn,  
    5.         onComplete:function(){  
    6.             LTweenLite.to(s,0.5,{  
    7.                 alpha:1,  
    8.                 ease:Quad.easeIn,  
    9.                 onComplete:function(){  
    10.                     s.effect = null;  
    11.                     s.flickerNum = 0;  
    12.                 }  
    13.             });  
    14.         }  
    15.     });  
    16. }  

    同一时候为LSkill增加一项,完整LSkill代码例如以下:

    [javascript] view plaincopy
     
    1. var LSkill = {  
    2.     avatar:"LSkillAvatar",  
    3.     flicker:"LSkillFlicker"  
    4. };  

    效果例如以下:



    完整showEffect代码例如以下:

    [javascript] view plaincopy
     
    1. LCharacter.prototype.showEffect = function(s,type){  
    2.     switch(type){  
    3.         case LSkill.avatar:  
    4.             if(s.avatarNum++ < 3){  
    5.                 var nowImg = s.anime.getAction();  
    6.                 var nowY = nowImg[0];  
    7.                 var nowX = nowImg[1];  
    8.                   
    9.                 var bitmapData = new LBitmapData(s.img,nowX*s.imgWidth,nowY*s.imgHeight,s.imgWidth,s.imgHeight);  
    10.                 var bitmap = new LBitmap(bitmapData);  
    11.                 bitmap.x = 0;  
    12.                 bitmap.y = 0;  
    13.                 LTweenLite.to(bitmap,0.5,{  
    14.                     x:(s.imgWidth)*s.avatarNum,  
    15.                     alpha:0.2,  
    16.                     ease:Quad.easeIn,  
    17.                     onComplete:function(){  
    18.                         LTweenLite.to(bitmap,0.5,{  
    19.                             x:(s.imgWidth)*s.avatarNum,  
    20.                             ease:Quad.easeIn,  
    21.                         });  
    22.                     }  
    23.                 });  
    24.                 s.effectSprite.addChild(bitmap);  
    25.                   
    26.                 var bitmapData2 = new LBitmapData(s.img,nowX*s.imgWidth,nowY*s.imgHeight,s.imgWidth,s.imgHeight);  
    27.                 var bitmap2 = new LBitmap(bitmapData2);  
    28.                 bitmap2.x = 0;  
    29.                 bitmap2.y = 0;  
    30.                 LTweenLite.to(bitmap2,0.5,{  
    31.                     x:(s.imgWidth)*s.avatarNum * -1,  
    32.                     alpha:0.2,  
    33.                     ease:Quad.easeIn,  
    34.                     onComplete:function(){  
    35.                         LTweenLite.to(bitmap2,0.5,{  
    36.                             x:(s.imgWidth)*s.avatarNum * -1,  
    37.                             ease:Quad.easeIn,  
    38.                             onComplete:function(){  
    39.                                 s.avatarNum = 0;  
    40.                                 s.effect = null;  
    41.                                 s.effectSprite.removeAllChild();  
    42.                             }  
    43.                         });  
    44.                     }  
    45.                 });  
    46.                 s.effectSprite.addChild(bitmap2);  
    47.             }  
    48.             break;  
    49.         case LSkill.flicker:  
    50.             if(s.flickerNum++ < 3){  
    51.                 LTweenLite.to(s,0.3,{  
    52.                     alpha:0.5,  
    53.                     ease:Quad.easeIn,  
    54.                     onComplete:function(){  
    55.                         LTweenLite.to(s,0.5,{  
    56.                             alpha:1,  
    57.                             ease:Quad.easeIn,  
    58.                             onComplete:function(){  
    59.                                 s.effect = null;  
    60.                                 s.flickerNum = 0;  
    61.                             }  
    62.                         });  
    63.                     }  
    64.                 });  
    65.             }     
    66.             break;  
    67.         default:  
    68.             trace("Error: LSkill has no property that named " + "'" + type + "'");  
    69.     }  
    70. }  

    最后把DEMO呈现给大家,方便大家測试

    Demo URL:http://www.cnblogs.com/yorhom/articles/3134031.html

    六,源码

    人物类要实现的功能有非常多,所以,代码也有些多,例如以下:

    [javascript] view plaincopy
     
    1. /** 
    2. *LCharacter.js 
    3. */  
    4. function LCharacter(data,row,col,speed,isFighter){  
    5.     var s = this;  
    6.     base(s,LSprite,[]);  
    7.     s.type = "LCharacter";  
    8.     if(!speed)speed = 0;  
    9.     if(isFighter == undefined)isFighter = false;  
    10.     s.speed = speed;  
    11.     s.speedIndex = 0;  
    12.     s.x = 0;  
    13.     s.y = 0;  
    14.     s.mode = "";  
    15.     s.index = 0;  
    16.     if(isFighter == true){  
    17.         s.hp = 0;  
    18.         s.attack = 0;  
    19.         s.defense = 0;  
    20.     }  
    21.     s.effect = null;  
    22.     s.avatarNum = 0;  
    23.     s.flickerNum = 0;  
    24.     s.img = data;  
    25.     s.row = row;  
    26.     s.col = col;  
    27.     s.effectSprite = new LSprite();  
    28.     s.addChild(s.effectSprite);  
    29.     s.nameSprite = new LSprite();  
    30.     s.addChild(s.nameSprite);  
    31.     var imgData = new LBitmapData(data);  
    32.     imgData.setProperties(0,0,imgData.image.width/col,imgData.image.height/row);  
    33.     var list = LGlobal.divideCoordinate(imgData.image.width,imgData.image.height,row,col);  
    34.     s.imgWidth = imgData.image.width/col;  
    35.     s.imgHeight = imgData.image.height/row;  
    36.     s.anime = new LAnimation(s,imgData,list);  
    37.     s.addEventListener(LEvent.ENTER_FRAME,function(){  
    38.         if(s.effect != null){  
    39.             s.showEffect(s,s.effect);  
    40.         }  
    41.     });  
    42. }  
    43. LCharacter.prototype.setData = function(data,row,col,speed,isFighter){  
    44.     var s = this;  
    45.     if(!speed)speed = 0;  
    46.     if(isFighter == undefined)isFighter = false;  
    47.     s.speed = speed;  
    48.     s.img = data;  
    49.     s.row = row;  
    50.     s.col = col;  
    51.     if(isFighter == true){  
    52.         s.hp = 0;  
    53.         s.attack = 0;  
    54.         s.defense = 0;  
    55.     }  
    56.     var imgData = new LBitmapData(data);  
    57.     imgData.setProperties(0,0,imgData.image.width/col,imgData.image.height/row);  
    58.     var list = LGlobal.divideCoordinate(imgData.image.width,imgData.image.height,row,col);  
    59.     s.imgWidth = imgData.image.width/col;  
    60.     s.imgHeight = imgData.image.height/row;  
    61.     s.removeChild(s.anime);  
    62.     s.anime = new LAnimation(s,imgData,list);  
    63. }  
    64. LCharacter.prototype.addActionEventListener = function(type,listener){  
    65.     var s = this;  
    66.     s.anime.addEventListener(type,listener);  
    67. }  
    68. LCharacter.prototype.setAction = function(rowIndex,colIndex,mode,isMirror){  
    69.     var s = this;  
    70.     s.anime.setAction(rowIndex,colIndex,mode,isMirror);  
    71. }  
    72. LCharacter.prototype.getAction = function(){  
    73.     var s = this;  
    74.     var returnAction = s.anime.getAction();  
    75.     return returnAction;  
    76. }  
    77. LCharacter.prototype.onframe = function(){  
    78.     var s = this;  
    79.     if(s.speedIndex++ < s.speed)return;  
    80.     s.speedIndex = 0;  
    81.     s.anime.onframe();  
    82. }  
    83. LCharacter.prototype.moveTo = function(x,y,timer,type,style,completefunc){  
    84.     var s = this;  
    85.     if(!timer)timer = 1;  
    86.     if(!type)type = Quad.easeIn;  
    87.     if(!style)style = LMoveStyle.direct;  
    88.       
    89.     switch(style){  
    90.         case LMoveStyle.direct:  
    91.             var vars = {  
    92.                 x:x,  
    93.                 y:y,  
    94.                 ease:type,  
    95.                 onComplete:completefunc  
    96.             };  
    97.             LTweenLite.to(s,timer,vars);  
    98.             break;  
    99.         case LMoveStyle.horizontal:  
    100.             LTweenLite.to(s,timer,{  
    101.                 x:x,  
    102.                 ease:type,  
    103.                 onComplete:function(){  
    104.                     LTweenLite.to(s,timer,{  
    105.                         y:y,  
    106.                         ease:type,  
    107.                         onComplete:completefunc  
    108.                     });  
    109.                 }  
    110.             });  
    111.             break;  
    112.         case LMoveStyle.vertical:  
    113.             LTweenLite.to(s,timer,{  
    114.                 y:y,  
    115.                 ease:type,  
    116.                 onComplete:function(){  
    117.                     LTweenLite.to(s,timer,{  
    118.                         x:x,  
    119.                         ease:type,  
    120.                         onComplete:completefunc  
    121.                     });  
    122.                 }  
    123.             });  
    124.             break;  
    125.         default:  
    126.             trace("Error: Value of last param is wrong!");  
    127.     }  
    128. }  
    129. LCharacter.prototype.addName = function(name,style){  
    130.     var s = this;  
    131.     s.nameSprite.removeAllChild();  
    132.     if(!name)name = 0;  
    133.     if(!style)style = [];  
    134.     if(!style[0])style[0] = 0;  
    135.     if(!style[1])style[1] = 0;  
    136.     if(!style[2])style[2] = "black";  
    137.     if(!style[3])style[3] = "11";  
    138.     if(!style[4])style[4] = "utf-8";  
    139.     var nameText = new LTextField();  
    140.     nameText.text = name;  
    141.     nameText.x = style[0];  
    142.     nameText.y = style[1];  
    143.     nameText.color = style[2];  
    144.     nameText.size = style[3];  
    145.     nameText.font = style[4];  
    146.     s.nameSprite.addChild(nameText);  
    147. }  
    148. LCharacter.prototype.showEffect = function(s,type){  
    149.     switch(type){  
    150.         case LSkill.avatar:  
    151.             if(s.avatarNum++ < 3){  
    152.                 var nowImg = s.anime.getAction();  
    153.                 var nowY = nowImg[0];  
    154.                 var nowX = nowImg[1];  
    155.                   
    156.                 var bitmapData = new LBitmapData(s.img,nowX*s.imgWidth,nowY*s.imgHeight,s.imgWidth,s.imgHeight);  
    157.                 var bitmap = new LBitmap(bitmapData);  
    158.                 bitmap.x = 0;  
    159.                 bitmap.y = 0;  
    160.                 LTweenLite.to(bitmap,0.5,{  
    161.                     x:(s.imgWidth)*s.avatarNum,  
    162.                     alpha:0.2,  
    163.                     ease:Quad.easeIn,  
    164.                     onComplete:function(){  
    165.                         LTweenLite.to(bitmap,0.5,{  
    166.                             x:(s.imgWidth)*s.avatarNum,  
    167.                             ease:Quad.easeIn,  
    168.                         });  
    169.                     }  
    170.                 });  
    171.                 s.effectSprite.addChild(bitmap);  
    172.                   
    173.                 var bitmapData2 = new LBitmapData(s.img,nowX*s.imgWidth,nowY*s.imgHeight,s.imgWidth,s.imgHeight);  
    174.                 var bitmap2 = new LBitmap(bitmapData2);  
    175.                 bitmap2.x = 0;  
    176.                 bitmap2.y = 0;  
    177.                 LTweenLite.to(bitmap2,0.5,{  
    178.                     x:(s.imgWidth)*s.avatarNum * -1,  
    179.                     alpha:0.2,  
    180.                     ease:Quad.easeIn,  
    181.                     onComplete:function(){  
    182.                         LTweenLite.to(bitmap2,0.5,{  
    183.                             x:(s.imgWidth)*s.avatarNum * -1,  
    184.                             ease:Quad.easeIn,  
    185.                             onComplete:function(){  
    186.                                 s.avatarNum = 0;  
    187.                                 s.effect = null;  
    188.                                 s.effectSprite.removeAllChild();  
    189.                             }  
    190.                         });  
    191.                     }  
    192.                 });  
    193.                 s.effectSprite.addChild(bitmap2);  
    194.             }  
    195.             break;  
    196.         case LSkill.flicker:  
    197.             if(s.flickerNum++ < 3){  
    198.                 LTweenLite.to(s,0.3,{  
    199.                     alpha:0.5,  
    200.                     ease:Quad.easeIn,  
    201.                     onComplete:function(){  
    202.                         LTweenLite.to(s,0.5,{  
    203.                             alpha:1,  
    204.                             ease:Quad.easeIn,  
    205.                             onComplete:function(){  
    206.                                 s.effect = null;  
    207.                                 s.flickerNum = 0;  
    208.                             }  
    209.                         });  
    210.                     }  
    211.                 });  
    212.             }     
    213.             break;  
    214.         default:  
    215.             trace("Error: LSkill has no property that named " + "'" + type + "'");  
    216.     }  
    217. }  
    218. var LMoveStyle = {  
    219.     horizontal:"horizontal",  
    220.     vertical:"vertical",  
    221.     direct:"direct"  
    222. };  
    223. var LSkill = {  
    224.     avatar:"LSkillAvatar",  
    225.     flicker:"LSkillFlicker"  
    226. };  


    几乎相同引擎中的功能就这么多了,再看看有沒有什么漏掉了。假设沒有就能够公布了,敬请期待。


    谢谢大家阅读本文,支持就是最大的鼓舞。

    ----------------------------------------------------------------

    欢迎大家转载我的文章。

    转载请注明:转自Yorhom's Game Box

    http://blog.csdn.net/yorhomwang

  • 相关阅读:
    Shell脚本精选 规格严格
    转载Http一篇文章 规格严格
    Eclipse插件安装 规格严格
    Jad用法(转) 规格严格
    Java通过代理服务器访问外部网络 规格严格
    hwclock(Linux) 规格严格
    Linux下的多线程编程
    30岁前男人需要完成的事
    FTP主动模式及被动模式
    6年软件开发经验总结
  • 原文地址:https://www.cnblogs.com/mfryf/p/3138690.html
Copyright © 2020-2023  润新知