`

J2ME游戏中的碰撞检测

阅读更多

我们在游戏开发中总会遇到这样那样的碰撞 , 并且会很频繁的去处理这些行为 . 这也是游戏开发的一种基本的算法 .2D 的相对 3D 的要简单的多了,最简单的就是矩形碰撞 \ 圆形碰撞 , 像素碰撞。矩形碰撞用的最多

我就简单总结一点我的认识,对于矩形碰撞 .

   我们就把游戏中的角色统称为一个一个的 Actor, 并且把每个   Actor 框成一个与角色大小相等的矩形框,那么在游戏中每次的循环检查就是围绕每个 Actor 的矩形框之间是否发生了交错。为了简单起见,我们就拿一个主角与一个 Actor 来分析,其它的可以类似。

        一个主角与一个 Actor 的碰撞其实就成了两个矩形的检测,是否发生了交集。

第一种方法:

我们可以通过检测一个矩形的 4 个顶点是否在另外一个矩形的内部来完成。代码如下:

我们简单的设定一个 Actor 类:

public   class   Actor {

     int   x , y , w , h ;

     public   int   getX() {

        return   x ;

     }

     public   int   getY() {

        return   y ;

     }  

     public   int   getActorWidth() {      

        return   w ;

     }

     public   int   getActorHeight() {     

        return   h ;

     }  

}

 

检测的处理为:

        public boolean isCollidingWith (int px ,int py){

               if(px > getX() && px < getX() + getActorWidth()

               &&   px > getY() && px < getY() + getActorHeight())

                      return true;

               return false;

        }

      

        public boolean isCollidingWith(Actor another) {

               if(isCollidingWith(another.getX(),another.getY())

               ||isCollidingWith(another.getX()+ another.getActorWidth(),another.getY())

               ||isCollidingWith(another.getX(),another.getY()+another.getActorHeight())

               ||isCollidingWith(another.getX()+ another.getActorWidth(),another.getY()+another.getActorHeight())

               )

               return true;

               return false;

        }

以上处理运行应该是没有什么问题的,但是没有考虑不到运行速度,而游戏中需要大量的碰撞检测工作,所以要求碰撞检测要尽量的快。

 

第二种方法:

我们从相反的角度考虑,以前是想什么时候相交,现在我们处理什么时候不会相交,可以处理 4 条边,

 

               a         b   

左边 a 矩形的右边界在 b 矩形的左边界以外,同理, a 的上边界需要在 b 的下边界以外,四边都判断,则可以知道 a 是否与 b 相交,代码:

     /**

      *   ax   a 矩形左上角 x 坐标

      *   ay -- a 矩形左上角 y 坐标

      *   aw   --   a 矩形宽度

      *   ah   --   a 矩形高度

      *

      *   bx   -- b 矩形左上角 x 坐标

      *   by   -- b 矩形左上角 y 坐标

      *   bw --   b 矩形宽度

      *   bh   --   b 矩形高度

      *        *

      */

     public   boolean   isColliding( int   ax, int   ay, int   aw, int   ah,

                             int   bx,  int   by,  int   bw,  int   bh){

        if (ay > by + bh || by > ay + ah

            || ax > bx + bw || bx > ax + aw)

        return   false ;

        return   true ;

     }

此方法比第一种简单且运行快。

 

 

 

第三种方法:

这种方法其实可以说是第二种的一个变异,我们可以保存两个矩形的左上和右下两个坐标的坐标值,然后对两个坐标的一个对比就可以得出两个矩形是否相交。这应该比第二种更优越一点。

/*

  * rect1[0]:  矩形 1 左上角 x 坐标

  * rect1[1]:  矩形 1 左上角 y 坐标

  * rect1[2]:  矩形 1 右下角 x 坐标

  * rect1[3]:  矩形 1 右上角 y 坐标

  *

  * rect2[0]:  矩形 2 左上角 x 坐标

  * rect2[1]:  矩形 2 左上角 y 坐标

  * rect2[2]:  矩形 2 右下角 x 坐标

  * rect2[3]:  矩形 2 右上角 y 坐标

  */

     static   boolean   IsRectCrossing ( int   rect1[],  int   rect2[])

     {

     if   (rect1[0] > rect2[2])  return   false ;

     if   (rect1[2] < rect2[0])  return   false ;

     if   (rect1[1] > rect2[3])  return   false ;

     if   (rect1[3] < rect2[1])  return   false ;

     return   true ;

     }

这种速度应该很快的了,推荐使用这种。

 

第四种方法:(类似于圆形与圆形)

现在介绍一种测试两个对象边界是否重叠。可以通过比较两个对象间的距离和两个对象半径的和的大小,很快实现这种检测。如果它们之间的距离小于半径的和,就说明产生了碰撞。

为了计算半径,就可以简单的取高度或者宽度的一半作为半径的值。

代码如下:

        public static boolean isColliding ( int ax,int ay,int aw, int ah,

                                                                       int bx, int by, int bw, int bh){

             

               int r1 = (Math.max(aw, ah)/2 + 1);

               int r2 = (Math.max(bw, bh)/2 + 1);            

               int rSquard = r1 * r1;

               int anrSquard = r2* r2;

               int disX = ax - bx;

               int disY = ay - by;

             

               if((disX * disX) + (disY * disY) < (rSquard + anrSquard))

               return true;

               else

               return false;

        }

这种方法类似于圆形碰撞检测。处理两个圆的碰撞处理就可以用这种。

 

以上只是总结了几种简单的方法,当然其实在游戏中熟练的运用才是最好的,在 J2ME 中差不多以上几种算够了,它不需要太精密的算法,当然可能有些需要比以上更复杂,例如如果一个对象速度足够快的,

分享到:
评论

相关推荐

    J2me-Layermanager碰撞检测

    在这个专题中,我们将深入探讨J2ME中的`LayerManager`及其在碰撞检测中的应用。 首先,我们要理解`LayerManager`的基本概念。在2D游戏开发中,图层是一种将不同游戏元素分组的机制,使得它们可以独立地移动和更新,...

    pengzhuang.rar_j2me_j2me 手机 游戏 代码_j2me 碰撞检测

    在J2ME游戏中,由于硬件资源有限,高效的碰撞检测算法显得尤为重要。 碰撞检测是指在游戏世界中检测两个或多个对象是否发生接触的过程。在J2ME中,这通常涉及到对图形元素(如角色、敌人、障碍物等)的矩形边界进行...

    J2ME中碰撞检测代码详解!

    在Java Micro Edition (J2ME) 平台上开发游戏或者应用程序时,碰撞检测是一个非常重要的技术环节。它用于判断游戏中的对象(如角色、敌人、障碍物等)是否发生接触,进而实现游戏逻辑,比如得分计算、触发事件或执行...

    j2me透明泡泡碰撞算法小演示

    这个"j2me透明泡泡碰撞算法小演示"项目提供了一个简单的实例,展示了如何在受限的资源环境下实现动态物体的碰撞检测。 首先,让我们了解一下透明泡泡的实现。在J2ME中,创建透明泡泡可能涉及到使用PNG或GIF格式的...

    j2me游戏中文教程

    游戏中的碰撞检测、AI算法和网络对战功能也是重点讲解的内容。 在“J2ME Game Programming.chm”这个文件中,很可能包含了教程的完整文本,以CHM(Compiled HTML Help)格式呈现,这种格式便于阅读和搜索。"打开...

    J2ME游戏开发(中文译本)

    5. **游戏物理系统**:介绍基本的物理规则,如碰撞检测、重力模拟,以及如何在J2ME中实现这些物理效果。 6. **音频和多媒体**:讨论如何在J2ME游戏中集成音频效果,包括背景音乐和音效的播放,以及如何处理多媒体...

    j2me游戏引擎详解

    2. **物理模拟**:引擎可能集成物理模拟库,如Box2D或JBox2D,用于处理碰撞检测、重力和其他物理效果,使游戏更加真实。 3. **音频管理**:音频播放和管理是游戏体验的重要部分。J2ME游戏引擎会提供接口,支持背景...

    J2me 游戏原代码

    同时,碰撞检测是确保游戏交互性的重要部分,开发者需要了解不同的碰撞检测算法。 7. **数据持久化**: 游戏进度、用户设置等数据通常需要存储在本地,J2ME 提供 RecordStore API 来进行数据存储和读取。 8. **网络...

    J2ME中的基础碰撞检测算法浅析

    在J2ME(Java Micro Edition)游戏开发中,碰撞检测是一项关键的技术,它主要...因此,要成为一名优秀的J2ME游戏开发者,不仅要掌握这些基础算法,还需不断学习和研究更高级的碰撞检测技术,以应对各种复杂的游戏场景。

    经典j2me游戏实例

    在这个类中,可能会有处理碰撞检测、更新游戏世界、计分系统等功能。在J2ME游戏中,为了保持流畅性,通常会有一个游戏循环(Game Loop)来持续刷新游戏状态。 4. **MessageScreen.java** 这个文件可能定义了一个...

    J2ME 游戏开发资源

    6. **游戏逻辑**:游戏的核心部分是逻辑处理,这通常涉及到碰撞检测、AI算法、计分系统等。这些可以通过编写复杂的程序逻辑来实现,需要扎实的编程基础。 7. **网络通信**:J2ME支持HTTP和WAP协议,使得游戏可以...

    j2me游戏(源码齐全)

    "j2me游戏(源码齐全)"这个资源提供了丰富的 J2ME 游戏源代码,对于想要学习 J2ME 或者游戏开发的初学者来说,这是一个非常宝贵的资料库。 首先,我们来关注一下“疯狂老鼠”这个游戏。这可能是一款基于 J2ME 的...

    J2ME_Map.rar_J2ME 地图_J2ME游戏_j2me 游戏_j2me_m_绘制地图

    在"J2ME游戏开发中的地图设计与绘制.txt"文件中,可能详细讲解了如何规划地图结构,如何使用二维数组存储地图数据,以及如何利用J2ME的图形API高效地渲染地图。同时,文件可能还讨论了如何实现动态加载和滚动地图,...

    j2me游戏开发实例

    3. **碰撞检测**:游戏中的物体交互往往需要进行碰撞检测,以确定是否发生接触。这通常涉及到几何学算法,如轴对齐边界框(AABB)或更复杂的碰撞模型。 4. **资源管理**:在资源有限的移动设备上,有效管理内存和...

    J2ME小游戏合集很实用

    10. **J2me手机游戏捉鬼源代码**:捉鬼游戏是一个典型的追逐类游戏,源码中包含了如何创建动态的游戏环境和追踪机制,是学习J2ME游戏物理引擎和碰撞检测的好材料。 以上每个游戏的源代码都可以作为J2ME游戏开发的...

    J2ME的RPG游戏Demo

    开发者可以通过查看源代码来学习J2ME游戏开发的具体实现,包括类的设计、方法的实现以及游戏逻辑的编写。这对于初学者来说是一份宝贵的实践教程,可以深入理解J2ME平台的游戏编程技巧和最佳实践。 总结来说,这个...

    j2me游戏.rar

    2. **碰撞检测**:在游戏中,物体之间的碰撞检测是常见的,J2ME提供了一些基本的方法,但可能需要自定义算法来优化性能。 3. **动画**:通过改变帧率和利用缓动函数,可以实现平滑的动画效果。 4. **音频播放**:...

    J2ME游戏开发J2ME游戏开发

    为了实现动态效果,开发者需要掌握如何使用定时器更新画面,实现帧动画,以及如何高效地处理碰撞检测和游戏逻辑。 **游戏循环** 一个标准的J2ME游戏通常包含一个游戏循环,这个循环负责处理输入、更新游戏状态、...

    j2me_plane.rar_j2me_j2me 飞机_j2me 飞机 游戏_飞机游戏

    除此之外,优化是J2ME游戏开发中不可忽视的一环。由于移动设备性能有限,我们需要关注内存管理、减少绘图开销、合理安排线程等,确保游戏运行流畅。 总结来说,通过J2ME开发飞机游戏,开发者需要掌握MIDP和CLDC的...

Global site tag (gtag.js) - Google Analytics