前面的,口水话 请直接跳过。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程序员时代的时候 所谓的移动互联网时代已经到了咱们身边 老了 没跟上时代的脚步 不服不行啊。
如今离开歪医用胶片的公司了 ,算是告别吧。可能之后发的东西质量 渐差, 或者发的比较少。各位兄台见谅