接續上篇: 花栗鼠柑仔店: Android筆記: 讀書心得#8
參考資料: Amazon.com: Hello, Android: Introducing Google's Mobile Development Platform (Pragmatic Programmers) (9781934356562): Ed Burnette: Books
這段內容主要為:
第4章 2D繪圖
4. 處理使用者輸入
4.4 剩下還未處理部分
4.4.3 剩餘函式
4.5 更多改善討論
4.6 2D繪圖總結
4.4.3 剩餘函式
底下還有一些Game.java中程式運作所需要的小函式與變數定義, 如定義三個不同等級的數獨供使用者選擇使用:
## src/org/example/sudoku/Game.java
private final String easyPuzzle =
"360000000004230800000004200" +
"070460003820000014500013020" +
"001900000007048300000000045" ;
private final String mediumPuzzle =
"650000070000506000014000005" +
"007009000002314700000700800" +
"500000630000201000030000097" ;
private final String hardPuzzle =
"009000000080605020501078000" +
"000000700706040102004000000" +
"000720903090301080000000600" ;
getPuzzle( )根據使用者選到的難度, 回傳上面對應的數獨遊戲陣列:
## src/org/example/sudoku/Game.java
/** Given a difficulty level, come up with a new puzzle */
private int[] getPuzzle(int diff) {
String puz;
// TODO: Continue last game
switch (diff) {
case DIFFICULTY_HARD:
puz = hardPuzzle;
break;
case DIFFICULTY_MEDIUM:
puz = mediumPuzzle;
break;
case DIFFICULTY_EASY:
default:
puz = easyPuzzle;
break;
}
return fromPuzzleString(puz);
}
toPuzzleString( )將數獨遊戲由一個整數陣列轉成字串, fromPuzzleString( )則相反:
## src/org/example/sudoku/Game.java
/** Convert an array into a puzzle string */
static private String toPuzzleString(int[] puz) {
StringBuilder buf = new StringBuilder();
for (int element : puz) {
buf.append(element);
}
return buf.toString();
}
/** Convert a puzzle string into an array */
static protected int[] fromPuzzleString(String string) {
int[] puz = new int[string.length()];
for (int i = 0; i < puz.length; i++) {
puz[i] = string.charAt(i) - '0';
}
return puz;
}
getTile() 將座標為x,y格子的數字給取出, 假如該數字為0代表該格子目前是空白. setTile()則是將數字寫入到指定的x,y座標.
## src/org/example/sudoku/Game.java
/** Return the tile at the given coordinates */
private int getTile(int x, int y) {
return puzzle[y * 9 + x];
}
/** Change the tile at the given coordinates */
private void setTile(int x, int y, int value) {
puzzle[y * 9 + x] = value;
}
getTileString() 主是用在PuzzleView類別中, 需要將某個x,y座標的數字取出, 但是是以字串的方式, 方便好顯示在銀幕上, 假如取出的數字為0的話, 則回傳一個空白的字串.
Download Sudokuv2/src/org/example/sudoku/Game.java
/** Return a string for the tile at the given coordinates */
protected String getTileString(int x, int y) {
int v = getTile(x, y);
if (v == 0)
return "";
else
return String.valueOf(v);
}
至此, 應該有一個可以玩的數獨遊戲, 可以試試看玩玩看, 當然還是有一些改進的空間.
4.5 更多改善討論
雖然這章所呈現的程式碼對於一個數獨遊戲來說已經算可接受, 但在撰寫更複雜的程式碼需要更小心, 以免榨乾Android手機的性能. 尤其onDraw()方法是對整體程式碼效能最具決定性的一個部分, 所以這部份能夠做越少事情越好, 這邊有一些對於onDraw()最佳化可參考的建議:
• 假如可以, 避免在onDraw()中做一些物件配置的動作(object allocations).
• 一些顏色常數可在其他地方預取(Prefetch), 如View的建構子, 不要寫在onDraw中.
• 在onDraw()之前的程式碼建立Paint物件, 或重用現有的Paint物件.
• 有一些值常會被使用到多次, 比如getWidth(), 可以將這值在開始時先取出成區域變數, 存取時用這區域變數即可.
原作者建議讀者要做進階的練習, 可以繼續強化這遊戲的圖形介面, 如當玩家完成數獨時可以放一些煙火特校, 或是將所有的格字做到處迴旋的特校. 一直會移動的背景也是蠻有趣的, 總之隨你的想像去實現, 假如你想做一個頂尖的產品, 就必須加入更多的華麗的元素到你的產品中.
下一章(第5章), 多媒體的處理, 會在程式中增加一點點情境音樂, 在第6章, 儲存區域資料(Local Data), 我們會研究如何將數獨玩到一半的狀態儲存起來, 最後把Continue(繼續)的功能實作出來.
4.6 總結
在這章中, 我們在銀幕上試驗了Android圖形能力, 整個Android 2D的函示庫非常龐大, 所以當你在撰寫程式時, 可以多利用一些工具提示, IDE工具的自動關鍵字完成, 或查詢由Android Exlipse plug-in提供的Javadoc. 線上的android.graphics3的文件除非必要, 否則對於在剛開始撰寫Android程式的人太詳細了.
假如程式有需要更進階的圖形函示庫, 可以查詢第10章, OpenGL 3D圖形, 可以學到有關Android 3D圖形函示庫的使用, Android 3D函示庫主要是符合於OpenGL ES標準開發, 不然就直接翻到下一章享受一下Android美妙的影音介紹吧.
沒有留言:
張貼留言