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 ...
随机推荐
- mongodb数据出现undefined如何查询
某些字段出现undefined,该如何查询? 如下: db.getCollection('license').find({"holder_code":{$type:"un ...
- Python安装Mysql驱动出错解决(最新出炉)
Python中最连接Mysql常用的驱动是 mysql-python :mysql的C语言的驱动 mysql-connector:msql官方的驱动 pymysql:python语言的驱动 我这里安装 ...
- 对ASP.NET MVC 的路由一点理解
这个东西,真搞不懂.看了网上的教程和文章,也不懂(也不清楚写那些文章的人自己是否真的懂).只好靠自己一顿乱摸索. 好比说,下面这个路由: //路由1 config.Routes.MapHttpRout ...
- CRM 2011 开发中遇到的问题小结
1.将Retrive 方法改成 RetrieveMultiple时 如果指定的ColumnSet 没有指定主键(entiryname+id),要显示增加实体的主键.否则在调用 Retrieve方法时返 ...
- 原生js写简单轮播图方式1-从左向右滑动
轮播图就是让图片每隔几秒自动滑动,达到图片轮流播放的效果.轮播图从效果来说有滑动式的也有渐入式的,滑动式的轮播图就是图片从左向右滑入的效果,渐入式的轮播图就是图片根据透明度渐渐显示的效果,这里说的是实 ...
- ToolBar修改返回按钮图标
使用Toolbar时,有时因为不同的手机设备,不能使用系统默认的主题样式或者图标,必须指定特定的资源,防止APP在不同设备上的效果不一样! 我在使用Toolbar时,把这个布局作为一个公共的了,所以修 ...
- 删除oracle数据库用户的dba权限(当出现同一用户DBA可以登录,normal不能登录)“无法对SYS拥有的对象创建触发器”
系统报错:“无法对SYS拥有的对象创建触发器”,搞不懂是什么原因了,到底这触发器要用什么用户才能建立啊? ORA-04089: 无法对 SYS 拥有的对象创建触发器 第一种方式: 首先,用sys用户a ...
- Masonry 动画更新约束
前言 说到iOS自动布局,有很多的解决办法.有的人使用xib/storyboard自动布局,也有人使用frame来适配.对于前者,笔者并不喜欢,也不支持.对于后者,更是麻烦,到处计算高度.宽度等,千万 ...
- Java-Runoob-高级教程-实例-字符串:07. Java 实例 - 字符串分割
ylbtech-Java-Runoob-高级教程-实例-字符串:07. Java 实例 - 字符串分割 1.返回顶部 1. Java 实例 - 字符串分割 Java 实例 以下实例使用了 split ...
- 异常处理:Cannot attach the file as database 'membership'.
Cannot attach the file 'D:\GitHome\cae\CAE\App_Data\membership.mdf' as database 'membership'. 说明: 执行 ...