quick-cocos2dx学习笔记

赫连实
2023-12-01

20140603

下载quick,解压,执行setup.bat(注意这里,setup主要做的事就是在系统环境变量里添加QUICK_COCOS2DX_ROOT,如果不执行这个的话,启动player时会报找不到framework.init的错误)

编码lua有2个工具,sublime和LDT。

1.sublime只能编码不能调试,可以添加一个叫QuickXDev的插件,这个插件是专门针对quick开发的。

可参考:

http://hi.baidu.com/wolf_panjin/item/b9bb6ffaab659fdd42c36aa0

http://my.oschina.net/lonewolf/blog/175781

http://www.cnblogs.com/9420sunshine/p/3739020.html


2.LDT,这个是eclipse上的一个扩展插件,可以调试lua,

可参考:

http://blog.csdn.net/chichigan1314/article/details/19137749

http://zengrong.net/post/1951.htm



20140604
以前调试lua都是用的Decoda,今天试着运行了一下LDT调试lua,安照 廖大的教程走,卡在了启动player的时候,模拟器提示 waiting for connect to debugger ,然后就死在那里了,eclipse下的断点也没走到,查评论发现有人和我遇到了一样的问题,并且下面有解决办法“试试不勾选 break on first line”,cool!在debug configuration里去掉了这个选项就能正常进入游戏并调试了,一切正常。
PS:后来发现是自己不注意LDT的状态,其实eclipse已经停住了,在CCLuaLoadChunksFromZIP("res/framework_precompiled.zip"),eclipse木有自动跳转到debug页面,手动切过去后发现了处于等待状态的堆栈等信息。
另外,一开始没有添加库quicklua.zip,导致使用LDT编辑的时候木有代码提示,查找资料 http://blog.csdn.net/chichigan1314/article/details/19137749发现,可以去下个 quicklua.zip,把下好的库添加到工程里就ok了。
参考文章:




20140610
刚接触quickX,lua也不熟,很想找个教程学习学习,在网上搜了很久也木有系统的教程,于是到quickX论坛发帖求助,廖大曰:“建议花几天时间练习一下Lua的基本用法,然后对着 samples 学。直接改 sample 来学习。 ”
啥也不想了,打开eclipse开撸,先是仿照quickX自带的例子中mvc这个学习,这里有个actor的类适合在游戏中的角色使用,照着例子代码往下撸,然后开player运行,无反应,查log,报空值,仔细查找,最后发现是 .:的差别,google被封,不会翻墙,baidu之,可得解( 参考),另外发现例子里的状态机很好玩,baidu之得解( 参考)。
但是发现代码里有几个关键字(class, clone, import)在网上搜不到,郁闷+苦闷,遂notepad++在quickX的目录下find,终于挖出来一些好东东,"framework"就是这个文件夹,里面的functions.lua有以上的详细讲解及lua原代码,还有一些pos神马的,则在shortcodes.lua里得解,看来只要把framework目录下的文件都看会了就不需要教程了。
总结: framework+ samples+ lua_test(这个在cocos2dx的例子目录下)+ LDT这些应该可以应付初期开发了。
自助者天助”大概就是这个意思吧。



20140611
今天在 quickX论坛上看到了个讲解使用vs调试lua的 帖子( 详细信息点我),讲的是怎么用BabeLua调试,不错,收集过来:
BabeLua是一款基于VS2012/2013(简称VS)的免费开源的Lua集成开发环境,在Lua编辑和调试方面,具有如下功能和特性:
●Lua语法高亮
●语法检查
●自动补全
●一键注释
●自定义代码折叠
●工程管理
●快速搜索和跳转
●文件大纲
●注入宿主程序内对Lua脚本进行调试
●设置断点观察变量值
●查看堆栈信息
BabeLua可以调试哪些程序
已经通过测试的程序:Lua5.1 for windows; Cocos2d-x(含quick); Babe2D(Boyaa)
正在测试的程序:Lua5.2; LuaJIT; Love2d; Moai; Gideros; Marmalade Quick; Corona; GSL-shell; 迅雷Bolt
下载地址:http://pan.baidu.com/s/1xnwtw
PS:需要装VS2012/2013, 不能是Express版
 
 
20140612
晚上在家撸代码,好苦逼
使用tiled生成的地图,对象层里的坐标x,y原始数据是按照左上角的位置,该值是按照 屏幕坐标系计算的(即在地图中以地图左上角为坐标原点,向下为y轴正方向,向右为x轴正方向),但是cocos2dx里直接获取到的值(valueForKey("y"):floatValue())却是转化成了 gl坐标系下的坐标,因为太困木有找到相关转换代码,晕乎乎的。
 
 
 
 20140618
