AA 碰撞体 就是将所有的物体设置为矩形框进行碰撞计算。下面是代码

  1. /*
  2. * Copyright (C) 2010 The Android Open Source Project
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. *      http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package com.replica.replicaisland;
  17. /**
  18. * An Axis-Aligned rectangular collision volume.  This code treats other volumes as if they are
  19. * also rectangles when calculating intersections.  Therefore certain types of intersections, such
  20. * as sphere vs rectangle, may not be absolutely precise (in the case of a sphere vs a rectangle,
  21. * for example, a new rectangle that fits the sphere is used to perform the intersection test, so
  22. * there is some potential for false-positives at the corners).  However, for our purposes absolute
  23. * precision isn't necessary, so this simple implementation is sufficient.
  24. */
  25. public class AABoxCollisionVolume extends CollisionVolume {
  26. private Vector2 mWidthHeight;
  27. private Vector2 mBottomLeft;
  28. public AABoxCollisionVolume(float offsetX, float offsetY, float width, float height) {
  29. super();
  30. mBottomLeft = new Vector2(offsetX, offsetY);
  31. mWidthHeight = new Vector2(width, height);
  32. }
  33. public AABoxCollisionVolume(float offsetX, float offsetY, float width, float height,
  34. int hit) {
  35. super(hit);
  36. mBottomLeft = new Vector2(offsetX, offsetY);
  37. mWidthHeight = new Vector2(width, height);
  38. }
  39. @Override
  40. public final float getMaxX() {
  41. return mBottomLeft.x + mWidthHeight.x;
  42. }
  43. @Override
  44. public final float getMinX() {
  45. return mBottomLeft.x;
  46. }
  47. @Override
  48. public final float getMaxY() {
  49. return mBottomLeft.y + mWidthHeight.y;
  50. }
  51. @Override
  52. public final float getMinY() {
  53. return mBottomLeft.y;
  54. }
  55. /**
  56. * Calculates the intersection of this volume and another, and returns true if the
  57. * volumes intersect.  This test treats the other volume as an AABox.
  58. * @param position The world position of this volume.
  59. * @param other The volume to test for intersections.
  60. * @param otherPosition The world position of the other volume.
  61. * @return true if the volumes overlap, false otherwise.
  62. */
  63. @Override
  64. public boolean intersects(Vector2 position, FlipInfo flip, CollisionVolume other,
  65. Vector2 otherPosition, FlipInfo otherFlip) {
  66. final float left = getMinXPosition(flip) + position.x;
  67. final float right = getMaxXPosition(flip) + position.x;
  68. final float bottom = getMinYPosition(flip) + position.y;
  69. final float top = getMaxYPosition(flip) + position.y;
  70. final float otherLeft = other.getMinXPosition(otherFlip) + otherPosition.x;
  71. final float otherRight = other.getMaxXPosition(otherFlip) + otherPosition.x;
  72. final float otherBottom = other.getMinYPosition(otherFlip) + otherPosition.y;
  73. final float otherTop = other.getMaxYPosition(otherFlip) + otherPosition.y;
  74. final boolean result = boxIntersect(left, right, top, bottom,
  75. otherLeft, otherRight, otherTop, otherBottom)
  76. || boxIntersect(otherLeft, otherRight, otherTop, otherBottom,
  77. left, right, top, bottom);
  78. return result;
  79. }
  80. /** Tests two axis-aligned boxes for overlap. */
  81. private boolean boxIntersect(float left1, float right1, float top1, float bottom1,
  82. float left2, float right2, float top2, float bottom2) {
  83. final boolean horizontalIntersection = left1 < right2 && left2 < right1;
  84. final boolean verticalIntersection = top1 > bottom2 && top2 > bottom1;
  85. final boolean intersecting = horizontalIntersection && verticalIntersection;
  86. return intersecting;
  87. }
  88. /** Increases the size of this volume as necessary to fit the passed volume. */
  89. public void growBy(CollisionVolume other) {
  90. final float maxX;
  91. final float minX;
  92. final float maxY;
  93. final float minY;
  94. if (mWidthHeight.length2() > 0) {
  95. maxX = Math.max(getMaxX(), other.getMaxX());
  96. minX = Math.max(getMinX(), other.getMinX());
  97. maxY = Math.max(getMaxY(), other.getMaxY());
  98. minY = Math.max(getMinY(), other.getMinY());
  99. } else {
  100. maxX = other.getMaxX();
  101. minX = other.getMinX();
  102. maxY = other.getMaxY();
  103. minY = other.getMinY();
  104. }
  105. final float horizontalDelta = maxX - minX;
  106. final float verticalDelta = maxY - minY;
  107. mBottomLeft.set(minX, minY);
  108. mWidthHeight.set(horizontalDelta, verticalDelta);
  109. }
  110. }

