天天看点

ios开发愤怒的小鸟的Lua语言:Wax框架详解

ios开发愤怒的小鸟的Lua语言:Wax框架详解

  wax是什么?

  wax for iphone这种框架在开发时,旨在把lua脚本语言和原生objective-c应用编程接口(api)结合起来。这意味着,你可以从lua里面,使用任何和全部的objective-c类及框架。

  从技术上来讲,wax结合了objective-c类和原生c代码。lua语言嵌入了c语言,然后objective-c类并入到其中。

  为什么使用wax?

  wax是免费的、开源的。与其他一些基于lua的移动开发解决方案不同,wax是个开源框架,只需要你花一点点时间就可以上手,不需要花钱。不喜欢wax的工作方式,或者发现实施方面的缺陷?源代码可免费获取,你总是可以改动源代码,以满足自己的需要。

  可以利用原生api。这意味着,为教objective-c而编写的教程很容易由lua for wax来改动和编写。这还意味着,你的应用程序在外观感觉上总是如同原生应用程序,不过又得到了用lua这种高效脚本语言编写代码可以节省时间的好处。

  可以使用xcode。这意味着,模拟器和设备部署都轻而易举,不会轻易与未来的ios版本决裂。

  可以利用所有现有的objective-c库。如果你有一个objective-c类是以前编写的,不需要改动,就可以将它用在lua中——只要把它放入到xcode。three20之类的库也是一样。只要按照正常指令来添加库,就可以使用lua代码访问它们。

  可以利用wax lua模块。wax有几个内置的lua模块,使得异步http请求和javascript对象标注(json)创建/解析极其容易而快速(因为模块是用c编写的)。

  没必要管理内存。不再需要操心内存分配之类的事务。wax为你处理这一切。

  lua类型自动转换成对应的objective-c类型,反之亦然。 这意味着,如果你调用了需要nsstring和nsinteger的某个方法,但传送了lua字符串和lua整数,wax会为你搞定转换工作。这种转换功能强大,甚至可以处理复杂的objective-c特性,比如选择器。

  你可以利用所有上述特性。不需要精挑细选。你获得所有特性!

 ok,实在太棒了!我该如何安装wax?

  首先你需要xcode和iphone sdk。要是你还没有这些东西,赶紧弄一份!

  用xcode创建项目

  我们先创建一个新的“基于windows的项目”,名为“waxapplication”。别忘了把设备设置成iphone:

ios开发愤怒的小鸟的Lua语言:Wax框架详解
ios开发愤怒的小鸟的Lua语言:Wax框架详解

  通过finder浏览到你保存该项目的文件夹。创建三个新的文件夹:wax、scripts和classes。你的文件夹看起来应该像这样:

