首页 > 代码库 > Android游戏框架之基础之AA碰撞系统

Android游戏框架之基础之AA碰撞系统

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

Java代码  收藏代码
  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.   
  17. package com.replica.replicaisland;  
  18.   
  19. /** 
  20.  * An Axis-Aligned rectangular collision volume.  This code treats other volumes as if they are 
  21.  * also rectangles when calculating intersections.  Therefore certain types of intersections, such 
  22.  * as sphere vs rectangle, may not be absolutely precise (in the case of a sphere vs a rectangle, 
  23.  * for example, a new rectangle that fits the sphere is used to perform the intersection test, so 
  24.  * there is some potential for false-positives at the corners).  However, for our purposes absolute 
  25.  * precision isn‘t necessary, so this simple implementation is sufficient. 
  26.  */  
  27. public class AABoxCollisionVolume extends CollisionVolume {  
  28.     private Vector2 mWidthHeight;  
  29.     private Vector2 mBottomLeft;  
  30.       
  31.     public AABoxCollisionVolume(float offsetX, float offsetY, float width, float height) {  
  32.         super();  
  33.         mBottomLeft = new Vector2(offsetX, offsetY);  
  34.         mWidthHeight = new Vector2(width, height);   
  35.     }  
  36.       
  37.     public AABoxCollisionVolume(float offsetX, float offsetY, float width, float height,   
  38.             int hit) {  
  39.         super(hit);  
  40.         mBottomLeft = new Vector2(offsetX, offsetY);  
  41.         mWidthHeight = new Vector2(width, height);  
  42.     }  
  43.       
  44.     @Override  
  45.     public final float getMaxX() {  
  46.         return mBottomLeft.x + mWidthHeight.x;  
  47.     }  
  48.   
  49.     @Override  
  50.     public final float getMinX() {  
  51.         return mBottomLeft.x;  
  52.     }  
  53.       
  54.     @Override  
  55.     public final float getMaxY() {  
  56.         return mBottomLeft.y + mWidthHeight.y;  
  57.     }  
  58.   
  59.     @Override  
  60.     public final float getMinY() {  
  61.         return mBottomLeft.y;  
  62.     }  
  63.       
  64.     /** 
  65.      * Calculates the intersection of this volume and another, and returns true if the 
  66.      * volumes intersect.  This test treats the other volume as an AABox. 
  67.      * @param position The world position of this volume. 
  68.      * @param other The volume to test for intersections. 
  69.      * @param otherPosition The world position of the other volume. 
  70.      * @return true if the volumes overlap, false otherwise. 
  71.      */  
  72.     @Override  
  73.     public boolean intersects(Vector2 position, FlipInfo flip, CollisionVolume other,   
  74.             Vector2 otherPosition, FlipInfo otherFlip) {  
  75.         final float left = getMinXPosition(flip) + position.x;  
  76.         final float right = getMaxXPosition(flip) + position.x;  
  77.         final float bottom = getMinYPosition(flip) + position.y;  
  78.         final float top = getMaxYPosition(flip) + position.y;  
  79.           
  80.         final float otherLeft = other.getMinXPosition(otherFlip) + otherPosition.x;  
  81.         final float otherRight = other.getMaxXPosition(otherFlip) + otherPosition.x;  
  82.         final float otherBottom = other.getMinYPosition(otherFlip) + otherPosition.y;  
  83.         final float otherTop = other.getMaxYPosition(otherFlip) + otherPosition.y;  
  84.          
  85.         final boolean result = boxIntersect(left, right, top, bottom,   
  86.                     otherLeft, otherRight, otherTop, otherBottom)   
  87.                 || boxIntersect(otherLeft, otherRight, otherTop, otherBottom,   
  88.                     left, right, top, bottom);  
  89.           
  90.         return result;  
  91.     }  
  92.       
  93.     /** Tests two axis-aligned boxes for overlap. */  
  94.     private boolean boxIntersect(float left1, float right1, float top1, float bottom1,   
  95.             float left2, float right2, float top2, float bottom2) {  
  96.         final boolean horizontalIntersection = left1 < right2 && left2 < right1;  
  97.         final boolean verticalIntersection = top1 > bottom2 && top2 > bottom1;  
  98.         final boolean intersecting = horizontalIntersection && verticalIntersection;  
  99.         return intersecting;  
  100.     }  
  101.       
  102.     /** Increases the size of this volume as necessary to fit the passed volume. */  
  103.     public void growBy(CollisionVolume other) {  
  104.         final float maxX;  
  105.         final float minX;  
  106.           
  107.         final float maxY;  
  108.         final float minY;  
  109.           
  110.         if (mWidthHeight.length2() > 0) {  
  111.             maxX = Math.max(getMaxX(), other.getMaxX());  
  112.             minX = Math.max(getMinX(), other.getMinX());  
  113.             maxY = Math.max(getMaxY(), other.getMaxY());  
  114.             minY = Math.max(getMinY(), other.getMinY());  
  115.         } else {  
  116.             maxX = other.getMaxX();  
  117.             minX = other.getMinX();  
  118.             maxY = other.getMaxY();  
  119.             minY = other.getMinY();  
  120.         }  
  121.         final float horizontalDelta = maxX - minX;  
  122.         final float verticalDelta = maxY - minY;  
  123.         mBottomLeft.set(minX, minY);  
  124.         mWidthHeight.set(horizontalDelta, verticalDelta);  
  125.     }  
  126.   
  127. }  

Android游戏框架之基础之AA碰撞系统