quick-3.3学习笔记之状态机及骨骼动画的使用

原创 2015年11月17日 20:01:52

此博客仅作为自己的学习总结使用

function MainScene:ctor()

   local manager = ccs.ArmatureDataManager:getInstance()--获取骨骼动画管理器单例
   manager:addArmatureFileInfo("Hero/wuzhe.ExportJson")--添加文件到缓存里面
   local armature = ccs.Armature:create("wuzhe")
    armature:getAnimation():playWithIndex(0)
    armature:setPosition(240, 160);
     self:addChild(armature)
end


--状态机的实现

local Player = class("Player",function()
        return display.newSprite("#player1-1-1.png")
    end)

function Player:ctor()
    local StateMachine = require("framework.cc.components.behavior.StateMachine")
    self.fsm =  StateMachine.new() --创建状态机
    --from 可以由那几种状态   --to
    self.fsm:setupState({
        events = {
            {name = "walkAction", from = {"none","attackA","attackB"},   to = "walk" },
            {name = "hurtAction", from = "walk",  to = "hurt" },
            {name = "deadAction", from = "hurt", to = "dead" },
            {name = "attackAAction",  from = "walk",    to = "attackA"},
            {name = "attackBAction", from = "walk",    to = "attackB" },
     --none表示初始的状态,固定的
        },

--onbefore /on /onleave +状态,onbefore表示该状态激活前的回调函数,on表示正在激活的时候的回调函数

--onleave表示离开该状态的回调函数
        callbacks = {
            onbeforewalkAction = function(event) self:stopAllActions(); end,--执行该动作前,停止动作
            onwalkAction = function(event) self:walk() end,--执行的帧动画
            onleavewalkAction = function(event)  end,

            onbeforehurtAction = function(event) self:stopAllActions(); end,
            onhurtAction = function(event)
                    self:hurt();
                    self:performWithDelay(function() self.fsm:doEvent("deadAction") end, 1.0); --延迟函数
                end,
            onleavehurtAction =  function(event)  end,

            onbeforedeadAction = function(event) self:stopAllActions(); end,
            ondeadAction = function(event)self:dead() end,
            onleavedeadAction = function(event) end,

            onbeforeattackAAction = function(event) self:stopAllActions(); end,
            onattackAAction = function(event) self:attackA() end,
            onleaveattackAAction = function(event) end,

            onbeforeattackBAction = function(event)  self:stopAllActions(); end,
            onattackBAction = function(event) self:attackB() end,
            onleaveattackBAction = function(event) end,
        },
    })

end
function Player:walk()

--帧动画的实现,第一个参数表示图片命名格式,第二个参数表示起始的图片,第三个表示最后一张

     local frames = display.newFrames("player1-1-%i.png", 1, 4)--行走
    local animation = display.newAnimation(frames, 0.5 / 4) --创建动画
    self:playAnimationForever(animation)--该动画永久执行
end
function Player:hurt()
    local frames = display.newFrames("player1-4-%i.png", 1, 2)--被攻击
    local animation = display.newAnimation(frames, 0.5 / 2)
    self:playAnimationOnce(animation)
end
function Player:attackA()
    local frames = display.newFrames("player1-2-%i.png", 1, 4)--劈刺
    local animation = display.newAnimation(frames, 0.5 / 4)
    self:playAnimationForever(animation)
end
function Player:attackB()
    local frames = display.newFrames("player1-5-%i.png", 1, 4)--直刺
    local animation = display.newAnimation(frames, 0.5 / 4)
    self:playAnimationForever(animation)
end

function Player:dead()
 local frames = display.newFrames("player1-3-%i.png", 1, 4)--死亡
    local animation = display.newAnimation(frames, 0.5 / 4)
    self:playAnimationOnce(animation)
end

return Player



--以下是测试函数

local MainScene = class("MainScene", function()
    return display.newScene("MainScene")
end)

