自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

開發(fā)憤怒的小鳥的Lua語言:Wax框架詳解(一)

原創(chuàng)
移動(dòng)開發(fā) iOS
我們都知道Objective-C和Cocoa語言可以開發(fā)iOS應(yīng)用,但是一年前,蘋果決定在iOS系統(tǒng)上使用Lua語言。Wax框架的想法很簡(jiǎn)單:凡是Objective-C能做的,Lua也能做!考慮使用像Lua這樣一門簡(jiǎn)單而高效的編程語言,構(gòu)建原生iPhone應(yīng)用程序有許多充分的理由,而本文將深入探討Wax具有的一些好處,同時(shí)演示把Lua與Xcode 4和iOS軟件開發(fā)工具包(SDK)集成起來必不可少的實(shí)際步驟。

【51CTO獨(dú)家譯文】2011年6月的編程語言排行榜Lua語言一軍突起,一舉進(jìn)入前十名。這與一年前蘋果決定在iOS系統(tǒng)上使用Lua語言密不可分。但是,你了解如何用Lua語言在iOS上開發(fā)應(yīng)用嗎?51CTO將向各位介紹Lua語言的iOS應(yīng)用開發(fā)框架——Wax,其中在iOS平臺(tái)上無比火爆的《憤怒的小鳥》就是由Lua語言用Wax開發(fā)的。全文共分兩部分,***部分51CTO將帶您深入探討Wax具有的一些好處,同時(shí)演示把Lua與Xcode 4和iOS軟件開發(fā)工具包(SDK)集成起來必不可少的實(shí)際步驟。第二部分51CTO將逐步介紹如何用Wax構(gòu)建一個(gè)簡(jiǎn)單的應(yīng)用程序,顯示Twitter上的當(dāng)前趨勢(shì)話題列表,可以用按鈕來更新內(nèi)容。

Wax框架及憤怒的小鳥

Wax是什么?

Wax for iPhone這種框架在開發(fā)時(shí),旨在把Lua腳本語言和原生Objective-C應(yīng)用編程接口(API)結(jié)合起來。這意味著,你可以從Lua里面,使用任何和全部的Objective-C類及框架。

從技術(shù)上來講,Wax結(jié)合了Objective-C類和原生C代碼。Lua語言嵌入了C語言,然后Objective-C類并入到其中。

為什么使用Wax?

Wax是免費(fèi)的、開源的。與其他一些基于Lua的移動(dòng)開發(fā)解決方案不同,Wax是個(gè)開源框架,只需要你花一點(diǎn)點(diǎn)時(shí)間就可以上手,不需要花錢。不喜歡Wax的工作方式,或者發(fā)現(xiàn)實(shí)施方面的缺陷?源代碼可免費(fèi)獲取,你總是可以改動(dòng)源代碼,以滿足自己的需要。

可以利用原生API。這意味著,為教Objective-C而編寫的教程很容易由Lua for Wax來改動(dòng)和編寫。這還意味著,你的應(yīng)用程序在外觀感覺上總是如同原生應(yīng)用程序,不過又得到了用Lua這種高效腳本語言編寫代碼可以節(jié)省時(shí)間的好處。

可以使用Xcode。這意味著,模擬器和設(shè)備部署都輕而易舉,不會(huì)輕易與未來的iOS版本決裂。

可以利用所有現(xiàn)有的Objective-C庫(kù)。如果你有一個(gè)Objective-C類是以前編寫的,不需要改動(dòng),就可以將它用在Lua中——只要把它放入到Xcode。Three20之類的庫(kù)也是一樣。只要按照正常指令來添加庫(kù),就可以使用Lua代碼訪問它們。

可以利用Wax Lua模塊。Wax有幾個(gè)內(nèi)置的Lua模塊,使得異步HTTP請(qǐng)求和JavaScript對(duì)象標(biāo)注(JSON)創(chuàng)建/解析極其容易而快速(因?yàn)槟K是用C編寫的)。

沒必要管理內(nèi)存。不再需要操心內(nèi)存分配之類的事務(wù)。Wax為你處理這一切。

Lua類型自動(dòng)轉(zhuǎn)換成對(duì)應(yīng)的Objective-C類型,反之亦然。 這意味著,如果你調(diào)用了需要NSString和NSInteger的某個(gè)方法,但傳送了Lua字符串和Lua整數(shù),Wax會(huì)為你搞定轉(zhuǎn)換工作。這種轉(zhuǎn)換功能強(qiáng)大,甚至可以處理復(fù)雜的Objective-C特性,比如選擇器。

