2010/3/22

Corona SDK - File I/O 檔案讀寫


在local端 進行檔案讀寫的動作。


先看一下完成後的介面:


由於File 存取必在實機上才能作用,所以我在畫面上半部弄了一個trace box,把一些測試用的訊號印出來看。

中間一條輸入框 input_txt ,給User隨便打字用,打完可存進檔案中

下方三個按鈕:
-Save 會把input_txt中的文字,及一串亂數數字,存進data.txt中
-Clear,會把data.txt中的內容清除,並寫上新的資料"new file, 00000"
-Remove,把data.txt這個檔案刪除掉。

範例code:


利用 file = io.open( path, mode )
即可開出檔案,mode主要有三種"r","w","a"
r : 只做讀取
w : 寫新檔(如果檔案不存在,下w就會建出一個新檔;若本來已有這個檔案,新寫的會覆蓋舊的)
a : 追加 (新寫的內容會加在原來舊資料之後)
另外還有"r+","w+","a+" 三種,但我實際試了一下,還找不出差異性在哪…以後再研究了。
在mode之後也可再加個"b",啟動binary模式,例如"rb", "wb" 這樣



要逐行把資料讀出,可用以下的寫法


要把table的東西逐行寫入檔案,則用以下的寫法


2010/3/18

Corona SDK - PHP+MySQL


我只是想弄個排行榜啊…


簡單測試一下如何上傳資料到PHP+MySQL的server上。
註:這邊只用最簡便的方式,以webPopup開網頁來與php溝通,所以應用層面有限。若要不透過網頁直接溝通的話,就再研究LuaSocket那部份的文件了。

首先先弄好介面:

.分數下面有個Random button,按了之後會亂數出現分數。做為等下要上傳用的成績。
.接下來是user自行輸入id,按Submit後,會連scroe及id一起上傳
.最下面有個High score是看成績用的。



main.lua:


上面可以看到,按submit之後,就會開webPopup連 "addData.php?id=xxxx&score=12345" 來上傳成績,成功的話,會出現網頁:

頁面下方的Close按鈕可關閉webPopup,注意看該button的html code




寫資料沒問題後,接著是讀資料。一樣用PHP把資料呈現出來


php code:


2010/3/17

Corona SDK - Misc. 雜項筆記


寫著寫著,偶爾會發現一些語法或邏輯上的小重點,單獨寫一篇不太像樣,所以集中整理於本篇。



動態取名
在AS上,會用_root["mc_"+i]類似這樣的方式動態取對象名稱。在Corona裏則是_G["mc_"..i]這樣的寫法
(_G類似於_root,而有沒有this, parent這類的,我還沒試過)



function裏用到的所有變數需先宣告好
例如以下


buttonHandler裏用到了label_1,但label_1的宣告是在buttonHandler之後,這樣寫的話仍可正常build出程式,也能執行,但到了buttonHandler裏的label_1.text=event.phase就會有問題了,自這行之後的code就都會沒有作用。
發生此問題時會一直找不到錯誤,因為build code都顯示為正常。所以要改成:




native.newTextField listener補充
1.1的文件上對TextField只提到有listener,但未對listener的用法加以說明。
其listener可得到三種事件:began, submitted, ended,用法如下:




math.random()在device上測試時的問題
math.random()放到device上測試時,會發生一直取到一樣數字的問題。
例如我們下 math.random(10000),並寫一個button,每按一下就執行一次math.random(10000),把結果秀在畫面上。
在simulator上,都會正常地出現不規則的亂數。但在device上,就會依序出現1,1316, 7557, 4587, 5328....
就此看來似乎是沒什麼問題,但關掉app再開後,卻發現仍然是1,1316, 7557, 4587, 5328....
不論試幾次都是一樣的結果。

要解此問題,需在使用math.random之前,先用一次
math.randomseed( os.time() )
(*在程式開始處設定一次即可)

看起來似乎是設定不同的randomseed,才能得到不同的亂數,所以官方回筈是說用os.time()可讓app每次得到不同的randomseed。
就我實際測來,確實有改善問題,每次能得到不同的亂數。但時間相近時,卻會得到"相近"的亂數…
例如現在測第一次math.random(10000)得到"5884",關掉app後馬上打開再測,會得到"5889"
猜想是os.time()得到的數字相近的結果。這點暫時看來無解…不過至少這樣的math.random()還能堪用就是了…



關於for loop

lua也有類似於AS的for(var i in obj)的用法。不過目前我只於table中使用,其他的object是否也能使用,就要再試試看了。lua的寫法如下

