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. 纯C语言实现简单封装继承机制

    0 继承是OO设计的基础 继承是OO设计中的基本部分,也是实现多态的基础,C++,C#,Objective-C.Java.PHP.JavaScript等为OO而设计的语言,其语言本身对实现继承提供了直 ...

  2. 一个关于MYSQL IFNULL的用法

    select a.receiveID,(a.num - IFNULL(b.num,0)) as num from (SELECT num,receiveID from dog_giftnumrecor ...

  3. sshclientCRT连接linux使用技巧

    设置仿真和回滚缓冲区 字体外观设置 日志文件设置 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fi ...

  4. bat文件中调用传参的问题

    https://blogs.msdn.microsoft.com/twistylittlepassagesallalike/2011/04/23/everyone-quotes-command-lin ...

  5. YTU 2875: 倒霉蛋买饭去

    2875: 倒霉蛋买饭去 时间限制: 1 Sec  内存限制: 128 MB 提交: 22  解决: 17 题目描述 早春星期天的某个早晨,大风呼呼地刮.一个宿舍n个人,谁也不想起床买饭去.他们定了一 ...

  6. 【Selenium】HTML/XML/XPATH基础

    Html超文本标记语言 网页上单击右键→查看源文件/查看源代码 Html基本结构 <html>               为文档根元素,所有元素都在内部进行 <head>   ...

  7. Lucene dvd dvm文件便是docvalues文件——就是针对field value的列存储

    public final class Lucene54DocValuesFormat extends DocValuesFormat Lucene 5.4 DocValues format. Enco ...

  8. 整型变量修饰符,char类型数据存储原理,字节数,

    //------------------整型变量修饰符 修饰符(int short long longlong signed unsigned)所有修饰符都是用来修整形 int 4short %hd ...

  9. Watir: 很久以前,对Watir开始学习时候做的笔记

    1). buttons Xpath 1)Button properties browser.button(:xpath,"//input[@id='b2']/").name bro ...

  10. MemCache在Windows下环境的搭建及启动

    sc create "memcached-11212" start= auto binPath= "D:\memcached_en32or64\x64\memcached ...