Cocos2d-JS中使用CocosStudio资源——帧动画(2)

在本篇博客中,我们将通过一个在Cocos2d-JS中使用从CocosStudio导出的帧动画资源的例子,来简要介绍以下内容:利用ActionTimeLine进行动画切割,如何使用导出的帧动画资源。关于帧动画,由于内容繁杂。我们将分为两篇进行介绍。在上一篇中,我们已经做好了前期的资源准备和CocosCodeIDE中的简单处理,本篇将主要介绍资源的使用问题。

一、使用CocosStudio资源

做好了前期的准备工作,终于到我们的重头戏(FrameAnimationScene.js)了,下面,我们将要来学习如何获取CocosStudio中导出的资源等。

第一步:加载FrameAnimationScene界面的JSON资源分析,并获取FrameAnimationScene对象。将FrameAnimationScene对象加入到layer中。具体代码如下:

        //加载frameAnimation界面的JSON资源分析,并获取frameAnimationScene对象。
        frameAnimationScene = ccs.load(res.frame_animation_json).node;
        //将frameAnimationScene对象加入到layer中。
        this.addChild(frameAnimationScene);

第二步:从FrameAnimationScene中查找相应的控件对象,包括button控件和Shark动画节点所依附的那个节点,查找方法相似。具体代码如下:

        //从frameAnimationScene中获取动画节点依附的节点对象
        //通过该对象可以实现对动画节点的一些移动等操作,如:MoveBy,MoveTo等。
        sharkNode = frameAnimationScene.getChildByName("ProjectNode_1");

        //获取三个Button
        attackButton = ccui.helper.seekWidgetByName(frameAnimationScene, "attackButton");
        deadAttackButton = ccui.helper.seekWidgetByName(frameAnimationScene, "deadattackButton");
        deadButton = ccui.helper.seekWidgetByName(frameAnimationScene, "deadButton");

第三步:添加事件监听,方法类似,具体代码如下:

        //三个Button注册事件处理函数
        attackButton.addTouchEventListener(this.buttonTouchEvent);
        deadAttackButton.addTouchEventListener(this.buttonTouchEvent);
        deadButton =
        deadButton.addTouchEventListener(this.buttonTouchEvent);

第四步:运行动画前的准备工作,包括获取ActionTimeLine对象等,具体代码如下:

        //从动画节点中获取ActionTimeLine。
        shark = ccs.load(res.shark_json).action;
        frameAnimationScene.runAction(shark);

第五步:设置帧事件监听。注意,此处有大坑!

        //设置帧事件监听,每一帧一次监听。
        //正常情况下应该使用如下语句:
        //shark.setFrameEventCallFunc(this.frameAnimationEvent);
        //但是,有Bug!!!不能用。
        //换个角度解决问题,每一帧动画都会触发update事件。然后在update中写事件处理内容。
        this.scheduleUpdate();

第六步:定义相应监听事件的具体处理信息,具体代码如下:

update:伪帧事件监听处理函数。

    update:function(){
        //换个角度解决问题,现在在这里处理每一帧的事件。
        //判断动画是否在播放,如果在播放,则使所有按钮处于“禁用状态”
        //从而来模仿“技能冷却”的使用。
        if(!shark.isPlaying()){
            //如果动画不在播放状态,则将处于禁用的技能激活。
            if(!attackButton.isBright()){
                attackButton.setBright(true);
                attackButton.setTouchEnabled(true);
            }
            if(!deadAttackButton.isBright()){
                deadAttackButton.setBright(true);
                deadAttackButton.setTouchEnabled(true);
            }
            if(!deadButton.isBright()){
                deadButton.setBright(true);
                deadButton.setTouchEnabled(true);
            }
        }
    },

PS:如果没有Bug的话,帧事件处理应该写在这里:

    frameAnimationEvent:function(frame){
        //正常情况下,应该在这里处理每一帧的事件。
        cc.log("Frame Animation Event");
    }

