现在的位置: 首页 > 综合 > 正文

cocos2dx-lua绑定之代码编辑器

2013年06月03日 ⁄ 综合 ⁄ 共 5986字 ⁄ 字号 评论关闭

转自:http://blog.csdn.net/wtyqm/article/details/9346863

享受脚本语言灵活、更新方便、免于编译的好处,但也不能忍受离开那些方便的IDE特性(跳转、自动完成)。

搜集整理了一些使用Sublime Text编辑cocos2dx-lua工程的资料,希望能给大家带来帮助。

一、自动完成(auto-completion)

A.输入过的单词

本文件内输入过的单词,ST(sublime text)均会给出补全提示。这点甚至比大多数IDE都要强(一般只给出符号提示,对于字符串这类纯文本不提示)

B.跨文件函数调用

跨文件的文本提示,ST需要插件支持。目前使用的一个插件MySignaturePlugin,支持跨文件的函数补全,提示参数信息。这个插件只有一个python源文件,100多行代码。原本只支持js。我对它进行了一些lua支持的小修改
cocos2dx-lua-tools / mysign.py

C.cocos2dx api,自定义API

脚本中经常会调用一些导出的cocos2dx api,或者我们自定义的一些c++扩展API

cocos2d_lua_snippets,这个插件通过cocos2dx的tolua++ pkg文件,生成了一堆ST snippet(代码片段),达到了自动提示API的目的

生成脚本 我对它也进行了一些修改:a.导出pkg文件里的枚举定义 b.非static函数,自动补全时,不补全类名

D.ST补全机制简介

以上的几种补全方法,充分利用了ST提供的补全扩展机制。ST补全时,会按以下次序考虑补全选项

a.snippet(代码片段):指定关键字到一大段代码的映射,每个snippet要存储为一个单独的文件。cocos2d_lua_snippets采用的是这种方式

b.API-injected completions:python插件里可以注册回调函数,返回可能的补全选项,可以有逻辑,更灵活一些。MySignaturePlugin采用的是这种方式

c.completion file:我理解就是用一个文件存储大量简短的snippet。我写的cocos2dx枚举值补全采用的是这种方式

d.buffer:就是ST自带的本文件单词补全

E.缺憾

以上的补全方法,都只是简单的文本级的匹配,无法像IDE对静态语言那样,进行语法分析后,根据当前上下文限制补全的内容。似乎动态语言的智能感知,本就比较困难,一个变量的类型,往往是运行时才可以知道,并且是可以变化的。

在一个讨论lua编辑器补全的帖子里,我看到一个Glider(一款商业lua IDE)员工的回帖。好像他们采用编辑器内置lua虚拟机的方式,可以实现更加强大的补全功能。

ST方面,更有潜力,更加强大的重量级插件有:

SublimeCodeIntel 、completion 

但是这两个插件目前都不支持lua,代码量也比较大,不太便于修改

同样是动态语言的js,这方面的支持就好得多,除了上面提到的SublimeCodeIntel,就连Visual Studio都提供了对js的智能感知。相比大量应用js的web开发,大量应用lua的游戏开发只能说是小弟弟了。若不是对精心设计的lua语言有好感,放不下它的coroutine机制,我想在cocos2dx里直接使用js绑定更加方便呢(几个zynga的老外全力搞js绑定,导致后起的js绑定在很多方面都已经领先lua绑定了)

二、跳转

这里推荐Sublime Text 3的跳转功能。除了继承二代的文件内符号跳转,三代更是加入了文件间符号跳转

感觉ST的符号跳转,比IDE的功能还要好用,全程键盘操作,预览-返回,谁用谁知道

不过ST3的文件间跳转似乎还不支持预览-返回

求助:

在github上看到好用的仓库,自己不确定会不会修改,一般会选择clone操作。但是这样万一以后修改了,不像fork那样,可以pull request,很难贡献代码。不管是否修改,直接fork的话,感觉又有些重度了。不知有没有其它的操作流程?

----------------------------------------------------------------------------------------------------------------------------------

3楼 Meteoric_cry 2013-07-29 18:01发表 [回复]
function ABC::aa()

end

输入ABC有提示"ABC::aa",但是输入回车后,ABC没有了,只输入aa

