Android 遊戲程式設計實習 - 東吳大學資訊管理系「線上學習平台」

Download Report

Transcript Android 遊戲程式設計實習 - 東吳大學資訊管理系「線上學習平台」

教育部網路通訊人才培育先導型計畫─課程發展計畫
Android 遊戲設計實驗
郭育政
涂昆源
余執彰
周建興
林旭陽
Android 遊戲設計模組
東吳大學資訊管理系
萬能科技大學資訊工程系
萬能科技大學資訊工程系
淡江大學電機工程系
東吳大學資訊管理系
1
AndroidGame 實驗課程




Android 2D 遊戲專題製
作:九宮格
Android 3D動畫遊戲專題
製作:骰子俄羅斯3D
Android體感遊戲專題製
作:平衡球
Android多觸控遊戲專題
製作:抓鈔票
Android 遊戲設計模組
2
單元一:Android UI介面遊戲實習




實作UI介面遊戲實習
九宮格遊戲
版面配置Layout
Menu
Android 遊戲設計模組
3
九宮格拼圖遊戲




SurfaceView
OnTouchEvent
Random
判斷完成
Android 遊戲設計模組
4
➲
SurfaceView

SurfaceView 是view的一個子類別,主要目地是
提供應用程式一個輔助執行緒來描繪圖形,因此
應用程式不需要等到系統準備好View層次在描繪,
fps是三種描繪方式中最快的,相當適合許多
Game的製作
Android 遊戲設計模組
5
➲





SurfaceView 重要的類別和方法
Surface:SurfaceHolder getHolder ()
SurfaceHolder:Canvas lockCanvas()
Canvas:drawBitmap(),int save(),void drawText,void drawColor()
Paint:setcolor(),setTextSize(),setAntiAlias()
invalidate()
Android 遊戲設計模組
6
SurfaceView類別的按鍵輸入事件





SurfaceView類別的鍵盤,鍵盤,觸控,軌跡球和聚焦輸入事件
和方法
KeyEvent - onKeyDown() onKeyup() onKeyLongPress()
onKeyMultiple()
TouchEbent - onTouchEvent()
TrackballEventon - TrackballEvent()
FocusEvent - onFocusCjanged()
Android 遊戲設計模組
SurfaceView類別的按鍵輸入事件

每當鍵盤,觸控,軌跡球被使用時,就會修改event的內容,
因此我們就可以透過這個物件了解android手機被如何操作,
像透過imageX=event.getX();imageX = event.getX();
就可以取得碰觸螢幕的X,Y座標
實作方法為,繼承SurfaceView類別,重寫(Override這些輸入事件的方法)
九宮格程式流程

載入圖片mainLoop.start->
執行dodraw->OnTouchEvent->修
改變數->invalidate()->執行
dodrew->再次觸發dodraw或遊戲
結束
Android 遊戲設計模組
9
課程單元二:Android 3D動畫遊戲
骰子俄羅斯方塊3D


點選骰子可旋轉
本身
當骰子落底可計
算分數並標示分
數
Android 遊戲設計模組
10
骰子俄羅斯方塊3D

由於Toast與Dialogs無法直接寫
在thread中(會error),因此需
要使用其他方式來處理

只要加上下一頁投影片的程式碼
我們在thread中加上Handler就能
使用類似Toast的顯示方法在遊戲
執行過程中
Android 遊戲設計模組
11
何謂Handler與Looper?




Looper 是一個類別將 thread 轉成
Pipeline Thread 而 Handler 則是一
種裝置可以幫你把 tasks 放入其它
thread的Looper中.
每一個thread都有一個Looper 來處理
其 message queue
所有的來自設備的 Events 都會被插入
Looper 中(像 View UI events,
IntentReceivers firing….等)
Loopers 不能容納多個 multithreaded access ,MessageHandlers
則可處理multi-threaded access
Android 遊戲設計模組
12
Dialog程式碼

透過Message取得msg再呼叫Dialog
Android 遊戲設計模組
13
骰子點數

透過現在某物件的總共
旋轉角度了解現在骰子
的旋轉到哪一面
Android 遊戲設計模組
14
單元三: Android體感遊戲實習



實作體感遊戲實習。
平衡球遊戲,利用手
機的平衡傾斜角度來
移動球
使用手機震動來表達
球落入洞中
Android 遊戲設計模組
15
平衡球遊戲介紹
改變手機傾斜角度,
滾動藍色球,落入紅
色目標洞則成功,落
入黑色則失敗
 使用手機震動讓使用
者體驗球落入洞中
 SensorEventListener

目標
ArrayList

先宣告ArrayList

New一個新holl物件

Holl.add(a);

Holl.remove (x);
Android 遊戲設計模組
ArrayList

Holl.size()

Holl.get(draw).left

Holl.get(draw).top
Android 遊戲設計模組
AndroidManifest檔設置

1. 若要在應用程式內使用到震動這個服務,需先在
AndroidManifest.xml允許存取android.permission.VIBRATE這個權限。

2.android:screenOrientation=“portrait”>防止手機螢幕自動換方向顯示
Android 遊戲設計模組
如何設定手機震動
Android 遊戲設計模組

myVibrator = (Vibrator)
getApplication().getSystemService(S
ervice.VIBRATOR_SERVICE);

myVibrate.vibrate (100);

myVibrator.vibrate(new long[] { 10,
100, 10, 100, 10, 100, 10, 100 }, 1);
體感各個state需加入之程式碼
如何加入體感功能?

先在class右邊加入implements SensorEventListener

代表繼承SensorEventListener物件

然後就會加入此行程式碼

透過event中的值我們就可以瞭解手機的情況
設定時間