上面i會是index名稱,k則是內容的值,也就是tb[i]的內容。(index會從1開始)

除了ipairs外,也可以用pairs,兩者差別請看下面的code

用pairs的話,會依序print出 1,2,3,4,a
用ipairs的話,只會print出 1,2,3,4 也就是只有index為integer的東西
就視狀況看要用哪一種了。


2010/3/12

Corona SDK - Accelerometer


Accelerometer重力加速計,也就是一般俗稱的G-sensor

Corona SDK所提供的Accelerometer十分週全,並非只有三個重力計的指數而已。(不像某知名品牌… XD)
主要由兩種event取得
.orientation
.accelerometer


Orientation比較單純,是當手機擺放角度改變時,才會通知,適合用在像瀏灠器轉向時,網頁自動轉面的這種應用。Orientation可從event.type得知目前手機被擺成哪一面,共有六種可能性:
.portrait
.landscapeLeft
.portraitUpsideDown
.landscapeRight
.faceUp
.faceDown
範例


注意:faceUp, faceDown這兩種要在實機上能得到。


Accelerometer則是隨時監聽所有的變化,能取得sensor所有數值

.event.xGravity -- x軸重力值,範圍 1至-1
.event.yGravity -- y軸重力值
.event.zGravity -- z軸重力值

.event.xInstant -- x軸瞬間加速值,範圍 1至-1
.event.yInstant -- y軸瞬間加速值
.event.zInstant -- z軸瞬間加速值
.event.isShake -- 搖動,以true/false表示
x, y, zGravity比較單純,就是看手機目前的傾斜狀況來反映
x, y, zInstant則是瞬間加速值,平常得到的值都很小,但當手機有快速晃動、甩動時,才會表現出來

範例:

注意:Accelerometer及native.newTextBox要在實機上能作用。

補充:system.setAccelerometerInterval是sensor靈敏度之設定,可設10~100,數字愈大靈敏度愈高。需注意有時設太高會跑不動(app直接跳掉)


做一個小球滾來滾去的範例:




2010/3/11

Corona SDK - StatusBar


Corona SDK可對系統StatusBar做控制

StatusBar的控制要用display.setStatusBar( 模式 )這個指令來達成
而模式有四種可以設
. display.HiddenStatusBar 隱藏,要做fullscreen app就要設這個
. display.DefaultStatusBar 白色款
. display.TranslucentStatusBar 半透明款
. display.DarkStatusBar 黑色款

以下範例用四個按鈕來切換不同的StatusBar款式


Corona SDK - Alert & Activity Indicator


native Alert 視窗及Activity Indicator控制
(*Activity Indicator就是平常loading時那個旋轉小菊花符號)


Alert
在Corona裏用native.showAlert就可以叫出系統的Alert視窗了


要注意是按鈕設定是以 { } 把要加的按鈕加進去(不限定二個)。

實際範例如下

這邊要注意的是加按鈕用的table,如上面的code中 {"取消", "好" }, 在Simulator中出現的樣子會是

按鈕是由右至左排列,但在實機上則是

實機是由左至右排列,與Simulator上是相反的,這點需要稍微注意一下。

在Corona裏Alert的設定邏輯是,不論按哪個按鈕,都會關閉視窗,並執行我們指定給它的function,如上範例則為"onComplete"這個function

在onComplete裏可從event.index取得被按到的按鈕index(從1開始),藉此可去設定不同的後續動作。

除了等user按按鈕外,也有指令可立即把Alert關閉掉

上面範例會在5秒後自動把Alert關閉掉,在此可順便看到onComplete中取得的event.action,若為"clicked"則表示是user按了某按鈕;若為"cancelled",則表示是由native.cancelAlert(alert)來關閉的


Activity Indicator

Activity Indicator的控制只有"顯示"、"隱藏"兩種設定,用native.setActivityIndicator(true/false)來達成

以下範例為一開始時出現Activity Indicator,在5秒後自動消失


Corona SDK - Button Event




Corona SDK的button基本操作很簡單,大致上只有PressRelease兩個Event,這是基於Corona SDK 提供的ui library中的Button 物件。

從Sample code裏找到ui.lua這個檔,copy到你的project目錄中,並在你 的main.lua裏第一行寫

之後便能調用Button物件,如下

從上面的code可看到, 在newButton時,設定default, over兩個圖,它就會自動做按下、放開換圖的動作,連mouseOut也會換圖。(但沒有mouseOver)
onPress=onRelease=則可指定兩個function給它做動作。如此便是最基本的button設定了。


除了用onPress, onRelease外,也可用onEvent一個function來實做, 如下


