android游戏开发笔记(1)——画图及输入响应(一只被玩弄的老鼠)
琴弦jerry的博客主站地址:http://www.jerry-zhang.com
浏览更多技术博客,请移步至:http://www.jerry-zhang.com
本着实践和动手第一的原则,我稍稍看了一些资料和简单的开发代码之后,对游戏开发有了一个初步的认识。迫不及待想要弄一个小东西。一定要让个什么东西在即的手中动起来。一开始我是想到了之前我都手机上的那个直升飞机游戏。飞机一直下落,按下一个键飞机就飞高。一高一低的躲避前面的障碍物。 不过自己不知道什么原因就想到了一只逃跑的老鼠被人用绳子绑住了尾巴。(看,人们总是这么残忍。)
? ? ?上一篇文章本来就想写这个demo。结果前面开篇扯了一些游戏的相关知识,没想到就一大篇了,所以上一篇单独一篇作为预备知识(觉的自己很无耻)。
? ? ?下看看丑陋的最后界面效果图。期望不要太高,本篇只是简单的画图、按键触摸屏的输入响应。只是简单的可以动。
?
?
?
? ? 嘿嘿,一直悲惨的老鼠,图片资源来自google图片搜索。
这个project 结构介绍。
? ? ?其实就是比基本的helloword多了一个自己定义的DrawView该类继承自View,主要用来显示图画。一个Activity类 主要用来接收按键和触屏事件。然后放只老鼠在drawable里面,这里我气的名字叫mouse ,以后我们就可以用R.drawable.mouse 召唤老鼠。? ? ?就这么两个java文件。让我先来唧唧歪歪一大段,然后放出大家,如果你觉得罗嗦直接忽略汉字看代码。
? ? ?先看GameTestActivity (就是该project中唯一的Activity)
? ? ?? ? ?直接在Oncrate方法里面设置主view 为我们自定义DrawView。
? ? ?重写onKeyUp,onKeyDown 方法来接收按键事件,然后处理。(你的手机或者模拟器上需要有按键哦—— 废话么 ~)
? ? ?重写onTouchEvent方法用来接收触屏事件,然后处理。(亲,你的手机或者模拟器要有屏幕,并且可以触摸或点击哦。——找打!)
? ? ?然后看我们的DrawView,用来显示动画,负责绘制和刷新画面。
? ? ?写构造器,构造器里面主要是初始化 画笔 及老鼠的初始坐标。? ? ?重写onDraw方法 ,该方法在构造器后执行,用来绘制该view的界面,调用invalidate 可以再次调用该方法,重新绘制view界面。
? ? ?自己写个让老鼠向左向右移动的方法 moveLeft 和moveRight 。
- void?moveLeft()?{??
- x--;??
- invalidate();??
- }??
- ?
- void?moveRight()?{??
- x+=3;//为了让向右跑的时候可以更快些?幅度设置为3.??
- invalidate();??
- }?
?
? ? ?然后需要让这个老鼠自动往左跑。我们添加一个handler 和 timer 以及 timertast ,用来不断更新图像。
? ? ?注意,这里不是让图像自动更新最好的办法,有待更好的方法。?
代码
废话说完了 上代码。更消息的请大家看注释。在代码中注释起来还是比较清楚一些。
GameTestActivity.java
package?com.qxjerry.game;??
?
import?android.app.Activity;??
import?android.os.Bundle;??
import?android.view.KeyEvent;??
import?android.view.MotionEvent;??
?
public?class?GameTestActivity?extends?Activity?{??
DrawView?mDrawView;//定义成变量?后面我们利用这个对象引用调用让老鼠移动的方法。??
?
@Override??
public?void?onCreate(Bundle?savedInstanceState)?{??
super.onCreate(savedInstanceState);??
mDrawView?=?new?DrawView(this);??
setContentView(mDrawView);//设置主view??
}??
?
private?void?pullMouse(boolean?pull){??
mDrawView.setPulling(pull);//?将?pull的标识位?表示为?true?or?false?。??
if(pull){??
mDrawView.moveRight();//向右拉老鼠,老鼠向右移动??
}??
?
}??
@Override??
public?boolean?onTouchEvent(MotionEvent?event)?{??
switch?(event.getAction())?{??
case?MotionEvent.ACTION_UP:??
pullMouse(false);//false?表示放开了老鼠没有拉了。??
break;??
case?MotionEvent.ACTION_DOWN:??
//这里和按键的效果不懂,触屏需要不断的触碰屏幕。就是不断的离开屏幕,触摸屏幕。而按键的down不同??
pullMouse(true);//true?为正在向右拉。??
break;??
default:??
break;??
}??
return?true;??
}??
?
@Override??
public?boolean?onKeyUp(int?keyCode,?KeyEvent?event)?{??
switch?(keyCode)?{??
//按键放开的时候,放开的瞬间??
case?KeyEvent.KEYCODE_SEARCH:??
pullMouse(false);??
break;??
default:??
break;??
}??
return?true;??
}??
?
@Override??
public?boolean?onKeyDown(int?keyCode,?KeyEvent?event)?{??
switch?(keyCode)?{??
//和触屏不同,一直按着也可以触发事件??
case?KeyEvent.KEYCODE_SEARCH:??
pullMouse(true);??
break;??
?
default:??
break;??
}??
return?true;//返回true?按键事情不再传递,事件在该方法中消化。??
}??
}?
DrawView.java
- DrawView.java代码请查看这里?
- 链接:http://www.jerry-zhang.com/index.php/2011/09/28/android-game-dev-1-ondraw-ontouch-onkey-a-mouse/?
解释说明
简单解释一下代码中涉及到的一些方法。?
Timer的schedule方法介绍
mTimer.schedule(mTimerTask, 5, 50);
该方法第一个参数是一个线程,就是要不断执行的任务描述。这里我们是不断的发送让老鼠向左移动的命令。
第二个参数 是第一次执行该方法间隔的毫秒数
第三个参数 是后面执行该方法时 需要间隔的时间 毫秒单位
一个砍人的现场
你会感觉到 handler像一个刽子手,随时等候各种不动的命令。而timertast 想一个小领导,或者一个发命令的机器。
而timer的schedule 就像是总指挥。
这个时候你就感觉是总指挥给小领导说你每过2分钟给刽子手发个命令。
而小领导就美国2分钟发个命令给刽子手, 每过2分钟给刽子手是 “砍!” 。
而刽子手听到 “砍!” 就直接砍了。
到这里应该比较清楚的说明了这只可怜的丑陋的老鼠是如何被我们玩弄的了。大家可以玩弄自己想玩弄的东西。不要太暴力哦。?
? ? 刚刚开始学习游戏开发,文章总有不准确或者错误之处,还请各位一定指出。? ? 至于本文中的整体项目代码我计划随着文章的更新,将会有一个比较完善一个的版本,那个时候统一上传,提供大家下载。
不过如果有朋友需要该文章中代码也可以直接联系我索取。
琴弦jerry的博客主站地址:http://www.jerry-zhang.com
浏览更多技术博客,请移步至:http://www.jerry-zhang.com