Re: wtyqm 2013-07-29 19:12发表 [回复]
回复Meteoric_cry:你指的是lua里自己定义的函数,还是cocos2dx的api?如果是后者的话,使用我修改后的插件,效果是static函数补全成类名:函数名的形式,非static函数只补全函数名
2楼 chinesetree2013 2013-07-18 20:15发表 [回复]
找了好久找到楼主这篇文章,很感动,在学习cocos2dx lua部分,找个好用的编辑器找的我好辛苦。
看了楼主的文章后,尝试了一下,跨文件调函数这个弄不起来,使用JS来弄也不行。希望楼主大哥说明的详细点

Re: wtyqm 2013-07-18 21:17发表 [回复]
回复u011446040:跨文件调用的那个插件,需要把你lua源代码的目录拖到ST里。然后存一下盘,它是每次存盘时,分析打开目录下所有文件里的函数签名的。还不行得话,可以view->show console,看看有没有什么错误发生

Re: chinesetree2013 2013-07-19 09:43发表 [回复]
回复wtyqm:感谢楼主回复。
cocos2d api 的自动补全 时有几点小疑惑:
1.比如CCDirector 这个关键字,必须使用大写打"CC"才能,打"cc" 则不会弹出补全提示,这种情况正常么?
2.获取visiblesize时,API的补全是 CCDirector:getVisibleSize()
这样运行起来会报错,正确的应该是CCDirector:sharedDirector():getVisibleSize(),而我输入“CCDirector_sh”后会补全成CCDirector:sharedDirector() 却没办法继续做补全。请问楼主使用时也是这种情况么?
3.cocos2dx的引擎常常更新,如何通过pkg生成snippet ,原理或者方法楼主可以分享一下么?

Re: wtyqm 2013-07-20 10:09发表 [回复]
回复u011446040:1.cocos2d api补全这个插件,使用的是snippet(代码片段)的方式。我试验了下,在ST里,代码片段是大小写敏感的。这样确实不太方便。我修改了下这个插件,采用completion-file的方式,这种方式是大小写不敏感的。
2.原版的插件,补全的结果总是"类名:函数名"的形式,我修改成static函数才这样输出,非static函数只输出函数名。对于您举得那个例子,先输入CCDirector_sh,补全成CCDirector:sharedDirector(),再手动输入冒号,再输入一些补全提示符(例如ccdgetvis),就可以继续补全了。这里输入"getvis"也可以,但因为是基于文本的补全,可能会补全到其它类里的方法,这个不知道有没有更好的方式?
3.这个插件主要是一个python脚本build.py,把它与cocos2dx目录下的tools/tolua++目录放到一起,然后运行这个脚本,生成的就是最新版的api了。
我修改这个插件也主要是修改build.py这个脚本和一些模板,你需要上面那些功能的话,可以到这个地址下载

https://github.com/wtyqm/cocos2dx-lua-tools

Re: chinesetree2013 2013-07-21 22:58发表 [回复]
回复wtyqm:楼主好人啊,根据楼主方法,现在跨文件调用补全函数这个功能可以正常作用了。
关于
1.补全忽略大小写
2.更加智能的补全cocos2dx api
3.cocos2dx api 引擎更新时获得最新的api
这3个功能的解决方法是否可以理解成只需要使用楼主修改过后的bulid.py 与 pkg文件重新生成一下。然后将所得到的替换
Sublime Text 2/Packages/cocos2d lua api 目录下的文件即可?

Re: wtyqm 2013-07-22 05:50发表 [回复]
回复u011446040:是的。从https://github.com/wtyqm/cocos2dx-lua-tools,拷贝build.py、三个template文件,从cocos2dx里拷贝最新的pkg文件,重新生成,再拷贝到ST目录里即可

Re: chinesetree2013 2013-07-22 18:12发表 [回复]
回复wtyqm:楼主给你反馈一个小BUG和建议。
根据楼主提供的方法,在snippets文件夹里面会生成
api.sublime-completions和enum.sublime-completions这2个文件使用这2个进行补全,不过在生成的文件末尾都多出了一个逗号,这导致补全功能的丧失,起初我手动删除这2个逗号,后重启ST,发现还是不行,看了一下,原来又重新运行了bulid.py导致那2个逗号又出现了。后来是去掉这个build.py 才能正常的补全,不过可以补全了还是很给力的。
另一个小问题是我用的是mac 系统自带python版本是2.7.2导致脚本里面一些参数无法识别,而升级自带python又很麻烦而且容易引起其他问题。

