`

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中使用游戏精灵与不同图层发生碰撞并检测

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

    J2ME游戏中的碰撞检测。主要是用于手机游戏中

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

    J2ME 手机游戏,关于碰撞检测的教学用代码,供新手参考。

    Java FlyGeneral J2me碰撞检测游戏源码.rar

    Java FlyGeneral J2me碰撞检测游戏源码,得到图片以帧为单位的一个数据图片,碰撞检测 *@parameter ax ay aw ah 分别是a矩形的左顶点X Y坐标和矩形的 长和宽  *若返回真则为碰撞  *返回为假则为不碰撞  *@...

    j2me手机游戏中的碰撞检测问题

    绍j2me手机游戏中的碰撞检测问题

    J2me 捉鬼游戏源代码.rar

    J2me 捉鬼游戏源代码,地图数据定义,0-空地 1-...角色类:角色状态 0-停止 1-走路 2-中招,停止走路时的帧序列,改变精灵的帧序列,dir 方向0-上 1-下 2-左 3-右,另外还有角色控制、碰撞检测等方面的Java类,值得学习。

    j2me版本的深水炸弹

    本人编写的一个j2me游戏,其中有游戏精灵,双缓冲技术,线程的应用,碰撞检测等,其中处理了游戏声音!适合初学者!

    基于J2ME的推箱子游戏设计与实现

    J2ME是Java2的一个重要组成部分,它...本文设计的推箱子游戏是一个基于J2ME的游戏,并且对以往推箱子游戏使用优化方法提高了游戏的性能,主要包括:双缓存技术、游戏关卡设计优化、图片优化、部分重绘、简化碰撞检测。

    J2ME碰砖块游戏Java源码.rar

    J2ME碰砖块游戏Java源码,碰撞检测游戏,主Display 对象及根据需要重载的canvas对象,调试开关,置为true后可输出调试信息,实用Canvas类包含图形控制及游戏逻辑,砖块列表_1,游戏中撞球和击球板的实例,让砖块的多...

    J2ME游戏实例(MIDP2.0)

    这是本人利用MIDP2.0技术制作的一个RPG游戏实例,实现了人物在地图场景中的走动与碰撞检测功能。

    J2ME 圆和矩形绘制的追逐游戏

    一个用J2ME做的非常简单的小游戏。一开始敌人追你,吃到食物后,变大追敌人。游戏很简单,AI也不复杂,就是坐标比较,还有两圆的碰撞检测和圆与矩形的碰撞检测。

    tengge手机端j2me编程教程完整版

    ┌第四章 j2me游戏开发基础 ┃4.1 游戏画布的使用 ┃4_2.游戏精灵的使用 ┃4_3.图层管理器的使用 ┃4_4.游戏精灵旋转和其他方法 ┃4_5.碰撞检测 ┃4_6.游戏贴图的使用 ┃第四章教程打包下载 ┗━━━━━━━━━━...

    J2ME推箱子游戏完整版

    实现了一个小人推动多个箱子,共设定了10个关卡,每关通过后,会出现一个入口,可以进入下一关的游戏。游戏中有重新开始,可以...游戏中对小人,墙壁,多个箱子之间均进行了碰撞检测。代码可以在eclipse上运行成功。

    J2ME手机RPG游戏

    这个一个RPG游戏的源代码,本游戏使用了四个代码类,Hero类创建人物精灵,Map类实现了地图和障碍物的创建,GameCanvas类实现函数执行和碰撞检测以及音乐的播放,MIdlet类执行程序

    j2me新手学习全套示例源代码

    j2me新手学习全套示例源代码,一些必备的代码,包括人物移动、接口使用、地图绘制、Sprite类的使用、碰撞检测、Sprite怪物行走等,不过从代码来看,好像是一个完整的游戏分解来的。

    Java J2ME飞行射击类游戏源码.rar

    Java J2ME飞行射击类游戏源码,射击类游戏,飞机飞行射击,躲避攻击,同时发炮弹轰炸目标,可通过本源码学习下碰撞检测、飞行控制、发火躲避等方面的游戏技巧,源码发布于前些年,有些老。

    郭克华 J2ME视频配套课件 及源码 ppt

    23GameAPI2:Sprite碰撞检测和动画 24:GameAPI3:TiledLayer和图层管理 网络应用开发 18网络编程1:Socket编程 19案例4:聊天室开发 20网络编程2:UDP编程 21网络编程3:HTTP编程 RMS开发 15RMS编程1:基础知识 16RMS编程2:...

    J2ME手机游戏雷电源代码

    可以实现菜单选项,敌方的碰撞检测,在手机模拟器上可以正确运行。

    J2ME移动开发实战教学视频(9.多线程.rar)

    郭克华-J2ME移动开发实战教学视频() 全部课程内容: 1. 体系介绍和环境配置 2. 高级界面开发1基本界面和Command ...23.GameAPI 2Sprite碰撞检测和动画 24. GameAPI 3TiledLayer和图层管理 25. J2ME代码优化

    j2me等离子战斗机

    j2me开发的飞机游戏,MIDP2.0写的飞机,包括飞机游戏的所有要素,换关,计数,爆炸效果,碰撞检测,刷不同的敌机,最重要的敌机的不同方阵不同时间出现。。

Global site tag (gtag.js) - Google Analytics