今天给游戏加UI界面,资源是使用的CocosStudio的UI编辑器做的,但是资源加载上去之后,上面的按钮统统木有响应,就连按下的状态都木有啊,当时是先参考的3.0的lua范例,然后发现我用的是2.2.3的sdk,
3.0代码
    self._uiLayer = <span style="color:#ff0000;">cc.Layer</span>:create()
    self:addChild(self._uiLayer)

    self._widget = ccs.GUIReader:getInstance():widgetFromJsonFile("cocosui/UITest/UITest.json")
    self._uiLayer:addChild(self._widget)
2.2.3代码
    self._uiLayer = <span style="color:#ff0000;">TouchGroup</span>:create()
    self:addChild(self._uiLayer)

    self._widget = GUIReader:shareReader():widgetFromJsonFile("cocosgui/UITest/UITest.json")
    self._uiLayer:addWidget(self._widget)
有点坑,这个升级版本的时候得改成cc.Layer,
参考:
按钮可以接收事件了,然后添加事件响应代码,这个没出啥大问题,参考2.2.3lua_test里的代码就搞定了,其他版本的sdk里木有,只能找2.2.3
addTouchEventListener(function(sender, eventType) dosomething end)

按钮弄好了,得再把数字标签的值设一下,这回有点头大,
disLbl = tolua.cast( self.ingameUI:getChildByName("dis"), "LabelAtlas" )
disLbl:setStringValue(dis)-- 参数
注意:
1.我的score是number类型,而在lua里是木有整形这个玩意的,so加上 math.ceil(dis)可以取整
2."LabelAtlas" 也有坑,3.0的换成了TextAtlas,参考 http://www.cocoachina.com/bbs/read.php?tid=196724


20140619
今天碰到的问题是帧动画
cocosstudio的动画编辑器读取flash之后导出的资源,在非循环播放的时候会缺少最后一帧,据说是引擎问题,解决办法是在最后插入一个空帧
参考:



20140624
EventProxy事件分发
cc.EventProxy.new之后调用addEventListener报找不到addEventListener函数( a nil value)。
郁闷了好久,其实log的警告信息很明确:就是找不到这个函数,那就说明没有继承相关的类,
查看framework下关于EventProxy的代码,发现cc.EventProxy.new的第一个参数必须要有addEventListener方法,但是这个方法是哪里继承过来的呢?
因为之前使用mvc的ModelBase做过一个派生类,使用cc.EventProxy.new的addEventListener是没有问题的,于是仔细查看cc.mvc.ModelBase里的代码,发现了个cc(self):addComponent("components.behavior. EventProtocol"):exportMethods(),没错,就是这个EventProtocol,EventProtocol里含有addEventListener方法,在EventProxy里addEventListener实际调用的就是这个EventProtocol里的addEventListener方法,在cc.EventProxy.new第一个参数类里加上cc(self):addComponent("components.behavior.EventProtocol"):exportMethods(),运行一切OK,问题解决。
总结:遇到xxx是个nil值的报错,就说明表中缺少响应函数 or 变量,找到它问题就解决了。


20140625
TileMap竖线问题
开启CC_FIX_ARTIFACTS_BY_STRECHING_TEXEL=1


20140630
CocosStudioUI编辑器自适应后部分控件无法显示的问题
刚发现了新版Ui编辑器有进行简单适配的参数了,立马勾选“自适应分辨率”,然后又手欠的把root的尺寸百分比勾选上了,还很happy的填上了1.0 1.0,然后导出,加载到工程里,结果发现除了左下角的部分UI能够显示出来,其他都没了,我乐个擦,好神奇呀,上cocoachina论坛上搜,还真碰到了和我一样挫的家伙( 参考),往下翻解决办法,发现根节点的"UI工程尺寸和模式不要勾选百分比",试了一下,好使,原来是自己填错参数了。
总结:只有根节点可以勾选“ 自适应分辨率”,根节点勾选“自适应分辨率”之后不能修改根节点的“ 尺寸和模式”参数