我的使用方式是:把楼主提供的build.py,template_completions_item.sublime-completions,template_completions.sublime-completions,template.sublime-snippet 放到ST里面,然后把最新的 tolua++也一起放入ST里面。然后运行python 脚本。

总的来说,楼主还是很给力的。十分感谢,就是关于反馈给你的这些小问题,如果楼主有时间也顺便优化掉吧。这样使用起来就会好很多。期待楼主的回复。

Re: wtyqm 2013-07-22 22:15发表 [回复]
回复u011446040:您说的逗号,是指api.sublime-completions文件里最后一个表项后面的逗号么?
我这里类似这个样子:
{ "trigger": "x", "contents": "x" },
]
}
不过在我的系统上(mac os x , st2\st3),是可以正常补全的。
我的使用方法是,在非st目录下生成补全文件,只把补全文件拷贝到st目录里。如果把build.py也拷贝过去的话,很可能导致每次启动ST都重新生成一遍补全文件,不知道有没有可能引起错误。
我的mac系统也是最近才安装python3.3的,直接从python官网下载安装包。安装后2.7.2和3.3可以并存。默认的python命令是2.72版本。终端窗口输入python3.3则是3.3版本。感觉升级还是很方便的。
您可以按我上面说的方式(补全文件外部生成,安装python3.3)试一下,如果还有逗号的问题,欢迎您把您那边的补全文件发给我,进一步确定问题

Re: chinesetree2013 2013-07-23 22:43发表 [回复]
回复wtyqm:根据楼主提示安装了python3.3.2很不错,不会和系统自带的冲突,2个版本并存。脚本都很顺利的在python3.3下运行起来了。
之前查了一些网上的,不少人说一些系统依赖于自带python,升级后怕引起一些不必要的麻烦。现在看了好像没这问题哈。

逗号指的是enum.sublime-completions和api.sublime-completions文件中的最后一行。
像这样有个逗号 ","
"kCCTextAlignmentRight",
]
}
如果不去除这个逗号貌似是格式错误,查阅了ST关于completions的格式上是这样的。这个地址http://sublimetext.info/docs/en/extensibility/completions.html
我使用的是ST2.不知道为什么我这里有逗号不能正常的补全。而楼主的却可以。我只有手动去掉逗号才能补全成功。
另外我不知道怎么发送文件。。。。

Re: wtyqm 2013-07-28 23:03发表 [回复]
回复u011446040:很抱歉很久才回复。最后一个逗号的问题,虽然不知道确切的原因,但我已经修改了build.py,去掉了这个逗号,欢迎试用。另外实际使用中有什么问题和改进,也可以随时交流。
我在实际使用中,感觉API的补全,容错性太强,会阻碍本文件内已输入单词补全的出现速度,有些不爽。

Re: chinesetree2013 2013-08-02 09:35发表 [回复]
回复wtyqm:嗯 。这几天也比较慢,刚刚有空。看到楼主回复修复了这个问题。去试试先。
是有些不爽,不过正常开发,这些功能算是足够了。
1楼 lihei12345 2013-07-18 12:26发表 [回复] [引用] [举报]
跟楼主一样,我之前也是fork,结果最后都删掉了,现在一般都是直接star。
另外,求老大能否将tolua++的原理再讲的更细节点,加上代码分析之类的。我最近刚接触cocos2d-x中,也想使用lua,但是由于不掌握原理还有刚接触游戏开发,不敢使用,想了解一下tolua++的绑定原理再开始使用,又功力不足。。。很纠结,求大哥帮忙写一下分析过程,跪谢

Re: wtyqm 2013-07-18 21:36发表 [回复] [引用] [举报]
回复lihei12345:看了下您介绍的star功能,似乎用来关注感兴趣的项目不错。
tolua++绑定原理的话,推荐您阅读下http://dualface.github.io/blog/2012/08/25/tolua-plus-plus-implement/
其实看明白Programming In Lua里,关于导出c函数到lua的章节后,tolua++的绑定原理还是很容易理解的。cocos2dx的lua绑定也比较成熟了,时间紧的话感觉可以先试着用,边用边加深理解吧

Re: lihei12345 2013-07-19 00:10发表 [回复] [引用] [举报]
回复wtyqm:楼主真是好人!以后一定要持续关注您的博客,加油!

抱歉!评论已关闭.