function MainScene:ctor()
    local Player = require("app.scenes.Player")
    local player = Player:new();
    player:setPosition(cc.p(480,320));
    self:addChild(player);
    player.fsm:doEvent("walkAction")--执行状态机的动作

   --1
    cc.ui.UIPushButton.new()
            :setButtonLabel(cc.ui.UILabel.new({text = "walk", size = 32, color = display.COLOR_WHITE}))
            :onButtonClicked(function()
                print("1");
                if player.fsm:canDoEvent("walkAction") then--判断是否可以执行该状态
                    print("1")
                    player.fsm:doEvent("walkAction")
                end
            end)
            :align(display.CENTER, 50, 100)
            :addTo(self)
    --2
    cc.ui.UIPushButton.new()
            :setButtonLabel(cc.ui.UILabel.new({text = "hurt", size = 32, color = display.COLOR_WHITE}))
            :onButtonClicked(function()
                print("2");
                if player.fsm:canDoEvent("hurtAction") then
                    player.fsm:doEvent("hurtAction")
                end
            end)
            :align(display.CENTER, 150, 100)
            :addTo(self)

    --3
            cc.ui.UIPushButton.new()
            :setButtonLabel(cc.ui.UILabel.new({text = "dead", size = 32, color = display.COLOR_WHITE}))
            :onButtonClicked(function()
                print("3");
                if player.fsm:canDoEvent("deadAction") then
                    player.fsm:doEvent("deadAction")
                end
            end)
            :align(display.CENTER, 250, 100)
            :addTo(self)
    --4
            cc.ui.UIPushButton.new()
            :setButtonLabel(cc.ui.UILabel.new({text = "attackA", size = 32, color = display.COLOR_WHITE}))
            :onButtonClicked(function()
                print("4");
                if player.fsm:canDoEvent("attackAAction") then
                    player.fsm:doEvent("attackAAction")
                end
            end)
            :align(display.CENTER, 350, 100)
            :addTo(self)

     --5
            cc.ui.UIPushButton.new()
            :setButtonLabel(cc.ui.UILabel.new({text = "attackb", size = 32, color = display.COLOR_WHITE}))
            :onButtonClicked(function()
                print("5");
                if player.fsm:canDoEvent("attackBAction") then
                    player.fsm:doEvent("attackBAction")
                end
            end)
            :align(display.CENTER, 450, 100)
            :addTo(self)
    

end

function MainScene:onEnter()
end

function MainScene:onExit()
end

return MainScene

相关文章推荐

cocos2dx学习笔记(一)在cocos2dx 中使用spine骨骼动画

在cocos2dx 中使用spine骨骼动画初探最近在制作一款2D横版游戏,主要使用spine来做骨骼动画。 我用的是1.7版本的破解版spine,大家可以自行百度 刚打开spine就是一个样例:...

Quick cocos2dx-Lua(V3.3R1)学习笔记(5)----让精灵动起来吧,使用序列帧动画

光有精灵太死板了,游戏里面肯定有不同的动画,难道人物走动,一张静态图就能打发对游戏质量要求越来越高的玩家么?所以我们要让精灵动起来 quick里面提供了使用序列帧动画的函数,我们直接使用就行了 现...

[maya学习笔记(19)] 骨骼动画介绍 约束介绍 点约束

在骨骼动画的学习中,我们主要了解这三部分内容:         1.骨骼的创建         2.骨骼动力学设定(IK反向动力学,constrain,在骨骼中的作用)         3....

Direct-X学习笔记--骨骼动画

学了几个月DX了,终于到了骨骼动画这一步了,好激动!之前导入过一些静态的模型,还是挺帅的。不过不能动,实在是太遗憾了。今天学习了骨骼动画,终于让偶的模型动起来啦!!! 一.简介 说到动画,其实本人...

Direct-X学习笔记--骨骼动画进阶

上一次,封装了一个简单的骨骼动画类,但是,这个类有很多问题。第一,只能播放一个默认的动画,第二,一个动画的实例里面包含了所有的资源,而我们只是绘制的时候需要资源,实例本身并不需要都包含资源,所以只需要...

Cocos2d-X 学习笔记 13 cocos2dx骨骼动画

不全是和原版一样,我做了一定的修改来更方便的生成数据。 地址:https://github.com/jyinkailej/Flash2Cocos2d-x blog:...

quick-cocos2dx 骨骼动画制作 使用dragonbones插件

本人小菜鸟第一次写博客,写的不好请大婶勿喷 公司的项目要用骨骼动画,以前没有接触过骨骼动画就在quick群里问了下怎么做。还好有人回我,并且给了我一个博客地址。http://zengrong.net...

学习笔记(4):状态机与动画结合

学习日记一和学习日记二分别学习了Qt动画框架和Qt状态机框架。 今天学习如何将两者结合起来。 回顾一下状态机的几个要素:状态机、状态、切换(QTransition)。            那么如何在...

Quick cocos2dx-Lua(V3.3R1)学习笔记(十二)----使用Cocos Code IDE 配合自带的PrebuiltRuntimeLua.apk进行真机调试

cocos code ide出来很久,虽然用了各种问题,比如卡顿,比如打开库文件编码乱码什么的,但它的真机调试还是很不错的,比logcat少了很多不需要的信息,也少了调试的时候,还要打包的蛋疼东。 ...

从零开始学习cocoStudio(5)--骨骼动画使用方法

骨骼动画       当前有两种模型动画的方式:顶点动画和骨骼动画。顶点动画中,每帧动画其实就是模型特定姿态的一个“快照”。通过在帧之间插值的方法,引擎可以得到平滑的动画效果。在骨骼动画中,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:quick-3.3学习笔记之状态机及骨骼动画的使用
举报原因:
原因补充:

(最多只允许输入30个字)