[3.6750] [DEPRECATED] Node.registerScriptHandler() is deprecated, please use Node.addNodeEventListener()

[3.6760] [DEPRECATED] Node.scheduleUpdate(handler) is deprecated, please use Node.addNodeEventListener()

player输出了这样的log,我想了想,还是要注意一下log的提示把,既然人家说这个函数要作废了,我还是使用新的吧,于是四处查找addNodeEventListener()怎么添加每帧更新函数调用方法。也许是我水平太次了吧,网上都搜不到这个的相关信息,完全不知道怎么加,于是自己从quick的框架里、例子里查找,但是没有找到,有一种想要拉翔却怎么也拉不出来的感觉,无奈开始查引擎的c++代码,我原来用的是self:scheduleUpdate(handler(self, self.tick))的方式调用帧更新回调,那就看看CCNode::scheduleUpdate()都干了什么,理论上c++的代码里应该会抛出相关的回调,最后查到了CCNode::update,第一句就是if (hasScriptEventListener(NODE_ENTER_FRAME_EVENT)),擦这不就是我需要的么,之前看quick里的samples代码就看到过cc.NODE_ENTER_FRAME_EVENT的字样,但是没以为是用于scheduleUpdate的,瞎了我的18克拉狗眼!
总结:Node.registerScriptHandler() 和 Node.scheduleUpdate() 都使用 self:addNodeEventListener(cc.NODE_ENTER_FRAME_EVENT, function(dt) self:onEnterFrame(dt) end) self: scheduleUpdate_()代替。(这两个都得有)另外在OnExit里最好加上 self:removeAllNodeEventListeners()
PS:我好像发现了什么,怎么感觉self:scheduleUpdate_()这么眼熟,之前在项目一开始的时候我好像加过这句话,后来不知道为啥把帧更新删了……
PS2:我又发现了一个,为什么我当时没有直接搜“Node.scheduleUpdate(handler) is deprecated, please use Node.addNodeEventListener()”这句话,丫就在NodeEx.lua里躺着,找到这句话就能知道正确的调用方式了~~~


20140711
local A = import("A")
local B = class("B", A)

B.super.ctor(self) 和 B.super:ctor()

对与这个我只想说“呵呵”
本来刚接触lua的时候,学习了冒号和点的区别,马上感觉沾沾自喜,原来就是是否传self作为第一个参数的区别。其实这句话是没错的,quick的框架里class中调用父类ctor函数都是B.super.ctor(self)这样写的,我学会了冒号和点的区别之后立马把这个点换成了冒号,还自以为自己很聪明,可以少写的self,呵呵,呵呵,呵呵。
我已经饿得没力气再扯蛋了,在这里那个self其实代表的是B的实例,但是我改成 B.super:ctor()之后,默认传进去的参数就变成基类A的了,B.super = A,我手欠,我手欠,我手欠
补充:后来再想想可以利用这个实现c++类的静态成员功能。(A.staticMember)直接这样调用就可以了。


20140725
CCDirector:sharedDirector():setNextDeltaTimeZero(true)
当两帧间隔过长,需要设一下这个,跳过一帧。


20140826
coroutine.resume
这个东东可以模拟多线程(其实还是一个线程,就是由程序员自己分配什么时候该哪个模拟线程运行),今天在coroutine.resume里使用了crypto.encryptXXTEA,结果百试不爽的crypto.encryptXXTEA给我返回了个莫名其妙的结果,然后我就呵呵了。这个可能和coroutine的机制有关,它其实是保存stack状态来模拟的,而crypto.encryptXXTEA在c++端调用了  lua_pushlstring(stack->getLuaState(), (const char*)result, resultLength); ,此stack和coroutine里的stack可能已经不是一个东东了,当从c++返回的时候就出问题了。coroutine原理探析可参考下面的链接,感觉讲得比较好。


20140926
float & double
lua里的数其实都是double的,而setPosition()接收的都是float,我先是使用了lua计算出来的坐标,设置了坐标,然后再从node取出这个坐标做逻辑运算,然后就sb了,因为从dueble到float转换,然后再从float到double,取出来值的精度影响了逻辑判断。

 类似资料: