Cocos2dx ActionTimeline(如何播放cocosStudio编辑的动画 )

本文环境:cocos studio Version:3.10,cocos version:3.14.1


用cocos Studio编辑一个简单的动画,导出为csb文件(或者json)
这个csb文件里现在有两个动画,一个 jumpAmi(0-40) 另一个idleAmi(41-61)
如何用代码控制播放呢?下面直接上代码。

–传入Studio2.x的资源路径
local rootNode = cc.CSLoader:createNode(“ui/lobby_ui/inbox_btn_ui.csb”)
local action = cc.CSLoader:createTimeline(“ui/lobby_ui/inbox_btn_ui.csb”)

–注!!!:同一个文件创建的节点只能使用同一个文件创建的动画。
rootNode:runAction(action)
self:addChild(rootNode) –假定self为当前显示的scene

–第一个参数为起始帧,第二个参数为结束帧,第三个参数为是否循环播放
action:gotoFrameAndPlay(0,40,true)

还有其他播放方法,例如:action:play(“idleAmi”,true) 具体的去看API
帧事件监听可以调setFrameEventCallFunc()

action:setFrameEventCallFunc(function ( frame )
print(“event name:”,frame:getEvent())
end)


心得:刚开始做游戏的时候不习惯用编辑器,不管页面还是逻辑都用代码敲,觉得编辑器资源导来导去的很麻烦,但是做到后面发现编辑器可以省很多事,尤其是动画,要换做手写的话调试起来很麻烦,而且有一堆参数(数字)在哪里,看着就不顺眼。

Cocos2dX-lua Commonly used functions

一些常用的函数,写出来主要是方便拷贝哈哈哈哈哈哈哈……

setPosition //设置坐标 setPosition(cc.p(x,y))
setAnchorPoint //设置锚点 setAnchorPoint(cc.p(0,0))
setContentSize //设置大小 setContentSize(cc.size(width, height))
setLocalZOrder //设置层级 setLocalZOrder(0)
setScale //设置缩放 (0-1)setScale(0.5)
setRotationSkewY //翻转 setRotationSkewY(180)
setFlippedX //镜像反转 setFlippedX(true)
setRotation //旋转 setRotation(90)
removeFromParent //从父物体上移除 removeFromParent()
removeAllChildren //移除所有子物体 removeAllChildren()
setOpacity //设置透明度(0-255)setOpacity(150)
setColor //设置颜色 setColor(cc.c3b(128, 128, 128)) 支持c4b
setTouchEnabled //是否可点 setTouchEnabled(true)
setVisible //是否可见 setVisible(true) 我习惯用show和hide
stopAllActions //停止所有Action stopAllActions()
getChildByTag //根据tag找控件 getChildByTag(99)
getChildByName //根据名字找控件 getChildByName(“login_btn”)

有set方法一般都会有get方法,所以不写两次

string.upper(argument) –字符串全部转为大写字母
string.lower(argument) –字符串全部转为小写字母
string.format(…) –格式化字符串(拼接)
string.len(arg) –计算字符串长度

local chips3 = math.max(unpack(rewards)) –求数组rewards中的最大值

performWithDelay(self,function ( … ) –延时调用

end,1.2)

Cocos2dx-lua functions

基于cocos2dx-lua 3.1 自己写的一些常用方法,现在分享出来,有不合理的地方还请指出来

–数组乱序
function XRLTools:arrayRandomSequence( array )
if not array or type(array) ~= “table” or #array < 2 then
print(“error array type !”)
return
end
local len = #array
for i=1,len do
math.randomseed(os.clock()+i)
local seed = math.random(1,len)
local seed2 = math.random(1,len)
local value = array[seed]
array[seed] = array[seed2]
array[seed2] = value
end
end

例如:local array = {1,2,3,4,5}
XRLTools:arrayRandomSequence( array )

–延时调用
function XRLTools:delaycall( time,callback )
if time <= 0 then
callback()
else
local delayAction = transition.sequence({
cc.DelayTime:create(time),
cc.CallFunc:create(callback),
})
local scene = display.getRunningScene()
scene:runAction(delayAction)
return delayAction
end
end

例如: XRLTools:delaycall( 1,function ( … )
print(“延时一秒打印”)
end)

–两区域是否重叠(可用于碰撞检测)
function XRLTools:rectIntersectsRect( A,B )
local rect1 = A:getBoundingBox()
local rect2 = B:getBoundingBox()
return cc.rectIntersectsRect(rect1, rect2)
end

–判断一个点是否落在一个node上面
function XRLTools:isTouchInNode(pt, node)
local s = node:getContentSize()
local rect
if s.width == 0 or s.height == 0 then
rect = cc.utils_:getCascadeBoundingBox(node)
else
pt = node:convertToNodeSpace(pt)
rect = cc.rect(0, 0, s.width, s.height)
end
if cc.rectContainsPoint(rect, pt) then
return true
end
return false
end


cocos luacompile(coocs2d lua encrypt luac)

网上关于用cocos luacompile 把lua加密成luac的教程很多,我写在这里主要是方便自己查阅,废话不多说,在装好cocos环境后运行:cocos luacompile help 命令可以查看帮助。