Button控件触发的事件处理,在这个事件处理里面,我们会展示游戏设计中常用的帧动画处理的相关方法具体代码如下:

    buttonTouchEvent:function(sender,type){
        //三个按钮的事件处理函数
        switch (type) {
        case ccui.Widget.TOUCH_ENDED:
            switch (sender.getName()) {
            //可以通过两种方式设置动画的播放。
            //推荐第二种!!!!
            case "attackButton":
                //第一种
                //通过设置开始帧,结束帧,是否循环播放等进行播放动画
                shark.gotoFrameAndPlay(0,30,false);
                //将按钮设为禁用状态。
                self.changeButtonBright();
                break;
            case "deadattackButton":
                //第二种
                //通过player函数播放指定名称的动画
                shark.play("DAttack",false);
                self.changeButtonBright();
                break;
            case "deadButton":
                shark.play("Dead",false);
                self.changeButtonBright();
                //死的时候,先往前走几步,倒下死亡,再滑回来。
                sharkNode.runAction(cc.Sequence(cc.MoveBy(0.5,cc.p(-100, 0)),cc.MoveBy(2,cc.p(100, 0))));
                break;
            default:
                break;
            }
            break;
        default:
            break;
        }
    },

PS:changeButtonBright函数的具体代码:

    changeButtonBright:function(){
        //将各个按钮设为禁用状态。禁用触摸响应。
        attackButton.setBright(false);
        deadAttackButton.setBright(false);
        deadButton.setBright(false);
        attackButton.setTouchEnabled(false);
        deadAttackButton.setTouchEnabled(false);
        deadButton.setTouchEnabled(false);
    },

代码简介:

上面的代码都有注释,看了应该很明白。这里就简单介绍一下:

1.整体思路:

通过点击三个技能按钮,分别为普通攻击,大招攻击,死亡。每个技能释放过程中,所有技能都会进入冷却状态,只有等技能释放完毕后,才能释放下一个技能。释放死亡技能时(额,这个不能算作技能。),人物会向前走几步,再倒地死亡,然后再滑回来(只是为了让人物保持原来位置,所以加个滑回来的动作。)。

2.技能冷却设计:

我想这个应该是游戏设计中经常会用到的功能。首先,我们在每次释放技能的时候,调用changeButtonBright方法,将所有技能按钮禁用(类似于进入冷却)。由于帧事件回调函数shark.setFrameEventCallFunc(this.frameAnimationEvent);不能用,所以,我们采用update方法,每一帧都更新一次,检查一下,现在是否在释放技能,如果不在释放技能,就激活处于冷却状态的技能。

通过上面的过程就可以顺利地完成技能的冷却和激活操作,当然了你可以进一步在update函数处理中,对更细节的地方进行处理。操作和思路应该都相似。

PS:貌似isDone()方法也不能用,求官方早日解决!!!!当然了,如果是我使用姿势不对,还欢迎各位朋友指点一二。

3.边放动画边移动:

我想这也是大多数游戏设计中所必须的功能,你想如果你的人物在不停地奔跑,却在屏幕中只停留于原地,这得是多么悲哀的事情!!!!

本文提供了一种解决方案,那就是:获取动画节点所依附的节点,通过操作此节点可以实现边移动(MoveBy)边播放动画。在这个例子中,我们是在人物死亡时,让他向前走几步再死,然后滑回去。

二、运行效果

到这里,对于FrameAnimationScene界面的分析和使用就介绍完毕了。你可以运行一下。我的部分运行效果如下:

大招效果图

死亡效果图

三、补充说明

为了方便大家学习研究,下面提供本教程项目文件的百度网盘下载链接:

LoginScene.js的完整源码如下:

