Android开发学习——游戏开发小demo
public class MainActivity extends Activity { private GameUI gameUI; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
gameUI = new GameUI(getApplicationContext());
setContentView(gameUI);
} //处理屏幕的点击事件
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
gameUI.handleTouch(event);
return super.onTouchEvent(event);
} }
public class GameUI extends SurfaceView implements SurfaceHolder.Callback{
boolean flag ;
private RenderThread thread;
private SurfaceHolder h;
//-----三个对象------------------
private Man man;
private List<face> falist;
private MyButton btn; public GameUI(Context context) {
super(context); h = getHolder();
h.addCallback(this);
} public class RenderThread extends Thread{
public void run(){
while(flag){
try{
drawUI();
}catch(Exception e){
e.printStackTrace();
}
}
} //------------------------------------------------------------------------ //绘制界面
private void drawUI() {
// TODO Auto-generated method stub
Canvas lockCanvas = h.lockCanvas();
//--------------------绘制了一个矩形---------------------------------------
Paint paint = new Paint();
paint.setColor(Color.GRAY);
//----------绘制屏幕大小的矩形,把之前绘制的全部盖在下边---------------------
lockCanvas.drawRect(0, 0,getWidth(),getHeight(),paint);
//------------------------------------------------------------ -----------
man.drawSelf(lockCanvas);//把男孩绘制到屏幕上
// if(fa != null){
// fa.drawSelf(lockCanvas);//把笑脸绘制在界面上
// fa.move();
// }
for(face fa : falist){
fa.drawSelf(lockCanvas);//把笑脸绘制在界面上
fa.move();
if(fa.position.x<0||fa.position.x>getWidth()||fa.position.y<0||fa.position.y>getHeight()){
falist.remove(fa);
}
} btn.drawSelf(lockCanvas);//把按钮绘制在界面上 h.unlockCanvasAndPost(lockCanvas);
}
} @Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { } @Override
public void surfaceCreated(SurfaceHolder h) { Bitmap manbitmap = BitmapFactory.decodeResource(getResources(), R.drawable.avatar_boy);
man = new Man(manbitmap, new Point(0,0));//创建了 小人,还没有绘制到界面上
falist = new CopyOnWriteArrayList<face>();//可以在集合遍历的过程中增加或者删除元素。堆内存的开销大,对数组进行了一次复制! //------------现在不在这个位置位置绘制笑脸,在小人的最上绘制------
// Bitmap facebitmap = BitmapFactory.decodeResource(getResources(), R.drawable.rating_small);
// fa = new face(facebitmap,new Point(0,0));//创建了笑脸
//-----------------按钮---------------------------------------------------------
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bottom_default);
Bitmap pressbitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bottom_press);
btn = new MyButton(bitmap, new Point(100,getHeight()-100),pressbitmap);//创建了一个button,还没有绘制到屏幕上
btn.setClicklistener(new MyButton.OnClickListener() { @Override
public void click() {
// TODO Auto-generated method stub
man.move(Man.DOWN);
}
}); thread = new RenderThread();
flag = true;
thread.start();
} @Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
//一般停止线程,都是控制线程的循环
flag = false;
} public void handleTouch(MotionEvent e){
switch(e.getAction()){
//case MotionEvent.ACTION_MOVE: //当按下的时候,绘制笑脸
case MotionEvent.ACTION_DOWN:
//拿到按下的xy坐标
int x = (int) e.getRawX();
int y = (int) e.getRawY();
if(btn.isclick(new Point(x,y))){
//man.move(Man.DOWN);
btn.click();
}else{//按下的时候不显示笑脸
face f = man.createface(getContext(),new Point(x,y));
falist.add(f);
}
break;
case MotionEvent.ACTION_UP:
btn.setIsClick(false);//当手指弹起的时候,让按钮点击的状态改为false
break;
default:
break;
}
}
}
//精灵,所有显示界面的一个基类。
public abstract class Sprite {
private Bitmap defaultBitmap;//默认显示的图片
protected Point position;//位置 //放置 图片和位置 为空
public Sprite(Bitmap defaultBitmap, Point position) {
super();
this.defaultBitmap = defaultBitmap;
this.position = position;
} //绘制自身 就是把图片绘制到位置上
public void drawSelf(Canvas c){
c.drawBitmap(defaultBitmap, position.x,position.y, null);
} }
public class Man extends Sprite { public static final int DOWN=0;
public Man(Bitmap defaultBitmap, Point position) {
super(defaultBitmap, position);
// TODO Auto-generated constructor stub
} //特性方法,创建笑脸
public face createface(Context c,Point touchpoint){ Bitmap facebitmap = BitmapFactory.decodeResource(c.getResources(), R.drawable.rating_small);
face fa = new face(facebitmap,new Point(position.x+50,position.y+50),touchpoint);//创建了笑脸,在小人的坐标上刚好到嘴的地方绘制笑脸。 return fa; } public void move(int d){
if(d == DOWN){
this.position.y += 6;
}
} }
public class face extends Sprite { //移动的距离是一个固定的值
int speed = 6;
private int tx;
private int ty;
public face(Bitmap defaultBitmap, Point position,Point touch) {
super(defaultBitmap, position);
// TODO Auto-generated constructor stub
int x = touch.x - position.x;
int y = touch.y - position.y;
int d = (int) Math.sqrt(x*x+y*y);
tx = speed*x/d;
ty = speed*y/d; } //笑脸移动的方法
public void move(){
this.position.x += tx;
this.position.y += ty;
} }
public class MyButton extends Sprite { private OnClickListener clicklistener;
public interface OnClickListener{
void click();
} public void setClicklistener(OnClickListener clicklistener) {
this.clicklistener = clicklistener;
} //当按钮被点击的时 调用此方法
public void click(){
if(clicklistener!=null){
clicklistener.click();
}
} private boolean isclick;//按下的状态
private Bitmap pressBit;
public MyButton(Bitmap defaultBitmap, Point position,Bitmap pressBit) {
super(defaultBitmap, position);
// TODO Auto-generated constructor stub
this.pressBit = pressBit;
} public void setIsClick(boolean isClick){
this.isclick = isClick;
} public void drawSelf(Canvas c){
if(isclick){
//绘制一个按下的图片
c.drawBitmap(pressBit, position.x,position.y, null);
}else{
super.drawSelf(c);//绘制默认的图片
}
} //判断 手指按下的点 是否 在 当前按钮的 图片之中
public boolean isclick(Point touchpoint){
//创建了一个矩形,当前按钮的矩形
Rect rect = new Rect(position.x,position.y,position.x+pressBit.getWidth(),position.y+pressBit.getHeight());
//如果包含,就为点击
isclick = rect.contains(touchpoint.x,touchpoint.y );
return isclick;
} }
Android开发学习——游戏开发小demo的更多相关文章
- Android——Cocosd2d-x手机游戏开发学习思路
手机APP应用如雨后春笋般冒了出来,而在众多的APP应用中,游戏占据了半壁江山.它丰富着人们的业余生活,增进了人们之间的沟通交流.也有许多开发的朋友对游戏开发情有独钟,他们不止是享受着有很多的人们去下 ...
- Android研究之游戏开发处理按键的响应
1.onKeyDown 方法 onKeyDown 方法是KeyEvent.Callback 接口中的一个抽象方法,重写onKeyDown 方法能够监听到按键被按下的事件,我们先看看onKeyDown方 ...
- Android安卓手机游戏开发
成都传智播客Java培训,免费学Android安卓手机游戏开发,安卓android开发课程包括Android安卓应用开发和Android安卓游戏开发两个方向,可是偏向游戏开发. 依据"199 ...
- Coco2d-x android win7 Python 游戏开发环境的搭建
1:我用的电脑配置 win7 3 核 内存8G 桌面.一直想学习Coco2d 游戏开发,所以,一个星期后,需要找到,最终建立了一个良好的环境 2:我使用的版本号版本号,至于建筑android开发环境略 ...
- Android研究之游戏开发摄像头更新
游戏中摄像头的原理介绍 在游戏开发中更新摄像头的位置能够决定屏幕显示的内容,尤其是RPG类游戏摄像头有着很关键的数据.我举一个样例 有时候我们在玩RPG游戏的时候进入一个新的场景 ...
- 基于Intel x86 Android的RAD游戏开发
zip文件还包含编译的"MonkeyGame-debug".可以在模拟器中运行的二进制文件.在"game.build"文件夹中有一个HTML5 build.在C ...
- Android开发学习——搭建开发环境
在学校开课学习了android的一些简单的UI组件,布局,四大组件学习了2个,数据存储及网络通信,都是一些简单的概念,入门而已.许多东西需要自己去学习. 学习一下 Android开发环境的搭建,两种方 ...
- Android项目页面跳转小Demo
近期在做Android项目的开发,刚刚接触会有非常多新东西须要学习,从环境的搭建到语言的熟悉都是须要一步步完毕的,接下来就拿一个页面跳转的样例来和大家分享一下自己的心得体会. 採用的架构: Demo中 ...
- 搭建openfire Android 客户端学习和开发【二】spark源码导入eclipse
首先声明下 这是我在eoe上转载的 写的很好就摘抄了... 第一步 下载源码 svn下载,下载地址:spark:http://svn.igniterealtime.org/svn/repos/spar ...
随机推荐
- 【C/C++学院】0901-设计模式的汇总演练
备忘录模式 数据库的备份,文档编辑中的撤销等功能 #include <iostream> #include <string> #include <vector> u ...
- C#中泛型方法与泛型接口 C#泛型接口 List<IAll> arssr = new List<IAll>(); interface IPerson<T> c# List<接口>小技巧 泛型接口协变逆变的几个问题
http://blog.csdn.net/aladdinty/article/details/3486532 using System; using System.Collections.Generi ...
- Swift String 一些经常用法
直接上代码 //字符串 //1 推断字符串是否为空 var test1Str="" var test1Str2:String = String(); println("t ...
- 十分简洁的手机浏览器 lydiabox
没有地址栏,没有工具栏.web app无需下载.无需安装.无需更新,加入即用:再也不用记住网址.更不用输入网址--一款这样极简极方便的浏览器,你想要吗? 我们做了一个十分简洁的手机浏览器,这个浏览器也 ...
- 关于OutOfMemoryError的处理
转自:http://www.blogjava.net/rosen/archive/2010/05/21/321575.html http://www.blogjava.net/rosen/archiv ...
- Statement 与 PreparedStatement 区别
Statement由方法createStatement()创建,该对象用于发送简单的SQL语句 PreparedStatement由方法prepareStatement()创建,该对象用于发送带有一个 ...
- (14)javaWeb中的HttpServletResponse类详解
如果希望了解请求和响应的详细内容,可以看我的“HTTP协议”系列文章 响应体的简单概述: a,响应报文结构: b,常见的状态码,返回服务器处理的结果: c,常见的响应头: HttpServletRes ...
- 一步一步学Silverlight 2系列(3):界面布局
述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...
- 服务器开发入门——理解异步I/O
对于服务器程序,I/O是制约系统性能最关键的因素.对于需要处理大量连接的高并发服务器程序,异步I/O几乎是不二的选择.Linux和Windows都为异步I/O构建了大量的基础设施.本文总结了一下Lin ...
- Linux设备模型 (4)
<Linux设备模型 (2)>和<Linux设备模型 (3)>主要通过一些简单的实作介绍了kobject.kset.kobj_type.attribute等数据结构的用法,但这 ...