手游《奔跑吧?骚年!》技术分享(四):矩形碰撞检测

今天来分享一下游戏中的碰撞处理,基本上横版2D游戏内的物体,都可以用矩形来表示(有时也需要用三角形来检测)。通常就判断一下是否碰撞是不够的,还需要检测一下碰撞在那一面。就比如在我的游戏中,人物碰到石块的顶上和碰到左侧需要的处理就不一样。碰到顶上,需要将人物的垂直速度变为0。后者就需要将人物的水平速度变为0。

所以需要一个表示碰撞位置的参数:

package com.baohanbin.run_boy_run.game_util;/*** 碰撞检查时所用的数据信使。 包括是否碰撞,和撞击类型(上,下,左,右,。。。)* * @author 包汉彬同学* */
public class CollisionData {public static final int COLLISION_TOP = 1;public static final int COLLISION_LEFT = 2;public static final int COLLISION_RIGHT = 3;public static final int COLLISION_BOTTOM = 4;public static final int COLLISION_TOP_LEFT = 5;public static final int COLLISION_TOP_RIGHT = 6;public static final int COLLISION_BOTTOM_LEFT = 7;public static final int COLLISION_BOTTOM_RIGHT = 8;public static final int COLLISION_CENTRE = 9;public static enum CollisionType {COLLISION_TOP_FALSE(COLLISION_TOP, false), COLLISION_LEFT_FALSE(COLLISION_LEFT, false), COLLISION_RIGHT_FALSE(COLLISION_RIGHT,false), COLLISION_BOTTOM_FALSE(COLLISION_BOTTOM, false), COLLISION_TOP_LEFT_FALSE(COLLISION_TOP_LEFT, false), COLLISION_TOP_RIGHT_FALSE(COLLISION_TOP_RIGHT, false), COLLISION_BOTTOM_LEFT_FALSE(COLLISION_BOTTOM_LEFT, false), COLLISION_BOTTOM_RIGHT_FALSE(COLLISION_BOTTOM_RIGHT, false), COLLISION_CENTRE_FALSE(COLLISION_CENTRE, false), COLLISION_TOP_TRUE(COLLISION_TOP,true), COLLISION_LEFT_TRUE(COLLISION_LEFT, true), COLLISION_RIGHT_TRUE(COLLISION_RIGHT, true), COLLISION_BOTTOM_TRUE(COLLISION_BOTTOM,true), COLLISION_TOP_LEFT_TRUE(COLLISION_TOP_LEFT, true), COLLISION_TOP_RIGHT_TRUE(COLLISION_TOP_RIGHT, true), COLLISION_BOTTOM_LEFT_TRUE(COLLISION_BOTTOM_LEFT, true), COLLISION_BOTTOM_RIGHT_TRUE(COLLISION_BOTTOM_RIGHT, true), COLLISION_CENTRE_TRUE(COLLISION_CENTRE, true);
//      碰撞类型public int collType = 0;
//      是否碰撞public boolean collFlag = false;CollisionType(int collType, boolean flag) {this.collType = collType;this.collFlag = flag;}}}

接下来还需要表示游戏内物体的类:

package com.baohanbin.run_boy_run.game_run;import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.Log;/*** 该类是整个游戏最前景的父类 所有的存在于游戏的前景元素必须直接或间接继承于它* */
public class Front {// x :在坐标中横轴的位置 y : 在坐标中纵轴的位置public float x, y;// 每一个元素的唯一类型标签public int type;// 物体的尺寸public int width, height;private Paint paint = new Paint();/*** * @param x2*            在坐标中横轴的位置* @param y2*            在坐标中纵轴的位置* @param w*            物体的宽度* @param h*            物体的高度*/public Front(float x2, float y2, int w, int h, int t) {this.x = x2;this.y = y2;this.width = w;this.height = h;this.type = t;}/*** 绘制物体所有元素必须* * @param c*            画布* @param x*            在屏幕横轴的位置* @param y*            在屏幕纵轴的位置* @param bitmap*            物体的图片数组*/public void draw(Canvas c, float screenX, float screenY, Bitmap... bitmap) {try{c.drawBitmap(bitmap[0], screenX, screenY, paint);}catch(Exception e){Log.d("GameLog", "draw is  Failure");e.printStackTrace();}}public String toStirng() {return "Front Data --- x:" + x + " y:" + y + " width:" + width+ " height:" + height + " type:" + type;}}

现在主角登场:

/*** Description :计算各种类型的撞击* * @author 包汉彬同学* @version 1.0*/
public class Collision {/*** 储存三角形,三边坐标的数组,用于碰撞计算,非同步*/public static float[][] TriangLineArray = new float[3][4];/*** 储存矩形,四边的坐标,用于碰撞计算,非同步*/public static float[][] RectLineArray = new float[4][4];/*** Description : 计算矩形的物体是否相撞 计算出两个矩形的中心坐标 然后比较坐标的距离,是否分别小于两矩形宽和高的一半之和* 然后推断出撞击的类型* * @param passivity*            被撞击物体* @param initiative*            撞击物体* @return 返回撞击数据信使*/public static CollisionType Rectangle(Front passivity, Front initiative) {CollisionType cd = CollisionType.COLLISION_TOP_FALSE;// 为了避免不必要的计算if ((passivity.x + passivity.width) > initiative.x&& passivity.x <= (initiative.x + 800)) {float x1 = passivity.x + passivity.width / 2;float y1 = passivity.y - passivity.height / 2;float x2 = initiative.x + initiative.width / 2;float y2 = initiative.y - initiative.height / 2;// 判断是否相撞击boolean b = (Math.abs(x2 - x1) <= (passivity.width / 2 + initiative.width / 2) && Math.abs(y2 - y1) <= (passivity.height / 2 + initiative.height / 2));if (b) {if ((x2 <= passivity.x) && (y2 >= passivity.y)) {cd = CollisionType.COLLISION_TOP_LEFT_TRUE;} else if ((x2 <= passivity.x)&& (y2 <= passivity.y - passivity.height)) {cd = CollisionType.COLLISION_BOTTOM_LEFT_TRUE;} else if ((x2 >= passivity.x + passivity.width)&& (y2 >= passivity.y)) {cd = CollisionType.COLLISION_TOP_RIGHT_TRUE;} else if ((x2 >= passivity.x + passivity.width)&& (y2 <= passivity.y - passivity.height)) {cd = CollisionType.COLLISION_BOTTOM_RIGHT_TRUE;} else if (y2 > passivity.y) {cd = CollisionType.COLLISION_TOP_TRUE;} else if (y2 < passivity.y - passivity.height) {cd = CollisionType.COLLISION_BOTTOM_TRUE;} else if (x2 < passivity.x) {cd = CollisionType.COLLISION_LEFT_TRUE;} else if (x2 > passivity.x + passivity.width) {cd = CollisionType.COLLISION_RIGHT_TRUE;} else {cd = CollisionType.COLLISION_CENTRE_TRUE;}}}return cd;}
}

该类还包括其实该类还包括三角型碰撞,但是它比较复杂,就把它放到下一次的博客中。。

手游《奔跑吧?骚年!》技术分享(四):矩形碰撞检测相关推荐

  1. 图形引擎实战:手游Android端后台下载技术分享

    一.功能特点 手游android端后台下载SDK是畅游自主研发的一款移动平台android端后台文件下载工具包,它主要提供网络文件的后台下载功能,功能完善,性能高,可以满足游戏制作有关后台下载文件的需 ...

  2. 狂妄之人怎么用计算机弹,天谕手游狂妄之人乐谱代码分享

    天谕手游狂妄之人乐谱代码是什么?狂妄之人是游戏"传说之下"(undertale)主题曲中的一个,当玩家控制的人物走了屠杀线遇到sans的时候会触发的背景音乐.接下来小编为大家带来了 ...

  3. 楚留香获取服务器信息未响应,楚留香手游后期输出乏力解决方法分享

    楚留香手游后期输出乏力解决方法分享,很多小伙伴对这个游戏中的后期输出乏力不是很清楚,不知道他是干嘛的.小编就为大家详细的介绍下这个游戏中的后期输出乏力,还不知道的小伙伴千万不要错过! 楚留香武当后期输 ...

  4. 计算机音乐谱牵丝戏,《天谕手游》牵丝戏乐谱代码分享-天谕云之光在哪

    <天谕手游>牵丝戏乐谱代码分享 天谕手游牵丝戏乐谱?在游戏内很多玩家都想知道,牵丝戏乐谱的代码是什么,毕竟有了代码演奏十分的方便.接下来就让小编给大家带来<天谕手游>牵丝戏乐谱 ...

  5. dnf压爆服务器挑战网站,DNF手游压爆服务器挑战网址分享