var LoginLayer = cc.Layer.extend({
    loginScene:null,
    loginButton:null,
    nameTextField:null,
    passwordTextField:null,
    saveCheckBox:null,
    name:null,
    password:null,
    ctor:function () {
        //////////////////////////////
        // 1. super init first
        this._super();

        /////////////////////////////
        // 2. add a menu item with "X" image, which is clicked to quit the program
        //    you may modify it.

        //加载login界面的JSON资源分析,并获取loginscene对象。
        loginScene = ccs.load(res.login_json).node;
        //将loginscene对象加入到layer中。
        this.addChild(loginScene);
        //从loginScene中获取控件并注册监听事件。
        this.dealWidgets();
        return true;
    },

    //从loginScene中获取控件并注册监听事件。
    dealWidgets:function(){
        //LoginButton控件
        loginButton = ccui.helper.seekWidgetByName(loginScene, "login");
        loginButton.addTouchEventListener(this.buttonTouchEvent);
        //nameTextField输入框控件
        nameTextField = ccui.helper.seekWidgetByName(loginScene, "name");
        nameTextField.addCCSEventListener(this.textFieldEvent);
        //passwordTextField输入框
        passwordTextField = ccui.helper.seekWidgetByName(loginScene, "password");
        passwordTextField.addCCSEventListener(this.textFieldEvent);
        //checkBox控件
        saveCheckBox = ccui.helper.seekWidgetByName(loginScene, "save");
        saveCheckBox.addCCSEventListener(this.selectedStateEvent);
    },

    //CheckBox控件触发的事件处理
    selectedStateEvent: function (sender, type) {
        switch (type) {
        case ccui.CheckBox.EVENT_SELECTED:
            cc.log("Event Selected");
            break;
        case ccui.CheckBox.EVENT_UNSELECTED:
            cc.log("Event Unselected");
            break;
        default:
            break;
        }
    },

    //TextField控件触发的事件处理
    textFieldEvent:function(sender,type){
        //根据触发事件的类型进行分情况处理,从控制台输出cc.log();
        switch (type) {
        case ccui.TextField.EVENT_ATTACH_WITH_IME:
            cc.log("TextField Event Attach With Ime");
            break;
        case ccui.TextField.EVENT_DETACH_WITH_IME:
            cc.log("TextField Event Detach With Ime");
            break;
        case ccui.TextField.EVENT_INSERT_TEXT:
            cc.log("TextField Event Insert Text");
            break;
        case ccui.TextField.EVENT_DELETE_BACKWARD:
            cc.log("TextField Event Delete Backward");
            break;
        default:
            break;
        }
    },

    //Button控件触发的事件处理
    buttonTouchEvent:function(sender,type){
        //根据触发事件的类型进行分情况处理,从控制台输出cc.log();
        switch (type) {
        case ccui.Widget.TOUCH_BEGAN:
            cc.log("loginButton Touch Began");
            //获取用户在name和password输入框的输入。使用getString()方法获得内容。
            cc.log("username : " + nameTextField.getString());
            cc.log("password : " + passwordTextField.getString());
            //获取用户是否勾选CheckBox,使用isSelected()方法获取,返回boolean。
            cc.log("saveState : " + saveCheckBox.isSelected());
            break;
        case ccui.Widget.TOUCH_MOVED:
            cc.log("loginButton Touch Moved");
            break;
        case ccui.Widget.TOUCH_ENDED:
            cc.log("loginButton Touch Ended");
            break;
        case ccui.Widget.TOUCH_CANCELED:
            cc.log("loginButton Touch Canceled");
            break;
        default:
            break;
        }
    }
});

var LoginScene = cc.Scene.extend({
    onEnter:function () {
        this._super();
        var layer = new LoginLayer();
        this.addChild(layer);
    }
});
时间: 2024-10-15 08:19:43

Cocos2d-JS中使用CocosStudio资源——帧动画(2)的相关文章

Cocos2d-JS中使用CocosStudio资源——帧动画(1)

在本篇博客中,我们将通过一个在Cocos2d-JS中使用从CocosStudio导出的帧动画资源的例子,来简要介绍以下内容:利用ActionTimeLine进行动画切割,如何使用导出的帧动画资源.关于帧动画,由于内容繁杂.我们将分为两篇进行介绍.本篇将主要介绍资源的准备工作,下一篇将主要介绍资源的使用问题. 不得不说: 按照原来的进度安排,帧动画和骨骼动画我准备最后介绍.但是,看到好多朋友非常期待动画的讲解,于是就修改了一下计划.其实,关于帧动画,前几天就大体研究明白了,这几天一直围绕着一个"坑

Cocos2d-JS中使用CocosStudio资源——序

Cocos2d官网上对于Cocos2d-JS和CocosStudio的教程有很多,但是对于如何将二者连接起来的教程却很少,至于如何在Cocos2d-JS中使用从CocosStudio导出的资源方面的教程就更少得可怜.也应博友的要求,我最近会写一个系列的教程,都是关于如何在Cocos2d-JS中使用从CocosStudio导出的资源方面的,希望大家关注.在这篇博客中,我会简单介绍一下学习的准备工作.我们会从简单的按钮,输入框开始,一直到帧动画,地图等的使用.如果你准备好了,那就跟我一起来吧. 一.

