跳到主要內容

發表文章

目前顯示的是有「Android」標籤的文章

耐心烏龜 Patience

有一次去看診的時候,因為等了好久等到有點快失去耐性,看完診花了不少時間。在回家的路上有感而發,想說不知道有沒有什麼可以訓練或培養耐性的方法。如果沒有的話,或者我自己可以作個APP來達到這個目的,最後就作了這個APP。 < 玩 玩 > < Android > 一開始想到的不是烏龜,而是主畫面是一個泡泡。這個泡泡會愈來愈大,但很容易就破掉。比如不小心點了畫面、程式進入背景、有來電或收到訊息通知等等,都會讓泡泡破掉。程式的目的就是想辨法讓泡泡持續變大,也就是你愈有耐心的保護它,就愈成功。可能可以顯示一個存活時間,用來表示耐心度。 後來一邊考慮程式內容時,一邊把泡泡改成了烏龜。同時考慮到,如果這隻烏龜很容易就死掉,要用這種方式來訓練耐心似乎很難,甚至會有反效果。考慮到一次性的遊戲方式,以存活度來評價耐心度有難度,改變為養成性質的作法。現在不會死掉了,存活時間是累計制的。這樣子應該會比較容易讓人持續的去作這作事,長期下來應該就能提高點耐心吧。 改成養成性質的作法後,其它的設計就能對應調整。首先除了存活度(存活時間)之外,再加上一個等級。這個等級的定義,只是簡單的每次烏龜從左走到右就升級一次。等級每升一級,烏龜就長大1個pixel。同時等級也對應烏龜移動速度,LV10表示每10秒烏龜走1個pixel。以上是核心功能,其它還設計了幾個裝飾畫面的功能。如上方背景日夜變化、月相變化及顯示12星座等。 以下作重點說明。 背景連續山脈圖 背景的山是先建好一個div元素,以CSS設定背景水平重複。   // CSS.   #mountains {     background-repeat:repeat-x;     background-position:bottom;     text-align:     right;font-size:48px;   }   // HTML.   <div style="mountains">   </div> 重複的圖片則以一記憶體canvas畫了一個山型emoji後產生。 var mountains = document.getElementById('moun...

訊息刮刮樂 Message Scratch

這個專案跟 繪文字刮刮樂EmojiScratch 使用的核心技術是相同的,其實這個專案才是最早的靈感而建立的,只是因為在研發過程中嘗試了一些UI上的設計,但一直覺得不是很滿意。結果作到一半又基於同樣的技術產生了繪文字刮刮樂這個遊戲,也很快的製作完成,所以反而繪文字刮刮樂這個遊戲先release了,而訊息刮刮樂斷斷續續的修修改改直到這幾天才release。 < Android > < 範例> 刮刮樂的製作相關技術可參考繪文字括括樂的記錄,而這個專案比較值得記錄的是關於QR Code掃瞄和顯示的功能。本專案的QR Code程式庫是使用 zxing-android-embedded ,這是 ZXing Barcode Scanner 的精簡版本。 一開始的時候我並沒有直接整合QRCode程式庫,而是因為本來手機上己經有安裝BarcodeScanner了,所以可以直接在自己的APP裡面透過Android Intent的方式呼叫BarcodeScanner提供的掃瞄和顯示QRCode的功能。 呼叫BarcodeScanner的掃瞄QRCode功能很簡單,如下: 顯示QRCode也同樣簡單,如下: 注意到上面二段code都是用try包起來,如果因為手機上沒有預先安裝BarcodeScanner無法使用功能的話,就可以幫user開啟google play下載頁面,讓user自行安裝。 ;----- 在release之前以上面的作法快速且簡單的讓APP可以有掃瞄及顯示QRCode功能是很好,但當要真正release至google play上時,就會有違反google play policies的可能。因為在APP裡會跳出至google play的其它APP安裝頁面,會有虛假廣告的疑慮。所以這時候得要自己把QRCode程式庫整合進APP裡。 選擇zxing-android-embedded作為QRCode程式庫,除了因為它是個精簡版的程式庫,最主要還是因為它的整合非常簡單,按照它的readme上的說明,只要幾行就搞定。 如readme上所說明的,只要在build.grandle裡加上如下幾行,即完成整合。 接下來按照readme上的說明,透過使用IntentIntegrator就能很簡單的呼叫掃瞄QRCode的功能。 而使用BarcodeEncoder則可以產...

PIN2 - 拼圖

< Android下載 > 這是很久前的一個小遊戲練習,主要目的是作為一個新的實作框架的練習。成像的部份最早是用GDI,後來改成OpenGL,現在又把它拿出來改成使用good。基本上這是個純C++的程式,LUA只佔用來作初始化的5行程式碼。

