前面的,口水話 請直接跳過。java
雖然如今不比之前了 也沒多少人氣了,放到首頁 都不到幾百的點擊量。也許博客園總體水平也是在往水的方向發展。不談那些了,哥也曾經輝煌過 有過一天上千的點擊量 ,哥也曾經有過粉絲,被小妹稱爲大神去指點問題,雖然這大神水分有點重。android
人都是有虛榮心的 正是由於這樣激勵着我持續學習技術,去探索。 纔有我持續發表技術博文的動力。我寫的都是本身真切實意的關於技術的心得經驗 並非純控件 使用demo 或者商業數據庫項目那種碼農式的代碼。有那麼一丁點算法或者技術上的技巧 屬於我本身的偏好 可是大多數智商水平也就小學 ,就圖像處理那幾篇 用到的算法原理也就超過初中智商水平一點點。程序員
從四年前進歪醫用膠片公司發俄羅斯方塊的博文開始就一直持續不斷的激勵着我,而後一有東西我都記錄下來。不說了 要點擊量就去寫小說了 還有錢。算法
正文,到博客園從寫c#俄羅斯方塊開始 ,可能有的朋友已經把它忘了。那麼咱們又來寫俄羅斯方塊 只不過此次是android版的 。也許是結束 ,也許是新的開始呢。數據庫
主代碼在原來c#基礎上改的 基本上沒怎麼動,若是你見過原來的版本 一看就明白 仍是那幾個類。對於android平臺的開發本身看書 自己沒幾天 勿噴。c#
遊戲主要邏輯類三個 game gamearea shape,這裏多了個point 由於c#裏有用於定位的值類型Point ,java裏沒有 那麼咱們就爲他手動定義一個 省得改動其餘邏輯代碼 。數組
先說game類 ,new game() 既表明初始化了一個遊戲,之前c#版本 遊戲數據直接在form裏經過gdi重繪 ,遊戲數據展示給使用者 這是最基本的。因此我讓game類變成自定義控件 繼承自view 一來我能夠經過這種方式把它放到主界面 二來遊戲數據發生改變須要重繪的時候 能夠經過自帶的函數重繪。sass
其餘的基礎代碼方面 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程序員時代的時候 所謂的移動互聯網時代已經到了咱們身邊 老了 沒跟上時代的腳步 不服不行啊。
如今離開歪醫用膠片的公司了 ,算是告別吧。可能之後發的東西質量 漸差, 或者發的比較少。各位兄臺見諒