cocos luacompile -s SRC_DIR_ARR  -d DST_DIR 该命令可以对lua文件简单的加密,直接这样加密很容易被解密,所以通常用下面的命令:

cocos luacompile -s SRC_DIR_ARR -d DST_DIR -e -k KEY -b SIGN –disable-compile

解释一下这几个参数-s 后的SRC_DIR_ARR 是资源路径即要加密文件的路径,-d 后的DST_DIR是输出的路径即加密后luac文件的路径, -e 后面可以不跟参数, -k 后的KEY是密匙,你自己设置一个字符串,复杂一点比较好, -b 后面的SIGN是签名,也是要自己设置一个字符串(在加密的文件中sign是明文)。执行完后会提示Compilation finished.说明成功了。

如果你设置了密匙和签名,还要在AppDelegate.cpp 中修改key和sign

LuaStack* stack = LuaEngine::getInstance()->getLuaStack();
stack->setXXTEAKeyAndSign(key, strlen(key), sign, strlen(sign));

如何生成xxx.fnt文件(Bitmap Font)

在游戏开发中(如:unity ,cocos等)我们经常会看到一些xxx.fnt的资源文件。这些文件是用来干什么的呢?它一般是用来显示玩家的金币数,倒计时等。今天来浅谈一下如何生成这种文件吧!得用到Bitmap Font Generator这个小工具。Windows下载

打开软件的界面是这样的,当鼠标在上面移动时,箭头指的地方会显示字符对应的ID,比如0的ID就是48。这个ID其实是一个十进制的Unicode编码,在线获取中文的unicode编码,比如:‘万’的unicode编码为:\u4e07,这还不是最终我们要的ID,还要将unicode编码的十六进制转换成十进制。(进制在线转换)如:4e07转换后为:19975,19975就是‘万’的ID,得到ID接下来看看怎么使用:

1.点击 Edit > open Image Manager 打开图片管理面板;
2.点击 Image > import image 选择要导入的图片,这时候你就看到有个地方让你填ID,你把我们最终得到的ID天就去点确认就好了;
3.点击 Options > Export options 打开导出设置面板,

注意红色箭头的地方要选对,其他的根据实际图片图设置。

4.点击 Options > Save bitmap font as … 给要生成的文件取个名字点击保存,然后你就看到生成了一个xxx.fnt 文件和一个 xxx_0.png的文件,把这两个文件拖到你的项目中就可以使用啦!!!

注意,注意,注意,重要的事情说三遍:导入的图片和路径都不能包含中文和空格,第二步点确认后还是没显示图片就请检查一下图片格式(不要只看后缀,之前就遇到一个坑,压缩的图片怎么都用不了,只好用ps重新导出)。

本文完!如果有不对或者不详细的地方请指出,链接的网站如有侵权请联系我删除。

lua 时间函数os.time()和os.date()

  • os.time()      –获取当前时间的时间戳
  • os.time({year =2016, month = 11, day =23, hour =17, min =17, sec = 00})     –获取指定时间的时间戳
注:任何一个时区,在相同的时间,同时调用os.time() 返回的结果都是一样的
  • os.date()    –把时间戳转化成可显示的时间字符串
  • print(os.date(“%Y–%m–%d %H:%M:%S”))    –获取当前时间戳的时间符串
  • print(os.date(“%Y%m%d %H:%M:%S”,1544084774))    –获取指定时间戳的时间字符串
注:如果服务器返回一个时间戳,客户端想要转换成可读样式,需要考虑到时区问题,因为是按照本地时区转换的,如果本地时区跟服务器所在时区不一致,就会导致时间显示错误,一般解决办法就是 加上时区差即可。
获取时区: tonumber(os.date("%z", 0))/100

Continue reading “lua 时间函数os.time()和os.date()”

Library of mathematical functions (lua)

  • math.abs          — take the absolute value        like: math.abs(-5)  = 5
  • math.ceil          — up          like: math.ceil(4.3) = 5
  • math.floor        — down         like: math.floor(5.8) = 5
  • math.random         — take a random number         like: math.random(100)
  • math.randomseed        — set random seeds          like: math.randomseed(os.time())
  • math.max         — get max number          like: math.max(3.5,5,-8,35) = 35
  • math.min          — get min number          like: math.min(3.5,5,-8,35) = -8
  • math.sqrt          —  √x       like: math.sqrt(4) = 2
  • math.pow          — X^y          like: math.pow(3,4) = 81
  • math.modf()       — Divide integers and decimals        like:math.modf(15.98)     15    0.98

  • math.pi        —          like: math.pi = 3.14159265358979323846
  • math.rad        — get radian(获取弧度)           like: math.rad(180) = 3.14159265358
  • math.deg       —  get angle (获取角度)                      like: math.deg(math.pi) = 180
  • math.sin         — get sin value              like: math.sin(math.rad(30)) = 0.5
  • math.cos       — get cos value           like: math.cos(0.5) = 0.87758256
  • math.tan        — get tan value            like: math.tan(0.5) = 0.5463024