先在oncreate 狀態下儲存time1的值
time1= System.currentTimeMillis();

然後在canvas迴圈中讀取現在的時
間單位為千分之一秒

右圖為遊戲重開之範例
Android 遊戲設計模組
如何加入體感功能?

event.value[0], event.value[1],
event.value[2]

分別代表方位角度,投球角度,滾動
角度

透過其值變動修改球之位置

需放入此程式碼於
單元四:Android多觸控遊戲實習


實作多觸控遊戲實習。
抓鈔票遊戲。
Android 遊戲設計模組
25
抓鈔票遊戲介紹
畫面中會落下無數的鈔票
 鈔票有兩種以上的面額
 用兩指對鈔票做出抓取動作即可得到該面額錢
數
 遊戲目的是比較誰能得到最多錢

Android 遊戲設計模組
26
抓鈔票功能

主要功能:
–
–
–
–
–
–
鈔票的產生
鈔票掉落動作的控制
倒數計時器
遊戲時間結束的畫面
遊戲動畫的產生
抓取鈔票的判斷方式
Android 遊戲設計模組

次要功能:
– 遊戲主選單
– 遊戲說明頁
27
鈔票的產生-1

定義一個新 class “Bill” ,用來存放相關資料(鈔票圖案
、鈔票面額、鈔票目前位置)
Android 遊戲設計模組
28
鈔票的產生-2



用Random函式決定
鈔票面額
用Random函式決定
鈔票掉落位置
將所有值存入
“bill” 並回傳
Android 遊戲設計模組
29
鈔票的產生-3


宣告一個 Bill 物件接收副程式 ResetBill() 回傳的值
將此物件加入一個 ArrayList (在此為 bills)
Android 遊戲設計模組
30
鈔票掉落動作的控制-1




定義一個 Thread
在 run() 中用 while loop
讓 Thread 不斷運作
用 for loop 更新每張鈔票
的位置
用sleep方法限制 loop 的
執行速度,以免鈔票掉
落速度會因硬體差異而
有所不同。
Android 遊戲設計模組
31
鈔票掉落動作的控制-2

在 initilizeGame() 副程式中,用 start() 方法啟動 Thread
Android 遊戲設計模組
32
倒數計時器-1


使用 Android 函式
“CountDownTimer”
在 onTick() 方法中
記錄時間變化
Android 遊戲設計模組
33
倒數計時器-2

在 initilizeGame() 副程式中設定倒數計時器,並用
start() 方法啟動倒數計時器
Android 遊戲設計模組
34
遊戲時間結束的畫面

在倒數計時器的
onFinish() 方法中
定義 Dialog,作為
遊戲結束時的提示
視窗。
Android 遊戲設計模組
35
遊戲動畫的產生-1



定義一個 SurfaceView
的class ,並
implements Runnable
。
建構子內可做所有細
部設定與遊戲初始化
最後用 start() 方法啟
動此 Thread
Android 遊戲設計模組
36
遊戲動畫的產生-2



用 for loop 取得每張鈔票
的位置並繪出
用 drawText() 方法畫出
分數與時間
在 run() 中用 while loop
讓 Thread 不斷運作
Android 遊戲設計模組
37
遊戲動畫的產生-3

最後將 onCreate() 內的 setContentView() 設為該
SurfaceView class 即可
Android 遊戲設計模組
38
抓鈔票遊戲畫面
Android 遊戲設計模組
39
抓取鈔票的判斷方式-1

Android 函式中的 ScaleGestureDetector 可以偵測縮放
手勢。縮放手勢與抓取動作十分相似,因此可以拿來
運用。
Android 遊戲設計模組
40
抓取鈔票的判斷方式-2





讓縮放手勢得知發生
觸碰事件
在觸碰點 “UP” 的情
況下引發事件
取得觸碰點 “UP” 的
座標
設定圖片(鈔票)有效
抓取範圍
若在範圍內,則得分
與重置該張鈔票
Android 遊戲設計模組
41
注意事項


在 onDestroy() 中必須設
定 Thread 的終止條件,
避免迴圈在關閉程式後
依然在運作。
若是中途關閉程式,必
須取消倒數計時器,以
免發生錯誤。
Android 遊戲設計模組
42
遊戲主選單-1



編輯main.xml檔
在最外層的
“LinearLayout” 設定背景
圖案
在 “LinearLayout” 中加入
三個Button (開始、說明
、結束)
Android 遊戲設計模組
43
遊戲主選單-2



主程式中使用
“findViewById” 與
main.xml 內的 Button 做
連結
使用 “Intent” 切換
Activity 到遊戲畫面或遊
戲說明頁面
使用 finish() 方法關閉
Activity 即可關閉程式(
結束遊戲)
Android 遊戲設計模組
44
遊戲主選單-3

別忘記在 manifest.xml 中加入額外的 Activity,否則將
無法正常執行。
Android 遊戲設計模組
45
抓鈔票遊戲畫面
Android 遊戲設計模組
46
遊戲說明頁-1



編輯instruction.xml檔
(請自行新增在layout
資料夾)
在最外層的
“LinearLayout” 設定
背景圖案
在 “LinearLayout” 中
加入TextView 與
Button
Android 遊戲設計模組
47
遊戲說明頁-2


主程式中使用 “findViewById” 與 instruction.xml 內的
Button 做連結
使用 finish() 方法關閉 Activity 即可關閉說明頁面
Android 遊戲設計模組
48
遊戲說明頁-3

別忘記在 manifest.xml 中加入額外的 Activity,否則將
無法正常執行。
Android 遊戲設計模組
49
抓鈔票遊戲說明畫面
Android 遊戲設計模組
50
THE END