透過event.phase得知event type,便能利用onEvent做不同的控制


event裏除了phase外,也包含了觸發對象的id,如下範例



若想了解ui library裏button物件的運作原理,可打開ui.lua這個檔去研究。不過我大致看一下內容,似乎也沒什麼值得抓出來用的東西…

2010/3/10

Corona SDK - Basic Animation 基本動畫控制


Corona SDK 也有類似enterFrame或Tween這類的控制


tween的控制方式如下

可在一行內做多個屬性設定
利用上一節的button,可以做一個簡單的demo





除了transition的用法外,也可用類似enterFrame的控制



如此可以簡單做一個彈射球的demo

*注意上面最後的註解,屬性控制也可用translate這個函式寫成一行,方便。

2010/3/9

Corona SDK-基本sprite屬性操作

CoronaSDK basic sprite control from maso on Vimeo.


練習一下基本的sprite屬性操作



main.lua內容如下:
*註:此練習需配合ui.lua才行,在官方sample code中的"Movieclip"裏可找到


2010/3/8

Corona SDK 初試-Hello World

試用了Corona SDK一陣子,感覺不錯用,但畢竟目前不是以此為業,只是利用工作閒暇時間試著玩,所以很有可能一段時間沒用就會忘光光。決定來寫些筆記以防忘記。


前言:
之所以會注意到CoronaSDK要從Adobe Photoshop 20週年活動說起,Russell Brown為了PS 20週年,找了Ansca Mobild team合作一個iPhone版的Photoshop 1.0.7復刻。影片如下


之後又google一下相關資料,找到這篇
Eating Our Own Dogfood: How we built the Photoshop 20th Anniversary App in Three Days

才知道這是用CoronaSDK開發,而且只花三天就移殖好,這點引起了我不小的興趣,決定找來試玩看看。

*順一提,原來Ansca Mobile是Adobe離職員工出來開的
*另外Flash Magazine這篇Mobile development alternatives,比較幾個目前已知的3rd iPhone開發工具,也可看看


先把相關資料蒐齊:
Corona SDK 官網
30天試用下載
文件
論壇
Blog
一些已在app store上的showcase

試用版抓下來後,照著GettingStartedGuide.pdf這分文件,就可以做出一個簡單的Hello World並丟進手機玩了。不過打包時會要求連上網路,這點有些小麻煩…

此外,一般iPhone開發工具要產生能丟進手機的測試檔時,都會要求填入iPhone Developer program的相關認証檔,corona sdk則不需要。猜想可能他是從xcode裏去抓,或是上網去check…。不過這樣倒是方便不少。

打開Corona simulator,立刻會跳出一個選檔案的視窗,此時選擇你要試的sample的資料夾(不是.lua檔哦),就可以看到simulator畫面了。

若要丟手機的話,開好Corona後,在上方的menu bar選File-> Open for build...,之後同上述步驟。但輸出前會多請你設定版號、要測的機子。之後就會build出 app檔。app檔直接拉進iTunes後同步即可。
*這邊因為我是JB過的iPhone,所以就直接拉了。我沒試過未JB的是否可以這樣用…

成功完成一次丟進手機的測試後,就可以把試用版裏包含的sample code一一丟進測試了。


玩Sample Code初步心得
.因為檔案小,預覽、打包、甚至傳進手機,速度都很快,這點不錯。
.圖形表現、Frame rate、效能表現良好 (on iPhone 3G)
.api 支援算高,除Multi-touch未支援外,很多一般app需要的api都有提供:GPS, Accelerometer, native web view, status bar control, camera, camera roll, read/write files, video player...等
(官方說法:multi-touch及新的game framework會在下一版支援)
.用Lua語法,好學易上手
.可用任何你熟悉的文字編輯器來開發
.沒有視覺化的IDE,在排Layout時會比較辛苦些。(要用coding方式來排layout)
.目前只有mac版,很多win的朋友無法來玩…(這影響此技術的推廣啊…)


Hello World動手做看看
快速弄一個Hello world,開一個資料夾,建一個main.lua的文字檔(存UTF8格式)
裏面寫


這樣就能生出一個Hello world了

若直接丟手機的話,會發現 icon是白的,且launch app時也是一片黑暗。此時可以在你的project folder內放一張320x480的Default.png,及 57x57的 icon.png,來做splash screen及icon圖。


Debug
要做類似Flash 上的trace也很容易。先關掉Corona Simulator,改開啟Corona terminal,接下來都一樣的步驟。coding時用print("這是一個測試") 就可以了。