    880手游下载资讯频道提供DNF手游压爆服务器挑战网址分享,DNF手游这一款游戏最近也是在疯狂预热,要是有提前进行了解的朋友应该也知道目前游戏推出了"压爆服务器"的挑战,可能对于很 ...

  6. 权御天下计算机音乐数字乐谱,天谕手游权御天下乐谱代码是什么-天谕手游权御天下乐谱代码分享_快吧手游...

    天谕手游权御天下乐谱代码是什么?天谕中我们可以使用外部代码复制到游戏中,然后制作出自己的音乐乐谱.很多小伙伴都想把这一首歌写进自己的天谕乐谱.下面就一起来看看吧! 天谕手游权御天下乐谱代码分享 A轨 ...

  7. 计算机音乐谱红昭愿,天谕手游红昭愿乐谱代码是什么-天谕手游红昭愿乐谱代码分享_快吧手游...

    天谕手游红昭愿乐谱代码是什么?天谕中我们可以使用外部代码复制到游戏中,然后制作出自己的音乐乐谱.很多小伙伴都想把这一首歌写进自己的天谕乐谱.下面就一起来看看吧! 天谕手游红昭愿乐谱代码分享 t115v ...

  8. 计算机音乐谱棠梨煎雪,天谕手游棠梨煎雪乐谱代码分享

    天谕手游棠梨煎雪乐谱代码是什么?<棠梨煎雪>是一首由银临演唱的原创古风歌曲,收录于专辑<腐草为萤>中.接下来小编为大家带来了天谕手游棠梨煎雪乐谱代码分享,希望可以帮助到大家. ...

  9. 计算机音乐谱红昭愿,天谕手游红昭愿乐谱代码分享

    天谕手游红昭愿乐谱代码是什么?<红昭愿>是来自音阙诗听音乐社的一首歌曲,由荒唐客填词,殇小谨谱曲,朱鸽编曲,由音阙诗听歌手王梓钰演唱,2020年9月24日,发行了由李玉刚演唱的<红昭 ...

  10. 卡牌类手游源码 刀塔传奇 免费分享 基于cocos2d-x3.0引擎开发

    卡牌类手游源码 刀塔传奇 免费分享 基于cocos2d-x3.0引擎开发 https://bbs.wxrym.com/thread-90118-1-1.html (出处: 外星人源码论坛) 今天给大家 ...

最新文章

  1. NYOJ 585 取石子(六)
  2. wince工业平板电脑_如何防止工业平板电脑温度过高?
  3. SAP CRM的Genil层和Hybris的jalo模型
  4. 简述JQuery,Extjs,YUI,Prototype,Dojo等JS框架的区别和应用场景
  5. 虽然自己不是唱歌的材料
  6. AVD Manager
  7. 服务器重启宝塔面板打不开了【已完美解决】
  8. QT表格QTableWidget在win10下纵横表头无分隔线的问题
  9. MATLAB自学教程一1.显示图像图像基本信息
  10. Java微服务面试题
  11. 机械制图之零件图表达
  12. win10系统不能多开服务器,win10游戏不能双开如何处理_win10电脑游戏双开同时运行操作方法...
  13. mysql脏读和幻读区别_数据库的脏读、不可重复读和幻读区别
  14. XGBOOST的基本原理以及使用
  15. 家庭版茄汁味锅包肉的做法
  16. 赵绍琴温病学讲座(一)
  17. bzoj 4484 [Jsoi2015]最小表示
  18. 多项式A除以B(模拟多项式除法)
  19. c语言函数指针、结构体、枚举实例(详细)解析(快速掌握)
  20. linux 进程调度cfg,选择Linux I / O调度程序

热门文章

  1. java实现打印某一年的月份(以2017年的为准)
  2. 智慧农业“黑科技”,FCU1101智能灌溉控制器方案
  3. 2021.8.23-8.30 人工智能行业每周技术动态
  4. android apk 反编译 工具下载,android APK反编译工具Apktool
  5. 全加器门级(结构级),数据流,行为级实现
  6. 湎计算机网络通讯设备有哪些,计算机网络习题集及答案.pdf
  7. cad注释比例和打印比例不一样_CAD注释比例与打印比例不相等
  8. 入门3D建模,没有美术基础你也可以学做人物角色面部造型 (下)
  9. seo优化教程-大型网站怎么进行搜索引擎优化排名?
  10. 软件测试修炼之路必读书单