您的位置:首页 > 移动开发 > Android开发

【读书笔记《Android游戏编程之从零开始》】18.游戏开发基础(碰撞检测)

2014-12-26 15:25 316 查看
1.矩形碰撞
所谓矩形碰撞,就是利用两个矩形之间的位置关系来进行判断,如果矩形的像素在另外一个矩形之中,或者之上都可以认为这两个矩形发生了碰撞。
如果单纯的去考虑哪些情况会判定两个矩形发生碰撞,倒不如反思考虑两个矩形之间不发生碰撞的几种情况。其实两个矩形不发生碰撞的情况就上下左右这四种。
下面通过实例项目来完成对应的四种判定。
先看实例效果图:

import android.content.Context;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Region;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;

/**
*
* @author David
*
*/
public class MySurfaceView extends SurfaceView implements Callback, Runnable {
// 用于控制SurfaceView 的大小、格式等,并且主要用于监听SurfaceView 的状态
private SurfaceHolder sfh;
// 声明一个画笔
private Paint paint;
// 声明一个画布
private Canvas canvas;
// 声明一个线程
private Thread th;
// 线程消亡的标识符
private boolean flag;
// 声明屏幕的宽高
private int screenW, screenH;

// 定义碰撞矩形
private Rect rect = new Rect(0, 0, 50, 50);
// 定义Region类实例
private Region r = new Region(rect);
// 表示是否发生碰撞的标识位
private boolean isInclude;

/**
* SurfaceView 初始化函数
*
* @param context
*/
public MySurfaceView(Context context) {
super(context);
// 实例SurfaceView
sfh = this.getHolder();
// 为SurfaceView添加状态监听
sfh.addCallback(this);
// 实例一个画笔
paint = new Paint();
// 设置字体大小
paint.setTextSize(20);
// 设置画笔的颜色
paint.setColor(Color.WHITE);
// 设置画布无锯齿
paint.setAntiAlias(true);
// 设置焦点
setFocusable(true);
}

/**
* SurfaceView 视图状态发生改变时,响应此函数
*/
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {

}

/**
* SurfaceView 视图创建,响应此函数
*/
@Override
public void surfaceCreated(SurfaceHolder holder) {
screenW = this.getWidth();// 屏幕的宽
screenH = this.getHeight();// 屏幕的高
flag = true;
// 实例线程
th = new Thread(this);
// 启动线程
th.start();
}

/**
* SurfaceView 视图消亡时,响应此函数
*/
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
flag = false;
}

/**
* 游戏绘图
*/
private void myDraw() {
try {
// 获取SurfaceView 的Canvas 对象,
canvas = sfh.lockCanvas();
if (canvas != null) {
// 刷新画布,背景为黑色
canvas.drawColor(Color.BLACK);
// 标识位为真时,绘制icon图
if (isInclude) {
canvas.drawBitmap(BitmapFactory.decodeResource(
this.getResources(), R.drawable.ic_launcher), 100,
50, paint);
}
// 绘制矩形区域(便于观察)
canvas.drawRect(rect, paint);
}
} catch (Exception e) {

} finally {
if (canvas != null) {
// 解锁画布和提交
sfh.unlockCanvasAndPost(canvas);
}
}
}

/**
* 触屏事件监听
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
// 判定用户触屏的坐标点是否在碰撞矩形内
if (r.contains((int) event.getX(), (int) event.getY())) {
isInclude = true;
} else {
isInclude = false;
}
return true;
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
return super.onKeyDown(keyCode, event);
}

/**
* 游戏逻辑
*/
private void logic() {
}

@Override
public void run() {
while (flag) {
long start = System.currentTimeMillis();
myDraw();
logic();
long end = System.currentTimeMillis();
try {
if (end - start < 50) {
Thread.sleep(50 - (end - start));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}


View Code

本文地址:/article/4867244.html

PS:本文由[b]Y灬叶小超原创,如有转载请注明出处,谢谢![/b]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: