Android游戏框架之基础之AA碰撞系统_移动开发_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > 移动开发 > Android游戏框架之基础之AA碰撞系统

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

 2014/10/15 10:06:37  xiaochao1234  程序员俱乐部  我要评论(0)
  • 摘要:AA碰撞体就是将所有的物体设置为矩形框进行碰撞计算。下面是代码Java代码/**Copyright(C)2010TheAndroidOpenSourceProject**LicensedundertheApacheLicense,Version2.0(the"License");*youmaynotusethisfileexceptincompliancewiththeLicense.*YoumayobtainacopyoftheLicenseat**http://www.apache
  • 标签:android 游戏

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

Java代码 javascripts/syntaxhighlighter/clipboard_new.swf" type="application/x-shockwave-flash">class%20AABoxCollisionVolume%20extends%20CollisionVolume%20%7B%0A%20%20%20%20private%20Vector2%20mWidthHeight%3B%0A%20%20%20%20private%20Vector2%20mBottomLeft%3B%0A%20%20%20%20%0A%20%20%20%20public%20AABoxCollisionVolume(float%20offsetX%2C%20float%20offsetY%2C%20float%20width%2C%20float%20height)%20%7B%0A%20%20%20%20%20%20%20%20super()%3B%0A%20%20%20%20%20%20%20%20mBottomLeft%20%3D%20new%20Vector2(offsetX%2C%20offsetY)%3B%0A%20%20%20%20%20%20%20%20mWidthHeight%20%3D%20new%20Vector2(width%2C%20height)%3B%20%0A%20%20%20%20%7D%0A%20%20%20%20%0A%20%20%20%20public%20AABoxCollisionVolume(float%20offsetX%2C%20float%20offsetY%2C%20float%20width%2C%20float%20height%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20int%20hit)%20%7B%0A%20%20%20%20%20%20%20%20super(hit)%3B%0A%20%20%20%20%20%20%20%20mBottomLeft%20%3D%20new%20Vector2(offsetX%2C%20offsetY)%3B%0A%20%20%20%20%20%20%20%20mWidthHeight%20%3D%20new%20Vector2(width%2C%20height)%3B%0A%20%20%20%20%7D%0A%20%20%20%20%0A%20%20%20%20%40Override%0A%20%20%20%20public%20final%20float%20getMaxX()%20%7B%0A%20%20%20%20%20%20%20%20return%20mBottomLeft.x%20%2B%20mWidthHeight.x%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%40Override%0A%20%20%20%20public%20final%20float%20getMinX()%20%7B%0A%20%20%20%20%20%20%20%20return%20mBottomLeft.x%3B%0A%20%20%20%20%7D%0A%20%20%20%20%0A%20%20%20%20%40Override%0A%20%20%20%20public%20final%20float%20getMaxY()%20%7B%0A%20%20%20%20%20%20%20%20return%20mBottomLeft.y%20%2B%20mWidthHeight.y%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%40Override%0A%20%20%20%20public%20final%20float%20getMinY()%20%7B%0A%20%20%20%20%20%20%20%20return%20mBottomLeft.y%3B%0A%20%20%20%20%7D%0A%20%20%20%20%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Calculates%20the%20intersection%20of%20this%20volume%20and%20another%2C%20and%20returns%20true%20if%20the%0A%20%20%20%20%20*%20volumes%20intersect.%20%20This%20test%20treats%20the%20other%20volume%20as%20an%20AABox.%0A%20%20%20%20%20*%20%40param%20position%20The%20world%20position%20of%20this%20volume.%0A%20%20%20%20%20*%20%40param%20other%20The%20volume%20to%20test%20for%20intersections.%0A%20%20%20%20%20*%20%40param%20otherPosition%20The%20world%20position%20of%20the%20other%20volume.%0A%20%20%20%20%20*%20%40return%20true%20if%20the%20volumes%20overlap%2C%20false%20otherwise.%0A%20%20%20%20%20*%2F%0A%20%20%20%20%40Override%0A%20%20%20%20public%20boolean%20intersects(Vector2%20position%2C%20FlipInfo%20flip%2C%20CollisionVolume%20other%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20Vector2%20otherPosition%2C%20FlipInfo%20otherFlip)%20%7B%0A%20%20%20%20%20%20%20%20final%20float%20left%20%3D%20getMinXPosition(flip)%20%2B%20position.x%3B%0A%20%20%20%20%20%20%20%20final%20float%20right%20%3D%20getMaxXPosition(flip)%20%2B%20position.x%3B%0A%20%20%20%20%20%20%20%20final%20float%20bottom%20%3D%20getMinYPosition(flip)%20%2B%20position.y%3B%0A%20%20%20%20%20%20%20%20final%20float%20top%20%3D%20getMaxYPosition(flip)%20%2B%20position.y%3B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20final%20float%20otherLeft%20%3D%20other.getMinXPosition(otherFlip)%20%2B%20otherPosition.x%3B%0A%20%20%20%20%20%20%20%20final%20float%20otherRight%20%3D%20other.getMaxXPosition(otherFlip)%20%2B%20otherPosition.x%3B%0A%20%20%20%20%20%20%20%20final%20float%20otherBottom%20%3D%20other.getMinYPosition(otherFlip)%20%2B%20otherPosition.y%3B%0A%20%20%20%20%20%20%20%20final%20float%20otherTop%20%3D%20other.getMaxYPosition(otherFlip)%20%2B%20otherPosition.y%3B%0A%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20final%20boolean%20result%20%3D%20boxIntersect(left%2C%20right%2C%20top%2C%20bottom%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20otherLeft%2C%20otherRight%2C%20otherTop%2C%20otherBottom)%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7C%7C%20boxIntersect(otherLeft%2C%20otherRight%2C%20otherTop%2C%20otherBottom%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20left%2C%20right%2C%20top%2C%20bottom)%3B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20return%20result%3B%0A%20%20%20%20%7D%0A%20%20%20%20%0A%20%20%20%20%2F**%20Tests%20two%20axis-aligned%20boxes%20for%20overlap.%20*%2F%0A%20%20%20%20private%20boolean%20boxIntersect(float%20left1%2C%20float%20right1%2C%20float%20top1%2C%20float%20bottom1%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20float%20left2%2C%20float%20right2%2C%20float%20top2%2C%20float%20bottom2)%20%7B%0A%20%20%20%20%20%20%20%20final%20boolean%20horizontalIntersection%20%3D%20left1%20%3C%20right2%20%26%26%20left2%20%3C%20right1%3B%0A%20%20%20%20%20%20%20%20final%20boolean%20verticalIntersection%20%3D%20top1%20%3E%20bottom2%20%26%26%20top2%20%3E%20bottom1%3B%0A%20%20%20%20%20%20%20%20final%20boolean%20intersecting%20%3D%20horizontalIntersection%20%26%26%20verticalIntersection%3B%0A%20%20%20%20%20%20%20%20return%20intersecting%3B%0A%20%20%20%20%7D%0A%20%20%20%20%0A%20%20%20%20%2F**%20Increases%20the%20size%20of%20this%20volume%20as%20necessary%20to%20fit%20the%20passed%20volume.%20*%2F%0A%20%20%20%20public%20void%20growBy(CollisionVolume%20other)%20%7B%0A%20%20%20%20%20%20%20%20final%20float%20maxX%3B%0A%20%20%20%20%20%20%20%20final%20float%20minX%3B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20final%20float%20maxY%3B%0A%20%20%20%20%20%20%20%20final%20float%20minY%3B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20if%20(mWidthHeight.length2()%20%3E%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20maxX%20%3D%20Math.max(getMaxX()%2C%20other.getMaxX())%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20minX%20%3D%20Math.max(getMinX()%2C%20other.getMinX())%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20maxY%20%3D%20Math.max(getMaxY()%2C%20other.getMaxY())%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20minY%20%3D%20Math.max(getMinY()%2C%20other.getMinY())%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20maxX%20%3D%20other.getMaxX()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20minX%20%3D%20other.getMinX()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20maxY%20%3D%20other.getMaxY()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20minY%20%3D%20other.getMinY()%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20final%20float%20horizontalDelta%20%3D%20maxX%20-%20minX%3B%0A%20%20%20%20%20%20%20%20final%20float%20verticalDelta%20%3D%20maxY%20-%20minY%3B%0A%20%20%20%20%20%20%20%20mBottomLeft.set(minX%2C%20minY)%3B%0A%20%20%20%20%20%20%20%20mWidthHeight.set(horizontalDelta%2C%20verticalDelta)%3B%0A%20%20%20%20%7D%0A%0A%7D%0A" />ways" /> 收藏代码
  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. }  
发表评论
用户名: 匿名