---
title: Corona SDK app 開發教學
tags: Corona, NTPU
description: 資工營Day2
---
# Corona SDK APP 開發
[TOC]
## Corona 是甚麼?
- 2D 遊戲引擎
- 免費 :smile:
- 支援多平台(web, android, windows)
- 要申請帳號才能用 :angry:
---
## 環境建置
Corona 模擬器: [https://coronalabs.com/](https://coronalabs.com/)
JRE: [https://java.com/zh_TW/download/](https://java.com/zh_TW/download/)
Sublime Text 3: [https://www.sublimetext.com/3](https://www.sublimetext.com/3)
---
### Sublime Text 3 設定
---
1. 安裝 *Sublime Text* Package Control, **Tools > Command Palette… > Install Package Control**
(或是用快捷鍵 {Ctrl + Shift + P} 開啟 Command Palette)
3. 安裝完之後, 在 *Sublime Text* 裡面選擇 **Tools > Command Palette… > Package Control: Install Package**
4. 在搜尋欄裡面打 **Corona Editor**, 左鍵點擊安裝
5. 重新啟動 *Sublime Text*
---
### 將Lua檔案預設為Sublime Text開啟
1. 讓Windows系統顯示副檔名
![](https://i.imgur.com/yNBOFRo.png)
取消勾選此項
![](https://i.imgur.com/ZxOAATh.png)
2. 建立任意.lua檔案
![](https://i.imgur.com/sVIvrSb.png)
![](https://i.imgur.com/4ZbDuMp.png)
3. 變更.lua檔案預設開啟程式
![](https://i.imgur.com/gVFuWjF.png)
![](https://i.imgur.com/Q8Ca5Ve.png)
![](https://i.imgur.com/CR0pqB5.png)
![](https://i.imgur.com/c4TeAeg.png)
點擊確定並套用
![](https://i.imgur.com/Vf0NB2Z.png)
![](https://i.imgur.com/Xy1zUBD.png)
---
## Hello World
### 建立專案
---
![](https://i.imgur.com/CE5jj4n.png)
![](https://i.imgur.com/r2upOVT.png)
這邊會開啟四個視窗
![](https://i.imgur.com/qcFfhiD.png)
如果你的畫面出現超大的模擬器,修改模擬器的解析度就好
![](https://i.imgur.com/C32tKPZ.png)
我們主要看的兩個視窗縮放到適合大小就好
- 模擬器畫面
- Sublime Text 3 - **main.lua**
![](https://i.imgur.com/84o1GqP.png)
### 背景圖片
---
[earth.jpg (另存連結為...)](https://i.imgur.com/dZVEzba.jpg)
![](https://i.imgur.com/dZVEzba.jpg)
將上方圖片保存為earth.jpg, 放到跟main.lua同一個資料夾
``` lua=1
-----------------------------------------------------------------------------------------
--
-- main.lua
--
-----------------------------------------------------------------------------------------
local background = display.newImageRect( "earth.jpg", display.contentWidth, display.contentHeight )
background.x = display.contentCenterX
background.y = display.contentCenterY
```
![](https://i.imgur.com/HQEpf4e.png =300x)
> 在Lua中, 變數的宣告方法為 **Local x = 1**, 其中x為變數名稱, 1為資料
> [**display.newImageRect()**](https://docs.coronalabs.com/api/library/display/newText.html) 產生新的圖片物件
> **earth.jpg** => 檔名
> [**display.contentWidth**](https://docs.coronalabs.com/api/library/display/contentWidth.html), [**display.contentHeight**](https://docs.coronalabs.com/api/library/display/contentHeight.html) 螢幕的寬與高
> [**display.contentCenterX**](https://docs.coronalabs.com/api/library/display/contentCenterX.html), [**display.contentCenterY**](https://docs.coronalabs.com/api/library/display/contentCenterY.html) 螢幕中心的X座標及Y座標
> 在Corona的世界中, 一個物件的X, Y給定如下:
> ![](https://i.imgur.com/GMuMSsk.png =400x)
> x, y為物件**中心**的座標
---
### 顯示文字
---
``` lua=11
local text = display.newText( "Hello World", display.contentCenterX, display.contentCenterY, native.systemFont, 40 )
text:setFillColor( 1, 0, 0 )
```
![](https://i.imgur.com/jE7Rjxw.png =300x)
> [**display.newText()**](https://docs.coronalabs.com/api/library/display/newText.html) 產生新的文字物件
> **native.systemFont** => 系統預設字型
> 40 => 字型大小
> [**object:setFillColor()**](https://docs.coronalabs.com/api/type/ShapeObject/setFillColor.html) => 設定物件的顏色 (R, G, B) (0~1)
---
## 會動的小遊戲 Ballon
---
這個Project會用到三個圖片檔
| background.png | platform.png | balloon.png |
| -------- | -------- | -------- |
| 背景圖片 |平台/地板 | 氣球 |
[下載 https://github.com/coronalabs/GettingStarted01/archive/master.zip](https://github.com/coronalabs/GettingStarted01/archive/master.zip)
同時開啟一個新的專案, 命名為**balloon**
並將三個圖檔放到ballon的資料夾(與main相同)
### 載入背景圖片
```lua=1
-----------------------------------------------------------------------------------------
--
-- main.lua
--
-----------------------------------------------------------------------------------------
local background = display.newImageRect( "background.png", 360, 570 )
background.x = display.contentCenterX
background.y = display.contentCenterY
```
![](https://i.imgur.com/Jzlytco.png =300x)
### 載入平台
```lua=7
local background = display.newImageRect( "background.png", 360, 570 )
background.x = display.contentCenterX
background.y = display.contentCenterY
local platform = display.newImageRect( "platform.png", 300, 50 )
platform.x = display.contentCenterX
platform.y = display.contentHeight-25
```
![](https://i.imgur.com/esYAZCJ.png =300x)
### 載入氣球
```lua=15
local balloon = display.newImageRect( "balloon.png", 112, 112 )
balloon.x = display.contentCenterX
balloon.y = display.contentCenterY
```
這邊讓氣球稍微透明化, 設定氣球的`alpha = 0.8`
```lua=15
local balloon = display.newImageRect( "balloon.png", 112, 112 )
balloon.x = display.contentCenterX
balloon.y = display.contentCenterY
balloon.alpha = 0.8
```
![](https://i.imgur.com/sGXi3AW.png =300x)
### 加入物理引擎
Corona 預設就有方便的2D物理引擎讓我們用
要用Corona的任何套件, 都是用 `require("package name")`
```lua=20
local physics = require( "physics" )
physics.start()
```
要讓物件受到物理引擎的影像, 必須要讓將普通的物件轉成物理物件, 使用`physics.addBody()`就可以做到
```lua=20
local physics = require( "physics" )
physics.start()
physics.addBody( platform, "static" )
```
第一個參數放要轉換的物件, 後面的`static`的意思是希望該物件不要受到物理效果的影響(如: 衝力, 重力)
```lua=20
local physics = require( "physics" )
physics.start()
physics.addBody( platform, "static" )
physics.addBody( balloon, "dynamic", { radius=50, bounce=0.3 } )
```
在這個應用中, 我們希望`balloon`是一個`dynamic`物件, 意思是`balloon`會受到重力的影像, 也會被偵測到碰撞.
* 因為`balloon`幾乎是一個圓形的物件, 所以我們設定`radius = 50`, 這將會把`balloon`視為一個半徑50的物理物件, 可以根據圖片的大小不同更改這個值
* `bounce`這個值決定了物件在遇到碰撞時, 回饋的能量, 必須要是一個自然數(>0.0), 0.3代表碰撞時會回饋30%的能量.
### 推氣球
```lua=26
local function pushBalloon()
end
```
>在lua中, 建立函式的方法為
>```lua
>local function function_name( ... )
> -- body
>end
>```
>括號`()`是必要的, 不管有沒有傳入
```lua=26
local function pushBalloon()
balloon:applyLinearImpulse( 0, -0.75, balloon.x, balloon.y )
end
```
呼叫函式時, 給予`balloon`一個向上的衝力
`balloon.x, balloon.y`告訴物理引擎要在哪裡施力
```lua=26
local function pushBalloon()
balloon:applyLinearImpulse( 0, -0.75, balloon.x, balloon.y )
end
balloon:addEventListener( "tap", pushBalloon )
```
* 我們在設定事件的時候, 要告訴corona事件要發生在甚麼物件上面, 在這邊是`balloon`
* 呼叫一個物件的函式時, 用的是`:`來呼叫, 在lua裡面這個叫做物件函式, 在冒號之前放物件本身, 物件後面放函式名稱`addEventListener`
* 我們希望在滑鼠/觸控碰到氣球的時候, 呼叫剛剛寫好的`pushBalloon`, 所以在`addEventListener`裡面填入事件類型`"tap"`, 後面放希望呼叫的函式`pushBalloon`
以下是到目前為止的所有Code, 如果發現自己的氣球碰到不會動的話, 可以對照看看
```lua=
-----------------------------------------------------------------------------------------
--
-- main.lua
--
-----------------------------------------------------------------------------------------
local background = display.newImageRect( "background.png", 360, 570 )
background.x = display.contentCenterX
background.y = display.contentCenterY
local platform = display.newImageRect( "platform.png", 300, 50 )
platform.x = display.contentCenterX
platform.y = display.contentHeight-25
local balloon = display.newImageRect( "balloon.png", 112, 112 )
balloon.x = display.contentCenterX
balloon.y = display.contentCenterY
balloon.alpha = 0.8
local physics = require( "physics" )
physics.start()
physics.addBody( platform, "static" )
physics.addBody( balloon, "dynamic", { radius=50, bounce=0.3 } )
local function pushBalloon()
balloon:applyLinearImpulse( 0, -0.75, balloon.x, balloon.y )
end
balloon:addEventListener( "tap", pushBalloon )
```
### 建立分數
一個遊戲怎麼能少了分數?
這邊我們定義`tapCount`, 紀錄玩家總共碰到氣球幾次, 碰到愈多次, 分數就愈高囉 :+1:
```lua=7
local tapCount = 0
local background = display.newImageRect( "background.png", 360, 570 )
background.x = display.contentCenterX
background.y = display.contentCenterY
```
建立文字
```lua=7
local tapCount = 0
local background = display.newImageRect( "background.png", 360, 570 )
background.x = display.contentCenterX
background.y = display.contentCenterY
local tapText = display.newText( tapCount, display.contentCenterX, 20, native.systemFont, 40 )
```
![](https://i.imgur.com/KiDiRkh.png =300x)
因為背景的顏色太亮了, 改一下分數的顏色
```lua=13
local tapText = display.newText( tapCount, display.contentCenterX, 20, native.systemFont, 40 )
tapText:setFillColor( 0, 0, 0 )
```
![](https://i.imgur.com/AsZ72pL.png =300x)
接下來我們要記錄點擊的次數, 在哪裡記錄呢?
只要修改一下`pushBalloon`就好了 :100:
```lua=31
local function pushBalloon()
balloon:applyLinearImpulse( 0, -0.75, balloon.x, balloon.y )
tapCount = tapCount + 1
tapText.text = tapCount
end
```
* `tapCount = tapCount + 1` 經過這行的運算 `tapCount` 就會增加1
* `tapText.text = tapCount` 透過更新`tapText`的成員`text`就可以直接更新畫面上文字了
## 發布
Corona SDK的方便之處在於, 可以一鍵匯出成可執行檔,讓別人可以安裝執行。
| Android | Windows | HTML5(web) |
| -------- | -------- | -------- |
| .apk | .exe | .html |
在模擬器的視窗中, **File->Build**
![](https://i.imgur.com/fEWWLQ3.png =500x)