【该项目已停止维护,后继项目为Dorothy-SSR】
Dorothy是Cocos2d-x-Lua的另一个分支,基于原始版本2.1rc0版再次开发的框架。之所以开始在这个版本上做自定义的开发,是因为我在跟随原版的更新,持续做开发的过程中,发现它的功能渐渐变得又多又杂,吸纳了各式各样的扩展,光是骨骼动画的扩展就重复增加了两套代码。并且它的扩展的开发我觉得定制得也不够深入,除了引入更多bug坑以外,并没有简化太多的开发工作。此外原版的Lua接口是几乎完全依赖tolua++自动生成的,导出了很多没有意义的接口,并生成很多冗余的绑定代码,并且tolua++的绑定机制也太过于通用化,没有很好地利用Cocos2d-x的特性。
所以一方面为了精简核心框架,另一方面又提供更加深度定制的辅助框架,优化Lua绑定代码,我渐渐地竟然写出了这样一个分支版本来。
这个分支提供了更加精简的API接口。移除了原版中不是特别核心的扩展功能,添加了更有用的特性,修复了原版的一些bug,并且改善了Lua绑定的核心代码和tolua++生成的绑定代码。
-- 物理引擎的简单示例,创建一个旋转下落的矩形方块
-- 设置环境
Dorothy()
-- 创建场景
local scene = CCScene()
-- 创建世界
local world = oWorld()
world.showDebug = true -- 显示调试图形
scene:addChild(world)
-- 创建方块的定义
local def = oBodyDef()
def.type = oBodyDef.Dynamic
def:attachPolygon(80,60) -- 宽高(80,60)
-- 创建方块
local body = oBody(def, world, oVec2(400,500)) -- 初始坐标(400,500)
body.angularRate = 360 -- 每秒旋转360度
world:addChild(body)
-- 运行程序
CCDirector:run(scene)
-- 更多详情参考/project/Resources/Test/Case/Body.lua, Sensor.lua
自带的骨骼动画编辑器运行的图片
编辑器的源码在/project/Resources/ActionEditor/Script下面(不要看,暂时没有时间写注释)
<Scene><Sprite/></Scene>
这样地编写游戏场景树。并提供带语法高亮和Api自动补全功能的CodeEditor,项目地址:http://git.oschina.net/pig/CodeEditor
local layer = CCLayer()
layer:slots("TouchBegan", function() -- layer对象在C++实现内部引用了这个闭包对象
layer.opacity = 1.0 -- 在闭包对象中又引用了layer对象
return true
end)
-- 在当前的实现中,Lua的GC系统无法检测这样的循环引用。
-- 所以在使用完layer对象以后,需要手动调用layer:slots("TouchBegan", nil)
-- 来避免内存泄露。
目前针对这个问题暂时通过CCNode.cleanup
方法来解决。这个方法会在彻底移除一个节点对象的时候被触发调用,当它被调用的时候,这个C++对象所引用的所有Lua对象都会被清理一遍(回掉函数和存在Lua Userdata的环境表里的对象)。
node:removeChild(child)
会在移除节点后遍历它和它的子节点树,把每一个子对象都执行一遍cleanup方法。但是用node:removeChild(child, false)
的话就不会做对象的清理了。
我的QQ:405682409,请作说明,欢迎一起作技术讨论。
Another branch of Cocos2d-x with Lua derived from Cocos2d-x version 2.1rc0. Its target is to make a much easier framework for building a game. This branch provides simpler API interfaces, removes unnecessary features, addes features, improves the Lua binding codes and fixes Cocos2d-x bugs.
retain()
or release()
is needed for memory management). local layer = CCLayer()
layer:slots("TouchBegan", function() -- layer references closure to invoke it
layer.opacity = 1.0 -- closure references layer to access it
return true
end)
-- Currently in the implementation, the Lua GC system can`t detect
-- this kind of cicular reference. When you are done with the layer.
-- You may call layer:slots("TouchBegan", nil) manually to avoid
-- memory leak.
Now the problem is temporarily solved by CCNode.cleanup
method which removes all the Lua objects(callback functions, peer table) referenced by C++ object. And node:removeChild(child)
method which calls the cleanup functions for all of the removed subtree children, but node:removeChild(child, false)
won`t call these cleanup functions.
MIT
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )