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的更多相关文章

  1. Android——Cocosd2d-x手机游戏开发学习思路

    手机APP应用如雨后春笋般冒了出来,而在众多的APP应用中,游戏占据了半壁江山.它丰富着人们的业余生活,增进了人们之间的沟通交流.也有许多开发的朋友对游戏开发情有独钟,他们不止是享受着有很多的人们去下 ...

  2. Android研究之游戏开发处理按键的响应

    1.onKeyDown 方法 onKeyDown 方法是KeyEvent.Callback 接口中的一个抽象方法,重写onKeyDown 方法能够监听到按键被按下的事件,我们先看看onKeyDown方 ...

  3. Android安卓手机游戏开发

    成都传智播客Java培训,免费学Android安卓手机游戏开发,安卓android开发课程包括Android安卓应用开发和Android安卓游戏开发两个方向,可是偏向游戏开发. 依据"199 ...

  4. Coco2d-x android win7 Python 游戏开发环境的搭建

    1:我用的电脑配置 win7 3 核 内存8G 桌面.一直想学习Coco2d 游戏开发,所以,一个星期后,需要找到,最终建立了一个良好的环境 2:我使用的版本号版本号,至于建筑android开发环境略 ...

  5. Android研究之游戏开发摄像头更新

     游戏中摄像头的原理介绍        在游戏开发中更新摄像头的位置能够决定屏幕显示的内容,尤其是RPG类游戏摄像头有着很关键的数据.我举一个样例 有时候我们在玩RPG游戏的时候进入一个新的场景 ...

  6. 基于Intel x86 Android的RAD游戏开发

    zip文件还包含编译的"MonkeyGame-debug".可以在模拟器中运行的二进制文件.在"game.build"文件夹中有一个HTML5 build.在C ...

  7. Android开发学习——搭建开发环境

    在学校开课学习了android的一些简单的UI组件,布局,四大组件学习了2个,数据存储及网络通信,都是一些简单的概念,入门而已.许多东西需要自己去学习. 学习一下 Android开发环境的搭建,两种方 ...

  8. Android项目页面跳转小Demo

    近期在做Android项目的开发,刚刚接触会有非常多新东西须要学习,从环境的搭建到语言的熟悉都是须要一步步完毕的,接下来就拿一个页面跳转的样例来和大家分享一下自己的心得体会. 採用的架构: Demo中 ...

  9. 搭建openfire Android 客户端学习和开发【二】spark源码导入eclipse

    首先声明下 这是我在eoe上转载的 写的很好就摘抄了... 第一步 下载源码 svn下载,下载地址:spark:http://svn.igniterealtime.org/svn/repos/spar ...

随机推荐

  1. js中字符串的拼接的另一种方法

    // 按一定长度截断字符串,并使用 + 运算符进行连接. // 分隔字符串尽量按语义进行,如不要在一个完整的名词中间断开. // 特别的,对于HTML片段的拼接,通过缩进,保持和HTML相同的结构. ...

  2. 开发:异常收集之 DB2建表相关问题

    第一次用DB2数据库,因为考虑到建表语句可能不一样,所以採用手动建表的办法.一个个字段去填.并勾选主键.最后发现创建失败.看了下系统生成的sql语句 sql语句例如以下: CREATE TABLE F ...

  3. QC ALM 11创建域、项目和用户

    一旦HP-ALM安装,我们仅仅能继续创建域.项目和用户使用后的ALM工作.以下是步骤来创建项目.域和用户.       一.创建域 1.对于创建域,第一步是进入站点管理员页面.开展QC使用URL - ...

  4. Java基础面试:集合、内部类、线程

    package test; import java.util.Hashtable; import java.util.Map; public class test { public static St ...

  5. 关于OutOfMemoryError的处理

    转自:http://www.blogjava.net/rosen/archive/2010/05/21/321575.html http://www.blogjava.net/rosen/archiv ...

  6. cocos2d-x中锚点设置及定位方式

    问题 在cocos2d演示样例代码HelloCpp中,为什么要将CCMenu设置位置到CCPointZero,即使CCMenu的锚点是在(0.5, 0.5)? 回答 这是由于CCMenu没有使用锚点进 ...

  7. Sql数据库查询语言

    1.概述 Sql是一种面向数据库的结构化查询语言.是符合美国国家标准化组织ANSI的一种计算机标准语言. Sql具对数据库的操作有:增删改查.创建数据库.创建表.创建存储过程.创建视图等 RDBMS关 ...

  8. [学习笔记]渗透测试metasploit

    1.渗透成功后,在meterpreter命令行,需要使用如下命令切换当前目录.更多信息,可以参考: meterpreter > pwd C:\ meterpreter > cd /&quo ...

  9. [办公应用]如何在WORD中让英文网址可以在字符中间换行

    有时候我们写文章,存在中英文混合录入的情况.一般情况下,office 2003的word软件中,会自作聪明的避免单词断行显示,也就是说它会默认尽量把一个单词显示在某一行内,从而避免单词被分开.但有时候 ...

  10. Koa2学习(九)与mongoDB交互

    Koa2学习(九)与mongoDB交互 数据库下载与安装 windows下载地址:http://dl.mongodb.org/dl/win32/x86_64 linux下载地址:https://www ...