Cocos2d-JS中使用CocosStudio资源——关卡选择界面

在本篇博客中,我们将通过一个在Cocos2d-JS中使用从CocosStudio导出的关卡选择界面资源的例子,来简要介绍以下内容:Button控件,Text控件,PageView控件,即翻页容器的使用. 一.CocosStudio准备 第一步:从官网下载相应的示例,LevelSelection.效果图如下: 第二步:修改其中的一些控件的名称,方便寻找获取,如: 由于官网给的例子中的控件名字有的较复杂,所以可以按照自己的想法进行修改. 第三步:发布资源.注意发布设置中应该将数据格式改为JSON格式

Cocos2d-JS中使用CocosStudio资源——设置界面

在本篇博客中,我们将通过一个在Cocos2d-JS中使用从CocosStudio导出的设置界面资源的例子,来简要介绍以下内容:Slider控件的使用. 一.CocosStudio准备 第一步:从官网下载相应的示例,setting.效果图如下: 第二步:修改其中的一些控件的名称,方便寻找获取,如: 将Music那个滑动条的控件名字改为musicSlider,从而方便查找. 类似的修改还可以有:Continue按钮,Sound滑动条等. 第三步:发布资源.注意发布设置中应该将数据格式改为JSON格式

Cocos2d-JS中使用CocosStudio资源——ListView和ScrollView

在本篇博客中,我们将简要分析一下ListView和ScrollView之间的关系,如何正确使用两个控件进行设计,目前CocosStudio对两个控件的支持状况等. 一.ListView和ScrollView的一些思考 1. 两者联系: 首先,我们要知道ListView是继承自ScrollView的,也就是说,ListView在ScrollView的基础上,对一些细节功能进行了细化.ScrollView有的方法,ListView都有,而ListView有的,ScrollView未必有. 官方的JS

cocos2d JS 中的数组拼接与排序

1 var arrA = [];//创建三个局部变量的新数组 2 var arrB = []; 3 var arrC = []; 4 var newCards = this.MyMahjong;//创建一个新的局部变量等于一个全局变量的数组:并把里面的内容依次拆开再全部拼接 5 for(var t=0;t<newCards.length;t++){ 6 var char = newCards[t].charAt(0); 7 if(char == "a"){ 8 arrA.push

Android基础笔记(十)- 帧动画、补间动画详解、对话框

帧动画 补间动画Tween Animation 对话框以及面试中的注意点 帧动画 帧动画很简单,我们首先看一下Google官方解释This is a traditional animation in the sense that it is created with a sequence of different images. 意思表达的很明了,一个传统的动画是由一组不同的图片组成的.帧动画,就像GIF图片,通过一系列Drawable依次显示来模拟动画的效果. 创建一帧动画分为一下几步(支持4

Qt移动应用开发(三):使用精灵图片实现帧动画

Qt移动应用开发(三):使用精灵图片实现帧动画 上一篇博文讲到了Qt Quick对于动画的一般支持,动画的形式多样,配合不同的插值函数,可以几乎实现所有想要的动画效果,而对于游戏的一些特殊的效果比如说帧动画,Qt更是有专门的类来实现.下面我们就来看看Qt Quick中究竟是对帧动画是如何实现的吧. 原创文章,反对未声明的引用.原博客地址:http://blog.csdn.net/gamesdev/article/details/33743527 一般2D的游戏引擎都将帧动画作为一项非常重要的功能

Android基础入门教程——8.4.1 Android动画合集之帧动画

Android基础入门教程--8.4.1 Android动画合集之帧动画 标签(空格分隔): Android基础入门教程 本节引言: 从本节开始我们来探究Android中的动画,毕竟在APP中添加上一些动画,会让我们的应用变得 很炫,比如最简单的关开Activity,当然自定义控件动画肯定必不可少啦~而Android中的动画 分为三大类,逐帧动画(Frame)以及补间动画(Tween),还有Android 3.0以后引入的属性动画 (Property),而本节给大家带来的是第一种动画--逐帧动画