吃金幣的人(Coin Eater)

這是把之前作的 基因算法實驗裡的吃金幣的人 遊戲化的一個小作品。 下載  ( src ) ; 這個遊戲比較特別的地方是,這是第一個發佈的遊戲裡面不是全用LUA實作的。實作是一半使用C++另一半使用LUA,C++這邊主要實作比較需要效能的算術邏輯,LUA這邊主要處理成像和UI。

成語四則運算

花了點時間作了這個結合數字成語和四則運算的小遊戲,其中有超過一半的時間都花在收集和整理成語資料上面... << Android 下載 >> 附上 src 。 PS: dat.h是由idiom_ansi.txt轉換過來的,就當作給對src有興趣的人的人的作業。

Good Game Editor 1.4.4

* 修正貼圖物件在負數Scale時顯示錯誤。 * 修正編輯器開啟舊檔時偶發性當機的問題。 * 修正地圖編輯器(MapEditor)繪製圖格超出地圖範圍時造成當機的問題。 * Good.OBJ更名為 Good.SPRITE 。 * 新增 Good.SetName 。 下載 Good Game Editor 1.4.4 + libgood 1.4.4 下載Good Game Player Android 1.4.4

數獨詳解 - Kill Sudoku Step by Step

用了大約一周的時間把之前的 Kill Sudoku 改成安卓版。一開始原本是打算把html5版本使用WebView直接作移植,但作了一些測試後發現有些困難,比如說怎麼作就是搞不定讓顯示和內建的Chrome一樣,還有拖曳畫面的效能也和內建的Chrome有很大的差異的問題等等。最後只好選擇用java+jni的方式改版,因為最早的版本原本就是C++,所以java這邊主要的工作只剩UI的處理。 << Android 免費下載 >>  ( src )

單人撲克101

以前和同事逛書店的時候,看到了一本收錄100個單人紙牌的遊戲書。那時候就和同事半開玩笑的說,把這本書買回去再把裡面的遊戲一個一個實作出來當作是練功吧。後來有一天我真的去把這本書給買了回來,然後每天早上上班之前,利用最多30分鐘的時間一邊啃著麵包一邊實作紙牌遊戲。那陣子每天我至少可以實作一個單人紙牌遊戲,最多的時候一天可以實作4個...不過一直實作作到33個的時候我停手了... 最近心血來潮想說把它移植上android,所以再拿出來檢視一下。原本這是一個windows的應用程式,當初實作的時候沒有特別考慮太多跨平台,把source拿來看了後大概規劃一下怎麼改就動手了,斷斷續續花了一周時間。 Android版本單人撲克101 下面大概對過程作個記錄。 ; 每一個紙牌遊戲都是繼承自CardGame這個類別。下面列出主要和平台有關係的介面,也是移植的時候需要改版的地方。 class CardGame { public:   virtual void DrawGame(CDCHandle dc, RECT const& rcClient) const;   virtual bool OnMouseDown(CPoint point, RECT const& rcClient);   virtual bool OnMouseMove(CPoint point, RECT const& rcClient);   virtual bool OnMouseUp(CPoint point, RECT const& rcClient);   void DrawCard(CDCHandle dc, int x, int y, int card) const;   void DrawCover(CDCHandle dc, int x, int y) const;   void DrawEmptyCard(CDCHandle dc, int x, int y) const;   void EraseBkgnd(CDCHandle dc, RECT const& rcClient) const; }; 如上和平台有關的介...

Good Game Editor 1.4.3

* 物件屬性檢視器(Property View)的ComboBox改為以關卡編輯器(Level Editor)的物件列表取代。 * 新增 Resource.GetFirstLevelId 。 * 新增Ctrl+F5開始播放資源樹指定關卡。 * 新增 Good.GetName 。 * Good.IsVisible更名為 Good.GetVisible 。 * 新增範例animator(簡易動作系統)。 下載Good Game Editor 1.4.3 下載libgood-1.4.3 下載Good Game Player 1.4.3 Android

Good Game Editor 1.4.2

* 支援Good.GenObj可以生成任意關卡資源內的子物件。 * 修正搜尋路徑(Search Path Dependency)的錯誤。 這個功能作好後一直沒真正被使用,所以也一直沒有發現到有問題。所以說, 沒用到的功能還是儘可能不要去作 ! * 播放器(In Editor Player)新增顯示目前使用貼圖資訊(Ctrl+Alt+T)。 * 編輯器新增輸出ZIP格式資源包(Create ZIP Package)。 * 擴充Good.GetTexId可以回傳地圖物件(MAPBG)的貼圖ID。 下載Good Game Editor 1.4.2 下載Good Game Player 1.4.2 for Android