Android游戏框架之基础之AA碰撞系统的更多相关文章

  1. Android游戏框架Libgdx使用入门

    转载自:http://blog.csdn.net/cping1982/article/details/6176191 Libgdx作者博客:http://www.badlogicgames.com/ ...

  2. 识货的拿走:Android游戏框架解读之总体结构

    Android游戏开发的框架图无偿奉上.

  3. 5个最佳的Android测试框架(带示例)

    谷歌的Android生态系统正在不断地迅速扩张.有证据表明,新的移动OEM正在攻陷世界的每一个角落,不同的屏幕尺寸.ROM /固件.芯片组以及等等等等,层出不穷.于是乎,对于Android开发人员而言 ...

  4. 八款常见的Android游戏引擎

    原文地址:http://bbs.csdn.net/topics/380203732 1.Angle  Angle是一款专为Android平台设计的,敏捷且适合快速开发的2D游戏引擎,基于OpenGL  ...

  5. Android 游戏教程让人物动起来

    在这里给大家分享Android游戏教程怎样让人物动起来,话不多说了,直接进入正题. 一. 准备工作     首先要准备好要使用的人物动作图和地形图.把它分割成16个不同的动作,循环播放同一行的4个不同 ...

  6. 记录一下八款开源 Android 游戏引擎

    记录一下八款开源 Android 游戏引擎 虽然android学了点点,然后现在又没学了(我为啥这么没有恒心呢大哭).以后有时间还是要继续学android的,一定要啊!虽然现在没学android游戏编 ...

  7. [Android游戏开发]八款开源 Android 游戏引擎 (巨好的资源)

    初学Android游戏开发的朋友,往往会显得有些无所适从,他们常常不知道该从何处入手,每当遇到自己无法解决的难题时,又往往会一边羡慕于 iPhone下有诸如Cocos2d-iphone之类的免费游戏引 ...

  8. 八款开源 Android 游戏引擎 (巨好的资源)

    转载地址:http://software.intel.com/zh-cn/blogs/2012/01/13/android-4 初学Android游戏开发的朋友,往往会显得有些无所适从,他们常常不知道 ...

  9. Android 八款开源 Android 游戏引擎

    原文地址 本文内容 Angle Rokon LGame AndEngine libgdx jPCT Alien3d Catcake 最近无意间看到一篇关于 Android 搜索引擎的文章,于是搜索了, ...

随机推荐

  1. 再来说说Activity

    经过前面多天的了解,现在可以确信一点: activity提供了用户和程序交互的界面. 而且android里有四大组件:Activity,Service,BroadcastReceiver,Conten ...

  2. Spring MVC 问题列表:目录

    学习SpringMVC时遇到不少问题,这里将其汇总. 1.怎么搭建SpringMVC 2.SpringMVC和Spring使用是配置到一个文件中还是两个配置文件 3.SpringMVC接受从前台请求 ...

  3. JavaScript高级程序设计(第三版)第五章 引用类型

    5.2 Array类型 var colors = new Array(3); //创建一个包含3项的数组 var names = new Array("Greg"); //创建一个 ...

  4. 基于AWS的自动化部署实践

    过年前,我给InfoQ写了篇文章详细介绍我们团队在过去4年基于AWS的自动化部署实践.文章包括了:为什么选择AWS.AWS上自动化部署的优势和挑战.我们的解决方案,以及和AWS DevOps方案(Op ...

  5. HDU ACM 1050 Moving Tables

    Problem Description The famous ACM (Advanced Computer Maker) Company has rented a floor of a buildin ...

  6. Ngix 移动端与Pc端 反向代理判断

    如神马搜索和百度(http://www.baidu.com),当用桌面浏览器和移动浏览器访问的结果是不一样的.其中的手段可能有两种: 转载Ngix反向代理判断 服务端直接判断UA输出不同的界面,JAV ...

  7. delphi 2010 导出sql server 数据到DBF乱码问题

    近日,由于业务需要导出sql server 数据到DBF文件,要查询多表记录,并适当处理后生成导出DBF文件,系统使用delphi2010平台开发. 首先按要求在VFP里创建DBF表,字段数有240个 ...

  8. 有关require package的应用

    http://stackoverflow.com/questions/9302284/relative-paths-with-requirejs-modules-packages http://sta ...

  9. jquery的clone方法bug的修复

    最近发现jquery的clone的bug,textarea和select的jquery的clone方法有问题,textarea和select的值clone的时候会丢掉,在网上发现一个插件,下载地址如下 ...

  10. 转载:rebar和erlang

    使用rebar生成erlang release 并进行热代码升级 http://blog.sina.com.cn/s/blog_6530ad590100wmkn.html 使用rebar工具开发erl ...