其實這陣子工作之餘,也忙著開始找尋美術,所以在巴哈發了篇文,原本想說資金不足,只能慢慢找尋有意配合的創作者,在有限的資源付出酬勞,沒想到發信詢問的勇者超乎想像,甚至有不願意拿薪也要加入開發的網友(此風不可長),每位VJ都有深談,甚至約出來見面聊,最後我的感想是:這塊寶島上仍然有很多充滿抱負理想的人們,努力的生活,找尋機會啊!!

好了題外話扯遠了,關於美術這件事我會另外開一篇文章細談的

今天要帶給大家的是之前提到的跑馬燈伺服器要資料的變種程式!?簡單的說,就是在遊戲中,跑馬燈公告其實是不停的跟伺服器要資料,更新到玩家的手機上後,排程慢慢顯示出來,所以本次的程式範例會有PHP+LUA的CODE。

首先在看伺服器的程式碼之前,有幾件事要了解:

1.真正上戰場的伺服器語言寫法,並不是如VJ範例的那麼陽春
2.任何有關於伺服器的溝通,在IOS上已經嚴格規定要用https的加密。
3.伺服器的SQL語法,千萬要記得sql injection這件事,不知道的要去估狗,這件事太重要
4.回傳格式不見得一定要用json,xml也是可以做為交換格式。

那麼先看看伺服器端的資料庫:

這是目前資料庫中所有的跑馬燈內容,接下來看看PHP要怎麼寫:

mysql_connect("localhost","@@database@@","@@password@@");
mysql_select_db("lua");
mysql_query("set names utf8");

$sql = "select * from test2";

if (isset($_GET['id']) && trim($_GET['id']) != '' && is_numeric($_GET['id'])){
 $sql .= " where id <= {$_GET['id']} ";
}

$r = mysql_query($sql) or die('MySQL query error');
$data = array();
while($row = mysql_fetch_array($r)){
 $data[] = $row['memo'];
}
echo json_encode($data);
exit;

這邊大家要理解的東西有兩個,一個是PHP另一個是SQL,簡單的說如下:

1.GET是傳送資料給伺服器的其中一種方式,通常在網址最後的問號你常會看到?id=xxx&sn=xxx…之類的東西,雖然快速方便,但是安全性低,通常建議還是使用POST
2.
if (isset($_GET[‘id’]) && trim($_GET[‘id’]) != ” && is_numeric($_GET[‘id’])){
   $sql .= ” where id <= {$_GET[‘id’]} “;
}
此段是判定當使用get傳送資料時,我要確定參數是存在的不是空白的並且是數值,接著我才將預設的sql加上where條件。
3.where id <= {$_GET[‘id’]},是告訴資料庫只要id欄位小於等於$_GET[‘id’]都要撈出來,也就是說今天給了4,伺服器要將1 2 3 4的資料都撈出來。
4.接下來用json編譯之後,傳送出去。

接下來是lua:

-- include json
local json = require('json')
-- define area param
local d = {}
-- run 
local function loop()
 local obj = d[d.index].obj
 obj.x = display.contentWidth
 local function onComplete(obj)
 d.index = d.index + 1
 if (d.index > table.getn(d) ) then d.index = 1 end
 -- trans obj to set position, after go to position
 transition.to( obj, { x = display.contentWidth * -1 , time = 3500, delay = 800, onComplete = loop } )
 end
 -- trans obj to set position
 transition.to( obj, { x = display.contentWidth * 0.5, time = 2000, onComplete = onComplete, transition = easing.outExpo } )
end

local function networkListener( event )
 if ( event.isError ) then
 -- if server on error,process event
 else
 -- if server response success,you can do something
 -- decode json foramt data, and insert d table
 local a = json.decode( event.response)
 for k, v in pairs(a) do
 table.insert(d,{ text = v })
 end 
 -- create text object
 for k, v in pairs(d) do
 local options = 
 {
 text = v.text, 
 x = display.contentWidth + display.contentWidth * 0.5,
 y = display.contentCenterY,
 width = display.contentWidth,
 font = native.systemFont, 
 fontSize = 18,
 align = "left"
 }
 
 local myText = display.newText( options )
 myText:setFillColor( 1, 0, 0 ) 
 v.obj = myText
 end
 d.index = 1 
 loop()
 end
end
 
network.request( "http://lua.servehttp.com/ma.php", "GET", networkListener )
--network.request( "http://lua.servehttp.com/ma.php?id=2", "GET", networkListener )

其實跟這篇的程式碼雷同,但是加上了可樂的network運用

1.network.request( “http://lua.servehttp.com/ma.php?id=2”, “GET”, networkListener )的networkListener是一個call back的function name,也就是說當你成功的發送資料到伺服器端,無論如何伺服器都會將狀態傳送回來,可樂人很好,它會幫你判斷伺服器回傳的狀態是成功還是失敗,假設你的伺服器code發生錯誤,它就會跑到event.isError這一段
2.local a = json.decode( event.response),這邊是將接收到的資料解譯,變成人類看得懂的東西
3.table.insert(d,{ text = v }),將資料塞到d裡面,d是lua專門的一個類別項,也就是table,可樂官網裡有特別將它放到api裡,官網在這,另外table是lua一個非常重要的類別,官網提供的其實還不夠多,開發者如果有時間應該要讀這一篇

接下來我們看看執行畫面:

好了,我們已經可以不用在程式裡寫死跑馬燈的文字,而是從伺服器撈取資料直接更新到app裡面了,接下來我們來驗證一下一開始提到,使用get的方式,來對伺服器撈取資料:
我們將
network.request( “http://lua.servehttp.com/ma.php”, “GET”, networkListener )
改為
network.request( “http://lua.servehttp.com/ma.php?id=2“, “GET”, networkListener )
這樣代表只要撈出前兩筆資料就好,也就是說跑馬燈跑完兩筆之後,應該要直接回到第一筆顯示:

注意到了嗎,開始只有兩筆循環,這就是在?下參數會產生的變化,當然也必須搭配著伺服器的資料狀態做調整。
以上,就是本次分享的小東西。

Categories: Corona sdk 實作

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *

Related Posts

Corona sdk 實作

CORONA SDK 音樂播放

使用可樂的好處就是比一般的遊戲引擎還快上手,一是不需要做太多設定,二是 Read more…

Corona sdk 實作

Corona SDK影格動畫(2)

因為工作的關係,很久很久沒有更新網誌了,目前卡牌部分已經暫停下來,在此 Read more…

Corona sdk 實作

Corona SDK 跳動的數字

以上,就是本次教學,謝謝大家。     &nbsp Read more…