ios开发愤怒的小鸟的Lua语言:Wax框架详解

  设置wax(第一部分,处理文件)

  首先,下载源代码的压缩包。wax放在github上(https://github.com/probablycorey/wax),那样下载源代码就很容易。从这里下载压缩包。

  现在,解压缩刚下载的文件。浏览到刚解压缩的文件夹。它会有“probablycorey-wax-124ca46”之类的名称。

  你的屏幕现在看起来应该像这样:

ios开发愤怒的小鸟的Lua语言:Wax框架详解

  现在,执行下列操作:

  ◆拷贝lib和bin文件夹,把它们粘贴到位于waxapplication项目文件夹里面的wax文件夹。

  ◆将xcode-template/classes/protocolloader.h拷贝到waxapplication项目文件夹。

  ◆拷贝xcode-template/scripts/文件夹,将它放到waxapplication项目文件夹里面。

  ◆打开waxapplication项目文件夹里面的wax/lib/extensions/文件夹。删除sqlite和xml文件夹,下图所示:

ios开发愤怒的小鸟的Lua语言:Wax框架详解

  你的屏幕应该看起来像这样:

ios开发愤怒的小鸟的Lua语言:Wax框架详解

  设置wax(第二部分,配置项目)

  现在用finder选择classes、scripts和wax文件夹,把它们拖入到xcode项目中。把它们放到显示“wax application”和“1 target, ios sdk x.x”的那个条下方。不要勾选显示“copy items into destination group’s folder(if needed)”的复选框。点击完成。

  现在点击显示“wax application”和“1 target, ios sdk 4.3”的那个条。接着采取下列步骤:

  ◆在右边窗格中,寻找“targets”标题,点击“waxapplication”。点击“build phases”(构建阶段)选项卡。点击“copy bundle resources”(复制捆绑资源),清除所有lua文件。

  ◆在右下角,先点击“add build phase”(添加构建阶段),再点击“add run script”(添加运行脚本)。

  ◆将shell设成/bin/zsh

  ◆将shell下面的文本区域设成“$project_dir/wax/lib/build-scripts/copy-scripts.sh”。

  你的屏幕现在看起来像这样:

ios开发愤怒的小鸟的Lua语言:Wax框架详解

  改动main.m

  在左边窗格中,打开名为“waxapplication”的文件夹。接下来,打开“supporting files”文件夹。接着,打开main.m,把文件的内容换成如下:

/ /这是发生奇迹的地方! 

// wax并不使用nib文件来装入主视图,一切在appdelegate.lua文件里面完成 

#import <uikit/uikit.h>    

#import "wax.h"  

#import "wax_http.h"  

#import "wax_json.h"  

#import "wax_filesystem.h"    

int main(int argc, char *argv[]) {      

nsautoreleasepool * pool = [[nsautoreleasepool alloc] init];      

wax_start("appdelegate.lua", luaopen_wax_http, luaopen_wax_json, luaopen_wax_filesystem, nil);  

int retval = uiapplicationmain(argc, argv, nil, @"appdelegate");  

[pool release]; 

return retval;  

}  

  别忘了保存文件!

  删除不必要的文件

  删除mainwindow.xib、waxapplicationappdelegate.h和waxapplicationappdelegate.m三个文件。打开“waxapplication/supporting files/waxpallication-info.plist”,然后删除键是“main nib file base name”的那一行。

 测试安装的wax

  按⌘↵(命令+回车键),或者按左上角的“run”,就可以在模拟器中运行应用程序。要是一切正常,你会看到一个简单的应用程序会说“hello lua!”。

  要是你没看到这个消息,检查之前的步骤,看看有没有步骤漏了。

  查看lua

  展开scripts文件夹,打开appdelegate.lua。你会看到运行该应用程序的lua代码。

  你可能会先注意到,没有语法高亮。遗憾的是,对于xcode中的lua语法高亮问题,我还没有发现稳定的解决方案(是你发现了,请留言告诉我!)。

  接下来你可能会注意到,没有方括号,不过使用了像uiscreen和uiwindow这些类。那是由于你在使用lua构建一个appdelegate类;在苹果和苹果的代码看来,你在使用objective-c、构建objective-c类!

  方法名称

  你可能还注意到奇怪的方法名称“colorwithred_green_blue_alpha”。要是你熟悉objective-c,就知道方法名称可以有冒号。lua中的函数名称不能有冒号。为了补偿这个差异,凡是objective-c中隔开方法名称的地方,在lua中都换成下划线。比如说:

  objective-c中的colorwithred:green:blue:alpha对应于lua中的colorwithred_green_blue_alpha。

  objective-c 中的selectrowatindexpath:animated:scrollposition:对应于lua中的selectrowatindexpath_animated_scrollposition

  面向对象的模型

  lua的另一个问题是,它没有像objective-c那样的继承体系。lua中根本没有类。为了克服这个问题,wax突出显示了放在每个wax lua文件最前面的一个函数:waxclass。在默认的appdelegate.lua中,这一行看起来像这样:

waxclass{"appdelegate", protocols = {"uiapplicationdelegate"}}  

  想通过lua创建一个objective-c类,就要使用waxclass{“class name”, “parent_class”}这个函数。你添加到该lua文件的所有之后的函数(在同一个文件里面)都会作为实例方法,自动添加到新的类。

  appdelegate.lua的这一行显示,还可以定义你的“类”定义哪些协议。

  虽然waxclass解决了定义objective-c可以使用的类这个问题,但还是存在一个问题:由于lua没有类,它没有像objective-c那样的动态“自”变量。为了克服这个问题,wax自动将每个方法的第一个变量作为类的当前实例。你可以发现,当你查看appdelegate.lua中的“applicationdidfinishlaunching”时,第一个变量是“自”变量,即使objective-c版的这个方法只有1个变量。然而,如果你非得将类的当前实例作为每个方法的第一个变量来传送,就会很烦人,于是添加了一些语法上的便利(syntactical

sugar)。不是使用“.”操作符在lua中进行“方法”调用,而是使用了“:”操作符:

local view = uiview.initwithframe(cgrect(0, 0, 100, 100)) 

  --以下一模一样

view:addsubview(someview)  

iew.addsubview(view, someview)  

  值得一提的另一个重要方面是,wax不支持objective-c属性。wax迫使lua和objective-c只与方法进行联系。

  -- 这不行

someview.frame  

  -- 你而是需要使用getter/setter方法

view:frame() some 

view:setframe(someframe)  

  只用于lua的变量

  你可以使用点.操作符,为任何objective-c对象创建成员变量。不像冒号:操作符(用于对objective-c类/实例调用方法),点.操作符可以针对对象的lua方面,动态创建成员变量(对象的objective-c方面对这些变量一无所知)。在对象的生命周期之内,都可以使用成员变量。

  输出到控制台

  appdelegate.lua还显示了你如何可以编写调试文本、输出到控制台。你可以使用函数“puts”。

  内存管理

  我之前说过,使用lua的话,你根本没必要分配、保留和释放内存。你在调用任何初始化器之前,根本不需要调用内存分配。实际上,如果你这么做的话,程序可能会出现内存泄漏。

  太棒了!接下来做什么?

  你已经深入了解了专门针对wax的lua的基本知识,就可以准备编写iphone应用程序了!

  在这个教程的第二个部分,我们将只用几行lua,就可以编写出拥有刷新按钮的一个twitter示例应用程序。

  看完这个教程是不是你也有信心打造出自己的《愤怒的小鸟》呢?

  小贴士

  lua程序设计语言 是一个简洁、轻量、可扩展的脚本语言。lua读作/'lua/(噜啊),是葡萄牙语中"luna"(月亮)的意思。

  lua是一种轻量语言,它的官方版本只包括一个精简的核心和最基本的库。这使得lua体积小、启动速度快。它用标准c语言编写并以源代码形式开放,编译后仅仅一百余k,可以很方便的嵌入别的程式里。和许多"大而全"的语言不一样,网路通讯、图形界面等都没有默认提供。但是lua可以很容易地被扩展:由宿主语言(通常是c或c++)提供这些功能,lua可以使用它们,就像是本来就内置的功能一样。事实上,现在已经有很多成熟的扩展模块可供选用。

  lua的目标是成为一个很容易嵌入其它语言中使用的语言。大多数程序员也认为它的确做到了这一点。

  很多应用程序使用lua作为自己的嵌入式脚本语言,以此来实现可配置性、可扩展性。这其中包括大话西游ii、仙境传说、魔兽世界、战锤40k、博德之门、轩辕剑外传汉之云等,在移动领域最著名的便是《愤怒的小鸟》。

继续阅读