Java简单游戏开发之碰撞检测 推荐 原创 kiritor 2013-06-18 08:00:43 博主文章分类:【Java】 ©著作权 文章标签 Java 碰撞检测 Rectangle java游戏 文章分类 游戏开发 ©著作权归作者所有:来自51CTO博客作者kiritor的原创作品,请联系作者获取转载授权,否则将追究法律责任 前言 不久之前在论坛上有人发贴,使用java编写的超级马里奥如何实现碰撞检测,笔者自己以前 也做过Tank大战。里面同样涉及到碰撞检测,翻翻U盘里的东西还在,什么时候也给共享出来。 这篇文章就简单游戏中的碰撞检测做一个简单的总结。首先需声明的是这里只是2D的碰撞检测。 文章出处地址:http://blog.csdn.net/kiritor/article/details/8948097 碰撞检测 对于形状之间如何来判断是否是碰撞的这要根据具体的形状来定。在新手练手的小游戏中, 物体形状一般可以设定为矩形区域,这类规则图形。它的碰撞检测可以通过java API中的 Rectangle类来实现碰撞的检测。 规则图形碰撞检测(Rectangle) 首先我们查看API关于Rectangle类的介绍:它就是指定坐标空间的一个区域,这个区域是通过 指定左上角x、y坐标和去高度和宽度来确定的。 接下来看起具体的方法public Rectangleintersection(Rectangle r),这个方法就是碰撞检测 的关键了,如果两个Rectangle对象有交集,那么他们就有碰撞了。而每个形状我们都可以得到他 们的Rectangle对象,这样图形的碰撞检测也就得以实现了。/* 判断×××是否击中障碍物 */ public boolean isHit(com.Alex.map.Map map) { boolean flag = true;// 代表没有撞到 // 分类别的得到所有的障碍物 List<Stuff> stuffList = new Vector<Stuff>(); stuffList.addAll(map.getBricks()); stuffList.addAll(map.getIrons()); stuffList.addAll(map.getWaters()); for (int i = 0; i < stuffList.size(); i++) { Stuff a = stuffList.get(i); Rectangle tankRectangle = new Rectangle(bullet2.getRec()); Rectangle stuffRectangle = new Rectangle(a.getX(), a.getY(), 20, 20); if (stuffRectangle.intersects(tankRectangle)) { flag = false;// 撞到了 break; } } return flag; } 上述这个例子就是判断Tank发出的×××是否对地图中的障碍物有碰撞,如果有的话 就做相关的操作(×××爆炸、障碍物消失)。上述代码中×××对象有一个getRec()方法就是 得到×××图形的Rectangle对象,具体实现就是根据其坐标和width、height来生成的。 采用此种方法进行碰撞检测需要注意,对于图片的实现处理应该尽量的去掉图标边角 的空白,不然实际效果可以产生肉眼可辨的误差。也就是说Rectangle尽量的包住图形 且Rectangle的区域尽量小。这种碰撞检测的方法被称之为多矩形碰撞。 一旦有一个矩形数组中的矩形与另外一个矩形数组的矩形发生碰撞就可认为发生了 多矩形碰撞。其中多圆形碰撞也是同样的道理,只是包裹的图形区域是圆形罢了。 不过仔细思考多矩形碰撞同样会有误差,虽然这种误差十分小。 像素级别的碰撞检测 像素级别的碰撞检测算得上是最精确的碰撞检测方法了。 首先遍历算出一张位图所有的像素点坐标,然后与另外一张位图上的所有点坐标进行对比, 一旦有一个像素点的坐标相同,就立刻取出这两个坐标相同的像素点,通过位运算取出这两个 像素点的最高位(透明度)进行对比,如果两个像素点都是非透明像素则判定这两张位图发生 碰撞。 介绍了像素碰撞之后可以得到两个结论: 1、像素碰撞很精确,不论位图之间是否带有透明像素,都可以精确判断; 2、正是因为像素碰撞的这种高精确判定,从而也会造成代码效率明显降低! 假设两张100×100 大小的位图利用像素级检测碰撞,仅是遍历两张位图的像素 就要循环100×100×2=20000 句逻辑代码;况且还要对筛选出来的相同坐标的 像素点进行遍历对比其透明值!这种效率可想而知! 当然,这里的像素碰撞只是大致提供一种思路,肯定还可以进行代码优化;但是不论再优的 代码,使用像素级进行碰撞检测终会导致整个程序的运行效率大大降低。因此像素级别的碰 撞检测在游戏开发中是尽量避免使用的! 规则图形碰撞检测2 对于×××和障碍物的碰撞检测,采用上述第一种方法就可以简单的实现了,不过××× 是圆形的有没有更加精确的碰撞检测方法呢?也就是实现圆形和矩形的碰撞检测嘛。 这里我们需要简单的运行下几何数学的知识,给个简单的图就会明白了。 小圆有个运动轨迹,轨迹的线如果和他对着的正方形的相对某一象限的边有焦点,那么 就能碰撞,边就是那一个象限的边(还要把圆半径算进去),具体代码就不实现了,读者可 自己尝试着去实现。 不规则图形碰撞检测 对于矩形碰撞,很多人都知道。但面对多边形图形,大多数采用多矩形覆盖的方式。 SAT 一种可以快速检测不规则的凸多边形是否碰撞的算法给出两个凸多边形体, 如果我们能找到一个轴线,使两物体在此轴线上的投影不重叠,则这两个物体之间没有 发生碰撞,这个轴线叫做Separating Axis(红色轴线)。 对于2D来说,红色线就是垂直与多边形边的轴。 因此,如果我们要检查两多边形是否碰撞,就去检查两多边形在每个所有可能的轴上的投影 是否重叠。 /// 检测2个矩形是否发生碰撞 /// </summary> /// <returns></returns> public static bool IsIntersect (Vector2[] A, Vector2[] B) { Vector2 AX, AY, BX, BY; AX = new Vector2(); AY = new Vector2(); BX = new Vector2(); BY = new Vector2(); AX.X = A[0].X - A[1].X; AX.Y = A[0].Y - A[1].Y; AY.X = A[0].X - A[3].X; AY.Y = A[0].Y - A[3].Y; BX.X = B[0].X - B[1].X; BX.Y = B[0].Y - B[1].Y; BY.X = B[0].X - B[3].X; BY.Y = B[0].Y - B[3].Y; //对于AX上: if (Tmp(AX, A, B)) return false; if (Tmp(AY, A, B)) return false; if (Tmp(BX, A, B)) return false; if (Tmp(BY, A, B)) return false; return true; } private static bool Tmp(Vector2 IS,Vector2[] A,Vector2[] B) { float[] v = new float[4]; for (int i = 0; i < 4; i++) { float tmp = (IS.X * A[i].X + IS.Y * A[i].Y) / (IS.X * IS.X + IS.Y * IS.Y); v[i] = tmp * IS.X * IS.X + tmp * IS.Y * IS.Y; } float[] vv = new float[4]; for (int i = 0; i < 4; i++) { float tmp = (IS.X * B[i].X + IS.Y * B[i].Y) / (IS.X * IS.X + IS.Y * IS.Y); vv[i] = tmp * IS.X * IS.X + tmp * IS.Y * IS.Y; } if (Math.Max(Math.Max(v[0], v[1]),Math.Max(v[2],v[3])) >Math.Min(Math.Min(vv[0],vv[1]),Math.Min(vv[2],vv[3])) && Math.Min(Math.Min(v[0],v[1]),Math.Min(v[2],v[3])) < Math.Max(Math.Max(vv[0],vv[1]),Math.Max(vv[2],vv[3]))) { return false; }//表示暂时不知道是否碰撞 else return true;//表示知道未碰撞 } 赞 收藏 评论 分享 举报 下一篇:Oracle SQL语句执行过程 提问和评论都可以,用心的回复会被更多人看到 评论 发布评论 全部评论 () 最热 最新 相关文章 安卓游戏开发之图形渲染技术优劣分析 随着移动设备的普及和性能的提升,安卓游戏开发已经成为一个热门领域。在安卓游戏开发中,图形渲染技术是关键的一环。本文将对安卓游戏开发中常用的图形渲染技术进行分析,比较它们的优劣,并探讨它们在不同应用场景下的适用性。 图形渲染 OpenGL ES Vulkan RenderScript Canvas 消除类游戏如何开发 消除游戏是一类简单而又充满乐趣的休闲游戏,通过匹配相同的元素来完成任务,其简单直观的玩法吸引了大量玩家。在休闲的时候很多人都会玩消消乐类的游戏,还有简单的操作技巧,能够让玩家很好的放松心情,在游戏中沉浸式体验闯关的乐趣,消除类游戏如何开发呢,下面我来带大家简单学习一下; 1. 确定游戏的类型和主题:选择一个适合您的目标受众的游戏类型,比如益智游戏、休闲游戏或动作游戏。 游戏开发 休闲游戏 用户反馈 开心打地鼠,Android小游戏开发 使用 Android Studio 开发一款小游戏 —— 开心打地鼠。 代码设计 游戏开发 android studio java 开发 Android游戏中最简单的碰撞检测 Android游戏中最简单的碰撞检测 由于本人在本科毕业时候做的毕设是一个小游戏,其中就有碰撞检测的实现,如下代码,先自己写一个可以得到碰撞点的方法getCollidePoint(Sprite s)返回的是Point类,之后只要这个碰撞点是存在的,则表示两个游戏的精灵发生了碰撞。逻辑比较简单,用得到了sdk的graphics包下的setIntersect()方法看是否相交。//得... 碰撞检测 android游戏 sprite 精灵碰撞 java 游戏中的碰撞检测 游戏中的碰撞检测On 2010年07月21日, in work, by ppzhu 游戏中的碰撞检测方式有很多,不同的算法之间主要是在精度和速度之间权衡。以下几种方式按照速度排序说明。以2D为例,3D不过是增加了一维罢了 碰撞检测 java碰撞检测 # Java碰撞检测实现方法## 引言在游戏开发、图形处理和物体交互等领域,碰撞检测是一项非常重要的技术。它可以判断两个物体是否发生碰撞,以及碰撞发生的位置和角度。在Java中,我们可以使用一些简单的算法来实现碰撞检测。本文将介绍一种基于矩形的碰撞检测方法。## 碰撞检测流程下面是实现碰撞检测的整个流程。可以使用以下表格来展示步骤:| 步骤 | 描述 || --- | --- | 碰撞检测 java Java 碰撞检测 碰撞检测在3D游戏中至关重要,好的碰撞检测要求人物在场景中可以平滑移动,遇到一定高度内的台阶可以自动上去,而过高的台阶则把人挡住,遇到斜率较小的斜坡可以上去,斜率过大则把人挡住,在各种前进方向被挡住的情况下都要尽可能地让人物沿合理的方向滑动而不是被迫停下。在满足这些要求的同时还要做到足够精确和稳定,防止人物在特殊情况下穿墙而掉出场景。 &n 职场 休闲 碰撞检测 pygame游戏精灵(上)-碰撞检测 pygame.sprite 模块是属于pygame进阶的内容,通常应用于比较复杂的游戏,或者说游戏角色比较多 ide 碰撞检测 初始化 简单的边界碰撞检测5 var cOntext= document.getElementById('canvas').getContext('2d'), startButton = document.getElementById('startButton'), circles = [];for (var i=0; i < 100; ++i) {//定义100个小球 circles[i] ci Math 碰撞检测 js canvas 碰撞检测碰撞Java简单游戏开发之碰撞检测 最近研究碰撞检测碰撞,稍微总结一下,以后继续补充: 前言 未几之前在论坛上有人发贴,使用java编写的超级马里奥如何实现碰撞检测,笔者自己以前 也做过Tank大战。里面一样涉及到碰撞检测,翻翻U盘里的东西还在,什么时候也给同享出来。 这篇文章就简单游戏中的碰撞检测做一个简单的总结。首先需声明的是这里只是2D的碰撞检测。 碰撞检测 对于形状之间如何来判断是不是是碰撞的这要根据详细的形状来定。在新手练手的小游戏中, 物体形状一般可以设定为矩形区域,这类规矩图形。它的碰撞检测可以通过java API中的 Rectangle类来实现碰撞的检测。 规矩图形碰撞检测(Rectangle) 首先我们查看A. 碰撞检测 像素点 位图 i++ java Android 游戏碰撞效果 游戏开发碰撞检测 今天面试被侮辱了,哎,多学习以下 游戏中的碰撞检测方式有很多,不同的算法之间主要是在精度和速度之间权衡。以下几种方式按照速度排序说明。以2D为例,3D不过是增加了一维罢了,算法理解上没太大区别。一、地图格子划分检测最简单的一种检测,就是把地图(或者称为场景,总之是指碰撞发生的范围)划成一个个格子,类似仙剑奇侠传这样。假设地图有800*600px,20*20 个像素为一格。那么可以划为40 Android 游戏碰撞效果 3D 迭代 四叉树 java游戏碰撞反弹 java 碰撞检测 飞机大战1.小组博客链接2.个人负责部分功能架构图(黄圈内为个人负责部分)①碰撞检测碰撞检测是游戏中不可或缺的一部分,难点在于确定碰撞的触发如何去实现条件化、数据化。本次程序中采用的方法如上图所示,利用敌机和友机的坐标以及长宽,来确定碰撞条件,因为飞机有大小,所以必须确定碰撞产生的区域,如上图灰色区域,当友机的坐标出现在上图灰色的区域内,则判定为触发碰撞。设想,未实现如上图,将飞机图片细化为一个不 java游戏碰撞反弹 绘图程序java课程设计 碰撞检测 实例化 Image java 碰撞检测 碰撞检测函数 文章目录一、二、三、四、五、六、七、 代码 一、OnCollisionEnter(Collision collision):这个函数用于检测两个物体之间的碰撞事件,当两个物体发生碰撞时被调用。其中,参数collision包含了碰撞的详细信息,例如碰撞点、碰撞法线等等。二、OnCollisionStay(Collision collision):这个函数用于检测两个物体之间的持续碰撞事件,当两个物 java 碰撞检测 unity 游戏引擎 触发器 ide javafx碰撞检测 fcl碰撞检测 案例1:两个不同位置、不同大小的Box碰撞检测#include<Eigen/Core>#include<ccd/ccd.h>#define FCL_EXPORT#include <fcl/fcl.h>#include <fcl/narrowphase/collision.h>#include <iostream>void t javafx碰撞检测 c++ qt 学习 #include java 碰撞检测太大了 android 碰撞检测 Android 游戏检测碰撞方法一、地图格子划分检测 最简单的一种检测,就是把地图(或者称为场景,总之是指碰撞发生的范围)划成一个个格子,类似仙剑奇侠传这样。假设地图有800*600px,20*20个像素为一格。那么可以划为40*30个格子。地图中参与检测的对象都存储着自身所在的格子坐标,判断碰撞就显而易见了,例如可以认为两个物体在相邻格判为碰撞,或者两个物体在同一格。采用这种方式有个要求,就是 java 碰撞检测太大了 android html 3D java 碰撞检测算法 碰撞检测函数 1.物理碰撞检测响应函数现有: Lesson16脚本的代码:using System.Collections;using System.Collections.Generic;using UnityEngine;public class Lesson16 : MonoBehaviour{ //1.碰撞发生时 自动执行此函数 //参数 Collision 就是碰到"我"的那个 java 碰撞检测算法 unity 游戏引擎 触发器 ide Android 移动碰撞检测 碰撞检测模块 ADAS开发之预碰撞检测模块此blog用于研二实习期间个人学习记录之用,如有错误或可以改进之处烦请指出。 文章目录ADAS开发之预碰撞检测模块前言一、功能输入输出接口1.场景一2.场景二二、预碰撞检测执行1.行人横穿场景2.临车道前车斜插场景总结 前言需要基于prescan定义并开发碰撞检测flag接口,场景简述如下: 场景一:碰撞检测模块为车辆CA功能提供输入flag,车辆行驶中判断是否会与前方 Android 移动碰撞检测 自动驾驶 matlab 碰撞检测 输入输出接口 android 碰撞检测 碰撞检测定义 在Unity3D中,碰撞可以形象理解为现实世界中的碰撞,并且由于物理引擎的模拟,使碰撞物体也会如现实世界一样产生相同的碰撞结果,如运动轨迹的改变、反弹等,总之碰撞的结果为产生我们不期望的物体运动行为。为了避免产生这种碰撞,就需要进行碰撞检测。碰撞检测实现一碰撞检测的原理是在物体移动的前方放置一个虚拟物体,它与物体进行同步运动。如果有障碍,则要先与虚拟物体碰撞。一旦检测到虚拟物体的碰撞,则运动物体停 android 碰撞检测 unity3d 碰撞检测 API 物理引擎 java碰撞检测原理 java碰撞检测算法 碰撞检测算法有很多,直接检测代价很大,一般使用多种算法进行优化。首先会对物体生成包围盒,例如AABB包围盒,该盒的面平行于XYZ轴,对包围盒是否碰撞进行检测,如果包围盒碰撞,那么就需要进一步检测。我们还会对物体生成凸多面体进行包围。当然碰撞检测一般针对的是动态物体和动态物体或者动态物体和静态物体。粗略阶段:1.利用空间划分,例如使用八叉树,划分后不在同一节点的两物体可以认为不会碰撞。2.N个物体两 java碰撞检测原理 图形学 碰撞检测 笔记 迭代 android碰撞检测圆 碰撞检测函数 物理碰撞检测相应的函数我们将通过print函数来举例说明:在VS code中,我们可以通过输入OnCollisionEnter,然后按Tab键来补全该函数结构,其他的函数也相同。private void OnCollisionEnter(Collision collision) {}复制代码如果我们想要碰撞触发接触时会自动执行的函数:private void OnCollisionEnter android碰撞检测圆 unity 游戏引擎 ide 触发器