你可以利用所有上述特性。不需要精挑細(xì)選。你獲得所有特性!#p#

OK,實(shí)在太棒了!我該如何安裝Wax?

首先你需要Xcode和iPhone SDK。要是你還沒有這些東西,趕緊弄一份!

用Xcode創(chuàng)建項(xiàng)目

我們先創(chuàng)建一個(gè)新的“基于Windows的項(xiàng)目”,名為“WaxApplication”。別忘了把設(shè)備設(shè)置成iPhone:

WaxApplication

WaxApplication

通過Finder瀏覽到你保存該項(xiàng)目的文件夾。創(chuàng)建三個(gè)新的文件夾:wax、scripts和Classes。你的文件夾看起來應(yīng)該像這樣:

通過Finder瀏覽到你保存該項(xiàng)目的文件夾

設(shè)置Wax(***部分,處理文件)

首先,下載源代碼的壓縮包。Wax放在GitHub上(https://github.com/probablycorey/wax),那樣下載源代碼就很容易。從這里下載壓縮包。

現(xiàn)在,解壓縮剛下載的文件。瀏覽到剛解壓縮的文件夾。它會(huì)有“probablycorey-wax-124ca46”之類的名稱。

你的屏幕現(xiàn)在看起來應(yīng)該像這樣:

解壓縮剛下載的文件

現(xiàn)在,執(zhí)行下列操作:

◆拷貝lib和bin文件夾,把它們粘貼到位于WaxApplication項(xiàng)目文件夾里面的wax文件夾。

◆將xcode-template/Classes/ProtocolLoader.h拷貝到WaxApplication項(xiàng)目文件夾。

◆拷貝xcode-template/scripts/文件夾,將它放到WaxApplication項(xiàng)目文件夾里面。

◆打開WaxApplication項(xiàng)目文件夾里面的wax/lib/extensions/文件夾。刪除SQLite和xml文件夾,下圖所示:

你的屏幕

你的屏幕應(yīng)該看起來像這樣:

設(shè)置Wax(第二部分,配置項(xiàng)目)

現(xiàn)在用Finder選擇Classes、scripts和wax文件夾,把它們拖入到Xcode項(xiàng)目中。把它們放到顯示“Wax Application”和“1 target, iOS SDK X.X”的那個(gè)條下方。不要勾選顯示“Copy items into destination group’s folder(if needed)”的復(fù)選框。點(diǎn)擊完成。

現(xiàn)在點(diǎn)擊顯示“Wax Application”和“1 target, iOS SDK 4.3”的那個(gè)條。接著采取下列步驟:

◆在右邊窗格中,尋找“Targets”標(biāo)題,點(diǎn)擊“WaxApplication”。點(diǎn)擊“Build Phases”(構(gòu)建階段)選項(xiàng)卡。點(diǎn)擊“Copy Bundle Resources”(復(fù)制捆綁資源),清除所有l(wèi)ua文件。

◆在右下角,先點(diǎn)擊“Add Build Phase”(添加構(gòu)建階段),再點(diǎn)擊“Add Run Script”(添加運(yùn)行腳本)。

◆將Shell設(shè)成/bin/zsh

◆將Shell下面的文本區(qū)域設(shè)成“$PROJECT_DIR/wax/lib/build-scripts/copy-scripts.sh”。

你的屏幕現(xiàn)在看起來像這樣:

打開main.m

改動(dòng)main.m

在左邊窗格中,打開名為“WaxApplication”的文件夾。接下來,打開“Supporting Files”文件夾。接著,打開main.m,把文件的內(nèi)容換成如下:

  1. / /這是發(fā)生奇跡的地方! 
  2. // Wax并不使用nib文件來裝入主視圖,一切在AppDelegate.lua文件里面完成 
  3. #import <UIKit/UIKit.h>    
  4. #import "wax.h"  
  5. #import "wax_http.h"  
  6. #import "wax_json.h"  
  7. #import "wax_filesystem.h"    
  8. int main(int argc, char *argv[]) {      
  9. NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];      
  10.  
  11. wax_start("AppDelegate.lua", luaopen_wax_http, luaopen_wax_json, luaopen_wax_filesystem, nil);  
  12.  
  13. int retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate");  
  14. [pool release]; 
  15. return retVal;  
  16. }  

別忘了保存文件!

刪除不必要的文件