逆轉大老2的AI

逆轉大老2 是大老2遊戲的改良玩法,靈感是來自小時候在掌機上玩過的某個遊戲。  逆轉大老2遊戲規則- * 遊戲使用整副牌52張+2張鬼牌。 * 牌型包含(單張,對子,三條,四條,同花順),同花順最少3張沒有張數上限。 * 只比數字大小,不比花色。 * 數字3最小,依次為3<4<5<6<7<8<9<10<J<Q<K<A<2<鬼牌最大。 * 每次打出四條時大小逆轉2變最小,依次為2<A<K<Q<J<10<9<8<7<6<5<4<3<鬼牌還是最大。 * 鬼牌可以當作任意牌和其它牌配對。例如:鬼牌+2=2一對,方塊2+鬼牌+方塊4=234順子。 * 遊戲開始,手上有梅花3的玩家先出手,可以打包含梅花3的任意牌型的牌。 * 下家要跟上家打出同樣的牌型的牌,無法出牌則PASS。 * 若三家都PASS,則有得到先手權可以再打出新的任意牌型的牌。 * 三家把手上的牌都打完只剩一家未完時,牌局結束。 << Free Android Download >> ; 目前遊戲內容定義了4個不同分級的AI,不過目前第4級AI還沒實作,等未來視情況再看看... AI1:簡單的規則讓AI動起來 手上有梅花作為開局者,出單張梅花3。 順位的情況,出最小的單張牌。 下手跟著上手出同類牌組,數字>上手即可。 無牌可出PASS。 重覆2-4,直到打完手上牌為止。 AI2:計算牌組分數決定出什麼牌 根據已經打出的桌面上的牌和自己手上的牌來計算每張牌的分數來估計自己手上所有牌的分數(被蓋牌的機率),若自己手上有二張3和一張5,且還有一張4和二張6未出(共三張牌未出),則: 3的分數 = (可蓋過3的牌數)/(總牌數) = (1(1張5) + 2(2張6)) / 3 5的分數 = (可蓋過5的牌數)/(總牌數) = 2(2張6) / 3 分數的調整:每張牌計算出分數後再作調整 若這張牌可以是對子(/2) 若這張牌可以是三條(/3) 若這張牌可以是順子(/3.5) 若這張牌可以是四條(/4) 自己手上這把牌的總分 = 3的分數/2(對子) + 3的分數/2(對子) + 5的分數 = (3/3)/2 + (3/3)/2 + 2/3 計算所有可能牌型各別打出後的牌組分數,得分最低分者為...

Android遊戲5連發的一些記錄

這二個月裡面很密集的連發了5款android小遊戲,雖然這些遊戲主要都是移植或改版的作品,但在作移植或改版的過程還是學到了一些東西,並且最重要的是又對good作了點改良,雖然都是小改進但也是小進步,只要持續的作,這些小改進累積起來也是很可觀的 !這篇文章主要目的是在作這幾個遊戲的過程中,把那些值得記錄的事寫出來。 1, 跳跳伯尼熊 UpUp! 某一天終於心血來潮,很想要把什麼遊戲放上google play。這個遊戲是很早之前就完成的,因為也都是用GL成像的,程式也不大所以就挑了它開工。 移植UpUp第一個版本到android手機上很快,大概只花了不到二個小時,因為在那之前我就已經 移植過good ,直接套用相關的經驗很快就可以在手機上執行UpUp。完成第一步的任務後,接下來就要改版了。原來的設計是單機的,有個單人排行榜,現在要改版成有個多人排行榜。為了作到這件事,有好幾件事需要完成。 首先需要有個排行榜的server,這個功能我用php+mysql作了一個很陽春的server,透過http 和json作溝通。 玩家在排行榜上的名字要怎麼來?原來的版本是在gameover,成績有上排行榜時,讓user輸入,不過因為我只用了英數符圖的字圖,所以最後改成抓google account,然後再一開始用toast顯示。 AccountManager accountManager = AccountManager.get(this); Account[] accounts = accountManager.getAccountsByType("com.google"); String name = accounts[0].name; myName = name.substring(0, name.indexOf("@")); Toast.makeText(getBaseContext(), "hello " + myName, Toast.LENGTH_SHORT).show(); 再來就是聲音的處理。將相關的資源檔放在res/raw目錄下,再透過MediaPlayer.create(this, idRes);作到播放聲音的功能。 2, 報數快手123   ( src ) ...