前面的,口水話 請直接跳過。
雖然現在不比以前了 也沒多少人氣了,放到首頁 都不到幾百的點擊量。也許博客園整體水平也是在往水的方向發展。不談那些了,哥也曾經輝煌過 有過一天上千的點擊量 ,哥也曾經有過粉絲,被小妹稱為大神去指點問題,雖然這大神水分有點重。
人都是有虛榮心的 正是因為這樣激勵著我持續學習技術,去探索。 才有我持續發表技術博文的動力。我寫的都是自己真切實意的關于技術的心得經驗 并不是純控件 使用demo 或者商業數據庫項目那種碼農式的代碼。有那么一丁點算法或者技術上的技巧 屬于我自己的偏好?但是大多數智商水平也就小學 ,就圖像處理那幾篇 用到的算法原理也就超過初中智商水平一點點。
從四年前進歪醫用膠片公司發俄羅斯方塊的博文開始就一直持續不斷的激勵著我,然后一有東西我都記錄下來。不說了 要點擊量就去寫小說了 還有錢。
?
正文,到博客園從寫c#俄羅斯方塊開始 ,可能有的朋友已經把它忘了。那么我們又來寫俄羅斯方塊 只不過這次是android版的 。也許是結束 ,也許是新的開始呢。
主代碼在原來c#基礎上改的 基本上沒怎么動,如果你見過原來的版本 一看就明白 還是那幾個類。對于android平臺的開發自己看書 本身沒幾天 勿噴。
游戲主要邏輯類三個 game gamearea shape,這里多了個point? 因為c#里有用于定位的值類型Point ,java里沒有 那么我們就為他手動定義一個 免得改動其他邏輯代碼?。
先說game類 ,new game() 既代表初始化了一個游戲,以前c#版本 游戲數據直接在form里通過gdi重繪 ,游戲數據展現給使用者 這是最基本的。所以我讓game類變成自定義控件 繼承自view 一來我可以通過這種方式把它放到主界面 二來游戲數據發生改變需要重繪的時候 可以通過自帶的函數重繪。
?其他的基礎代碼方面 c#跟java稍微有差別比如
定義二維數組
c#
1 bool[,] gameAreaArray;
java
1 boolean [][] gameAreaArray;
還有java里的switch 好像只能判斷數字,害的我把switch代碼都改成了if else if 幸好不多。
android里添加事件 是setonClickListener 然后把一堆東西都寫在那個函數里面,這個我也暫時還沒習慣 熟悉了就好了。
android下的界面及控件都是以xml樹狀結構配置,并且跟代碼對應 所有控件都繼承自view。就單從這一設計理念上來說他跟wpf是一樣的,左邊xml界面 右邊代碼界面。用這種理念去看 winform或者mfc界面,winform 或者mfc界面 那種方式就像山頂洞人。wpf也不像winform那樣一定雙擊通過硬編碼去添加按鈕事件,個人覺得通過硬編碼添加按鈕處理 弊端多。winform搞個什么漂亮點的界面得onPaint 搞個什么漂亮點的界面得onPaint 還不能隨心所欲的設計界面。 說明時代是發展的社會是進步的 新東西不得不學啊。
android下木有messagebox.show() 讓我這種這種大老土 情何以堪啊。最常用的是toast。
方塊不斷的下落 原來在winform 用timeer控件,在android平臺 暫時我沒有找到timer控件 所有我就用了多線程。也是在網上大概瞄了下java的多線程處理方式 然后根據自己的要求抄了段代碼了事。
1 Thread ttt; 2 ttt = new Thread(new Runnable() { 3 @Override 4 public void run() { 5 while (true) { 6 if (gg.isOver()) { 7 return; 8 } else { 9 // 對游戲邏輯 進行“下移” 操作(具體的下移到什么地方 比如到底了又如何 10 // 這些邏輯統統是在game類里面進行判斷 操作) 11 mekSound(gg.go()); 12 } 13 try { 14 Thread.sleep(1000); 15 } catch (InterruptedException e) { 16 e.printStackTrace(); 17 } 18 19 } 20 } 21 }); 22 ttt.start();
但是有一個小問題,認真看過代碼都知道 這個俄羅斯方塊游戲 背后的數據模型就是一個二維數組 ,這里新開一個線程對數據執行“下落”的操作。而界面主線程的按鈕同時也要對同一數據進行左右移動 或者變形操作,我代碼邏輯里控制了 游戲本身不會報錯 但是會出現一些很神奇的事情 比如方塊掉到坑里了之類的。都說的很明白了 需要進行所謂的線程間數據同步 這個請親們自己去修復。
?
?關于音頻處理,得分或者什么的時候總得給點叮當聲 什么的吧 否則死氣沉沉的,特別是現在這種眼球經濟的時代 沒賣相更加死得快。
音頻處理我是用的網上推薦的自帶的Mediaplayer 對于我來說足夠。對于不同的類型 比如得分 什么的 我給不同的音效,唯一注意的地方就是 ,在播放前就給回掉函數 播放完成后對資源進行回收 ,要不然搞幾下你的程序就搞不起了? 我試過。
音頻處理:
1 public void mekSound(int type) { 2 3 switch (type) { 4 case 1: 5 m_sound = MediaPlayer.create(this, R.raw.money); 6 m_sound.start(); 7 m_sound.setOnCompletionListener(new OnCompletionListener() { 8 9 @Override 10 public void onCompletion(MediaPlayer arg0) { 11 // TODO Auto-generated method stub 12 m_sound.release(); 13 } 14 }); 15 break; 16 default: 17 break; 18 } 19 20 }
要記住始終以用戶為前提,得分時的金幣的聲音可以讓腦殘的用戶覺得愉悅。
關于另外一個小東西,通常情況下android 程序按一下返回鍵 不是都會提示 “再次按返回退出程序”么。這個其實也很簡單,按第一下記錄時間 按第二下再次記錄時間 如果時間差低于兩秒 就退出 ,否則給toast提示“再次按返回鍵退出”:
1 private boolean m_flagExit = false; 2 Date backTime = new Date("1900/1/1"); 3 4 @Override 5 public boolean onKeyDown(int keyCode, KeyEvent event) { 6 // TODO Auto-generated method stub 7 if (keyCode == KeyEvent.KEYCODE_BACK) { 8 Date nowTime = new Date(); 9 if (backTime.getYear() == nowTime.getYear() 10 && backTime.getMonth() == nowTime.getMonth() 11 && backTime.getDate() == nowTime.getDate() 12 && backTime.getHours() == nowTime.getHours() 13 && backTime.getMinutes() == nowTime.getMinutes() 14 && nowTime.getSeconds() - backTime.getSeconds() <= 2 ) { 15 return super.onKeyDown(keyCode, event); 16 } else { 17 backTime = nowTime; 18 Toast.makeText(this, "再次按返回鍵退出游戲", 500).show(); 19 return false; 20 } 21 } 22 return false; 23 }
程序設計上只要你用心去想這個事情的來龍去脈 那么你就能夠把它做成功。
另外我還自己用photoshop畫了幾個圖標 雖然有點丑
下面是完整項目代碼:
猛擊此處下載
這里是可以直接安裝的app:
猛擊此處下載
誰說做c#開發的就不能做java開發了 。java就是個蛋 只不過另外一套開發平臺 熟悉而已 ,說到底不過是工具。
手機上也可以用socket 也可以進行io 各種文件流網絡流操作? 也可以想怎么繪圖怎么繪圖 ,并且開發接口也很方便 。這他娘的就是電腦嘛? 當還沉浸在老一代PC程序員時代的時候 所謂的移動互聯網時代已經到了我們身邊? 老了 沒跟上時代的腳步 不服不行啊。
現在離開歪醫用膠片的公司了 ,算是告別吧。可能以后發的東西質量 漸差, 或者發的比較少。各位兄臺見諒