/**
* 矩形碰撞
*
* @time 上午11:29:26
* @author retacn yue
* @Email zhenhuayue@sina.com
*/
@SuppressWarnings("unused")
public class RectCollisionSurfaceView extends SurfaceView implements Callback, Runnable {
private int screenX, screenY;
private SurfaceHolder sfh;
private Thread thread;
private Canvas canvas;
private boolean flag;
private Paint paint;
// 两个矩形的宽高/坐标
private int x1 = 10, y1 = 100, w1 = 50, h1 = 50;
private int x2 = 100, y2 = 100, w2 = 50, h2 = 50;
// 是否发生碰撞
private boolean isCollision;
public RectCollisionSurfaceView(Context context) {
super(context);
sfh = this.getHolder();
sfh.addCallback(this);
paint = new Paint();
paint.setColor(Color.WHITE);
paint.setAntiAlias(true);
this.setFocusable(true);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
screenX = this.getWidth();
screenY = this.getHeight();
flag = true;
thread = new Thread(this);
thread.start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
flag = false;
}
@SuppressWarnings("static-access")
@Override
public void run() {
while (flag) {
try {
long start = System.currentTimeMillis();
// 绘图
draw();
// 游戏逻辑
logic();
long end = System.currentTimeMillis();
if (end - start < 50) {
thread.sleep(50 - (end - start));
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
* 绘制图形
*/
private void draw() {
try {
canvas = sfh.lockCanvas();
if (null != canvas) {
canvas.drawColor(Color.BLACK);
if (isCollision) {
paint.setColor(Color.RED);
paint.setTextSize(20);
canvas.drawText("Collision!", 0, 30, paint);
} else {
paint.setColor(Color.WHITE);
}
// 绘制两个矩形
canvas.drawRect(x1, y1, x1 + w1, y1 + h1, paint);
canvas.drawRect(x2, y2, y2 + w2, y2 + h2, paint);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != canvas) {
sfh.unlockCanvasAndPost(canvas);
}
}
}
/**
* 游戏逻辑
*/
private void logic() {
}
/**
* 检察是否发 生碰撞
*
* @param h2
* @param w2
* 矩形一的四个坐标
* @param y2
* @param x2
*
* @param h1
* @param w1
* 矩形二的四个坐标
* @param y1
* @param x1
*/
private boolean isCollidionRect(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2) {
/************ 分四种情况 **************/
// 图片一位于图片二的上方
if (y1 <= y2 && y1 + h1 < y2) {
return false;
}
// 位于下方
if (y2 <= y1 && y2 + h2 < y1) {
return false;
}
// 位于左边
if (x1 <= x2 && x1 + w1 < x2) {
return false;
}
// 位于右边
if (x1 >= x2 && x1 >= x2 + w2) {
return false;
}
return true;
}
/********************** 事件临听 *************************/
@Override
public boolean onTouchEvent(MotionEvent event) {
// 图片1随鼠标移动 (根据触摸到的焦点来取得图片的位置)
x1 = (int) event.getX() - w1 / 2;
y1 = (int) event.getY() - h1 / 2;
// 检察是否发生碰撞()
if (isCollidionRect(x1, y1, w1, h1, x2, y2, w2, h2)) {
isCollision = true;
} else {
isCollision = false;
}
return super.onTouchEvent(event);
}
/*********************************************************/
}
分享到:
相关推荐
Android Studio 游戏摇杆开发教程,仿王者荣耀...我们从游戏摇杆的基本结构开始,了解了摇杆的多点触控和数学知识的应用,并详细介绍了游戏摇杆的开发思路和实现方法。希望本文能够为您提供有价值的参考和学习价值。
Android程序开发学习平台是一款针对Android操作系统的应用,旨在为开发者提供便捷的学习途径,使得学习者能够随时随地通过智能手机进行Android编程的学习。随着Android在全球市场的占有率不断攀升,Android应用开发...
4-16-1(游戏保存之SharedPreference) 4-16-2(游戏保存之Stream) 4-3(View游戏框架) 4-4(SurfaceView游戏框架) 4-7-1(贝塞尔曲线) 4-7-2(Canvas画布) 4-8(Paint画笔) 4-9(Bitmap位图渲染与操作) 5-1(飞行射击游戏实战...
在Android平台上,开发一款商业级的水彩蜡笔涂鸦应用是一项挑战性的任务,涉及到许多技术细节...通过研究源码,开发者不仅能学习到具体的编程技巧,还能了解如何构建一个完整的商业化应用,提升自己的Android开发能力。
安卓航班网还提供了多本Android开发书籍的下载链接,这些书籍覆盖了从基础到进阶的不同阶段,非常适合想要深入学习Android开发的读者。 #### 1. 四本很给力的Android书籍 这四本书籍是精心挑选的,涵盖了Android...
《Android 4游戏编程入门经典》囊括了成为一名成功的Android游戏开发者所需的全 部知识。本书是一本可以信赖的指南,能够帮助你在移动游戏开发中迅速“升级”。学完 本书并加以融会贯通,就能够编写出成功的Android...
在Android平台上实现一个屏幕画笔工具,涉及到许多关键的技术点,包括图形绘制、触摸事件处理、用户交互设计等。下面将详细阐述这些知识点。 首先,Android的图形绘制主要依赖于Canvas和Paint对象。Canvas提供了...
在Android平台上,图像处理是一个广泛且重要的领域,尤其在移动应用开发中,用户对视觉体验的需求日益提升。本文将深入探讨“Android图像处理之画笔特效处理”这一主题,通过一个具体的demo来展示如何在Android应用...
在Android游戏开发中,开发者需要掌握一系列基础知识和实践经验。本文主要围绕如何开发一个简单的Android游戏,如俄罗斯方块,来探讨关键的技术...在实践中不断学习和优化,将使你在Android游戏开发的道路上越走越远。
通过研究这些案例,开发者可以学习到Android应用开发的各种技术,包括UI设计、游戏开发、动画制作、用户交互、数据处理等方面的知识。实践这些案例不仅能提升编程技能,还能加深对Android SDK的理解,从而能够独立...
在Android开发中,"android笔画回放"是一个有趣且实用的功能,它允许用户在屏幕上进行书写或绘画,然后系统能够记录并回放这些笔画的动作。这一特性常见于绘图应用、教育软件或者笔记应用中,为用户提供了一种交互式...
【Android游戏开发:打豆豆源码解析...通过深入研究源码,开发者可以学习到Android游戏开发的基础流程和技巧,进一步提升自己的编程技能。对于初学者来说,这是一份宝贵的实践资料,有助于理解Android游戏开发的全貌。
android实现毛笔效果,可以模拟毛笔字的感觉,体验毛笔涂鸦
在Android游戏开发中,自定义手势是一种增强用户体验和交互性的关键技术。本文主要探讨的是输入法手势技术,这是一种允许用户通过特定的手势操作来触发游戏内特定事件的方法。例如,用户可以画个圆来切换背景,或者...
让小朋友在手机上看动画演示笔画顺序,然后...本章将使用 Android技术开发一款书写数字的游戏,让小朋友在玩中学会写数字。欢乐写数字程序集合了页面布局、设置颜色、动画演示、背量景音乐、添加功能按钮及对话框等技术。
通过深入学习和理解`Canvas`和`Paint`的使用,以及源码背后的实现逻辑,开发者可以更好地控制Android应用程序的视觉表现,创造出丰富多彩的用户体验。在实践中不断探索和优化,将使你的Android开发技能更上一层楼。
但他最终决定重新拿起笔来,向广大Android学习爱好者介绍自定义组件的开发,希望通过这种方式为读者铺平通往更高开发层次的道路。 李赞红在书中采用了一种类似于聊天的方式,试图通过这种方式与读者进行心灵上的...