刪除MainWindow.xib、WaxApplicationAppDelegate.h和WaxApplicationAppDelegate.m三個(gè)文件。打開“WaxApplication/Supporting Files/WaxPallication-Info.plist”,然后刪除鍵是“Main nib file base name”的那一行。#p#

測(cè)試安裝的Wax

按⌘↵(命令+回車鍵),或者按左上角的“Run”,就可以在模擬器中運(yùn)行應(yīng)用程序。要是一切正常,你會(huì)看到一個(gè)簡(jiǎn)單的應(yīng)用程序會(huì)說“Hello Lua!”。

要是你沒看到這個(gè)消息,檢查之前的步驟,看看有沒有步驟漏了。

查看Lua

展開Scripts文件夾,打開AppDelegate.lua。你會(huì)看到運(yùn)行該應(yīng)用程序的Lua代碼。

你可能會(huì)先注意到,沒有語法高亮。遺憾的是,對(duì)于Xcode中的Lua語法高亮問題,我還沒有發(fā)現(xiàn)穩(wěn)定的解決方案(是你發(fā)現(xiàn)了,請(qǐng)留言告訴我!)。

接下來你可能會(huì)注意到,沒有方括號(hào),不過使用了像UIScreen和UIWindow這些類。那是由于你在使用Lua構(gòu)建一個(gè)AppDelegate類;在蘋果和蘋果的代碼看來,你在使用Objective-C、構(gòu)建Objective-C類!

方法名稱

你可能還注意到奇怪的方法名稱“colorWithRed_green_blue_alpha”。要是你熟悉Objective-C,就知道方法名稱可以有冒號(hào)。Lua中的函數(shù)名稱不能有冒號(hào)。為了補(bǔ)償這個(gè)差異,凡是Objective-C中隔開方法名稱的地方,在Lua中都換成下劃線。比如說:

Objective-C中的colorWithRed:green:blue:alpha對(duì)應(yīng)于Lua中的colorWithRed_green_blue_alpha。

Objective-C 中的selectRowAtIndexPath:animated:scrollPosition:對(duì)應(yīng)于Lua中的selectRowAtIndexPath_animated_scrollPosition

面向?qū)ο蟮哪P?/strong>

Lua的另一個(gè)問題是,它沒有像Objective-C那樣的繼承體系。Lua中根本沒有類。為了克服這個(gè)問題,Wax突出顯示了放在每個(gè)Wax Lua文件最前面的一個(gè)函數(shù):waxClass。在默認(rèn)的AppDelegate.lua中,這一行看起來像這樣:

  1. waxClass{"AppDelegate", protocols = {"UIApplicationDelegate"}}  

想通過Lua創(chuàng)建一個(gè)Objective-C類,就要使用waxClass{“CLASS NAME”, “PARENT_CLASS”}這個(gè)函數(shù)。你添加到該Lua文件的所有之后的函數(shù)(在同一個(gè)文件里面)都會(huì)作為實(shí)例方法,自動(dòng)添加到新的類。

AppDelegate.lua的這一行顯示,還可以定義你的“類”定義哪些協(xié)議。

雖然waxClass解決了定義Objective-C可以使用的類這個(gè)問題,但還是存在一個(gè)問題:由于Lua沒有類,它沒有像Objective-C那樣的動(dòng)態(tài)“自”變量。為了克服這個(gè)問題,Wax自動(dòng)將每個(gè)方法的***個(gè)變量作為類的當(dāng)前實(shí)例。你可以發(fā)現(xiàn),當(dāng)你查看AppDelegate.lua中的“applicationDidFinishLaunching”時(shí),***個(gè)變量是“自”變量,即使Objective-C版的這個(gè)方法只有1個(gè)變量。然而,如果你非得將類的當(dāng)前實(shí)例作為每個(gè)方法的***個(gè)變量來傳送,就會(huì)很煩人,于是添加了一些語法上的便利(syntactical sugar)。不是使用“.”操作符在Lua中進(jìn)行“方法”調(diào)用,而是使用了“:”操作符:

  1. local view = UIView.initWithFrame(CGRect(0, 0, 100, 100)) 

--以下一模一樣

  1. view:addSubview(someView)  
  2. iew.addSubview(view, someView)  

值得一提的另一個(gè)重要方面是,Wax不支持Objective-C屬性。Wax迫使Lua和Objective-C只與方法進(jìn)行聯(lián)系。

-- 這不行

  1. someView.frame  

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

  1. View:frame() some 
  2. View:setFrame(someFrame)  

只用于Lua的變量

你可以使用點(diǎn).操作符,為任何Objective-C對(duì)象創(chuàng)建成員變量。不像冒號(hào):操作符(用于對(duì)Objective-C類/實(shí)例調(diào)用方法),點(diǎn).操作符可以針對(duì)對(duì)象的Lua方面,動(dòng)態(tài)創(chuàng)建成員變量(對(duì)象的Objective-C方面對(duì)這些變量一無所知)。在對(duì)象的生命周期之內(nèi),都可以使用成員變量。

輸出到控制臺(tái)

AppDelegate.lua還顯示了你如何可以編寫調(diào)試文本、輸出到控制臺(tái)。你可以使用函數(shù)“puts”。

內(nèi)存管理

我之前說過,使用Lua的話,你根本沒必要分配、保留和釋放內(nèi)存。你在調(diào)用任何初始化器之前,根本不需要調(diào)用內(nèi)存分配。實(shí)際上,如果你這么做的話,程序可能會(huì)出現(xiàn)內(nèi)存泄漏。

太棒了!接下來做什么?

你已經(jīng)深入了解了專門針對(duì)Wax的Lua的基本知識(shí),就可以準(zhǔn)備編寫iPhone應(yīng)用程序了!

這個(gè)教程的第二個(gè)部分,我們將只用幾行Lua,就可以編寫出擁有刷新按鈕的一個(gè)Twitter示例應(yīng)用程序。

看完這個(gè)教程是不是你也有信心打造出自己的《憤怒的小鳥》呢?

小貼士

Lua程序設(shè)計(jì)語言 是一個(gè)簡(jiǎn)潔、輕量、可擴(kuò)展的腳本語言。Lua讀作/'lua/(嚕啊),是葡萄牙語中"Luna"(月亮)的意思。

Lua是一種輕量語言,它的官方版本只包括一個(gè)精簡(jiǎn)的核心和最基本的庫(kù)。這使得Lua體積小、啟動(dòng)速度快。它用標(biāo)準(zhǔn)C語言編寫并以源代碼形式開放,編譯后僅僅一百余K,可以很方便的嵌入別的程式里。和許多"大而全"的語言不一樣,網(wǎng)路通訊、圖形界面等都沒有默認(rèn)提供。但是Lua可以很容易地被擴(kuò)展:由宿主語言(通常是C或C++)提供這些功能,Lua可以使用它們,就像是本來就內(nèi)置的功能一樣。事實(shí)上,現(xiàn)在已經(jīng)有很多成熟的擴(kuò)展模塊可供選用。

Lua的目標(biāo)是成為一個(gè)很容易嵌入其它語言中使用的語言。大多數(shù)程序員也認(rèn)為它的確做到了這一點(diǎn)。

很多應(yīng)用程序使用Lua作為自己的嵌入式腳本語言,以此來實(shí)現(xiàn)可配置性、可擴(kuò)展性。這其中包括大話西游II、仙境傳說、魔獸世界、戰(zhàn)錘40k、博德之門、軒轅劍外傳漢之云等,在移動(dòng)領(lǐng)域***的便是《憤怒的小鳥》。

責(zé)任編輯:佚名 來源: 51CTO
相關(guān)推薦

2011-06-21 09:28:52

Wax下載WaxLua語言

2011-06-22 13:13:33

Lua

2012-08-29 09:50:05

憤怒的小鳥免費(fèi)

2011-09-06 14:26:26

2013-12-08 20:32:32

WaxLua

2011-05-04 10:53:46

打印機(jī)技巧

2011-05-16 13:46:56

Angry Monst憤怒的小鳥父子開發(fā)組合

2012-03-23 09:29:51

憤怒的小鳥:太空Windows Pho

2012-03-14 08:54:27

Flash

2012-08-31 16:58:37

2014-04-15 15:37:31

憤怒的小鳥信息泄露

2011-05-23 08:59:36

憤怒的小鳥Rovio

2011-06-16 09:07:24

憤怒的小鳥NFC

2012-02-29 09:42:25

2012-03-09 17:26:07

憤怒的小鳥憤怒的小鳥太空版

2012-12-11 15:33:52

2011-05-19 10:34:47

Windows Pho微軟諾基亞

2012-06-14 14:42:42

JavaScript

2012-11-23 09:15:11

憤怒的小鳥

2011-04-22 10:26:04

憤怒的小鳥移動(dòng)游戲
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)