Android游戏框架之基础之AA碰撞系统
AA 碰撞体 就是将所有的物体设置为矩形框进行碰撞计算。下面是代码
- /*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- package com.replica.replicaisland;
- /**
- * An Axis-Aligned rectangular collision volume. This code treats other volumes as if they are
- * also rectangles when calculating intersections. Therefore certain types of intersections, such
- * as sphere vs rectangle, may not be absolutely precise (in the case of a sphere vs a rectangle,
- * for example, a new rectangle that fits the sphere is used to perform the intersection test, so
- * there is some potential for false-positives at the corners). However, for our purposes absolute
- * precision isn't necessary, so this simple implementation is sufficient.
- */
- public class AABoxCollisionVolume extends CollisionVolume {
- private Vector2 mWidthHeight;
- private Vector2 mBottomLeft;
- public AABoxCollisionVolume(float offsetX, float offsetY, float width, float height) {
- super();
- mBottomLeft = new Vector2(offsetX, offsetY);
- mWidthHeight = new Vector2(width, height);
- }
- public AABoxCollisionVolume(float offsetX, float offsetY, float width, float height,
- int hit) {
- super(hit);
- mBottomLeft = new Vector2(offsetX, offsetY);
- mWidthHeight = new Vector2(width, height);
- }
- @Override
- public final float getMaxX() {
- return mBottomLeft.x + mWidthHeight.x;
- }
- @Override
- public final float getMinX() {
- return mBottomLeft.x;
- }
- @Override
- public final float getMaxY() {
- return mBottomLeft.y + mWidthHeight.y;
- }
- @Override
- public final float getMinY() {
- return mBottomLeft.y;
- }
- /**
- * Calculates the intersection of this volume and another, and returns true if the
- * volumes intersect. This test treats the other volume as an AABox.
- * @param position The world position of this volume.
- * @param other The volume to test for intersections.
- * @param otherPosition The world position of the other volume.
- * @return true if the volumes overlap, false otherwise.
- */
- @Override
- public boolean intersects(Vector2 position, FlipInfo flip, CollisionVolume other,
- Vector2 otherPosition, FlipInfo otherFlip) {
- final float left = getMinXPosition(flip) + position.x;
- final float right = getMaxXPosition(flip) + position.x;
- final float bottom = getMinYPosition(flip) + position.y;
- final float top = getMaxYPosition(flip) + position.y;
- final float otherLeft = other.getMinXPosition(otherFlip) + otherPosition.x;
- final float otherRight = other.getMaxXPosition(otherFlip) + otherPosition.x;
- final float otherBottom = other.getMinYPosition(otherFlip) + otherPosition.y;
- final float otherTop = other.getMaxYPosition(otherFlip) + otherPosition.y;
- final boolean result = boxIntersect(left, right, top, bottom,
- otherLeft, otherRight, otherTop, otherBottom)
- || boxIntersect(otherLeft, otherRight, otherTop, otherBottom,
- left, right, top, bottom);
- return result;
- }
- /** Tests two axis-aligned boxes for overlap. */
- private boolean boxIntersect(float left1, float right1, float top1, float bottom1,
- float left2, float right2, float top2, float bottom2) {
- final boolean horizontalIntersection = left1 < right2 && left2 < right1;
- final boolean verticalIntersection = top1 > bottom2 && top2 > bottom1;
- final boolean intersecting = horizontalIntersection && verticalIntersection;
- return intersecting;
- }
- /** Increases the size of this volume as necessary to fit the passed volume. */
- public void growBy(CollisionVolume other) {
- final float maxX;
- final float minX;
- final float maxY;
- final float minY;
- if (mWidthHeight.length2() > 0) {
- maxX = Math.max(getMaxX(), other.getMaxX());
- minX = Math.max(getMinX(), other.getMinX());
- maxY = Math.max(getMaxY(), other.getMaxY());
- minY = Math.max(getMinY(), other.getMinY());
- } else {
- maxX = other.getMaxX();
- minX = other.getMinX();
- maxY = other.getMaxY();
- minY = other.getMinY();
- }
- final float horizontalDelta = maxX - minX;
- final float verticalDelta = maxY - minY;
- mBottomLeft.set(minX, minY);
- mWidthHeight.set(horizontalDelta, verticalDelta);
- }
- }
Android游戏框架之基础之AA碰撞系统的更多相关文章
- Android游戏框架Libgdx使用入门
转载自:http://blog.csdn.net/cping1982/article/details/6176191 Libgdx作者博客:http://www.badlogicgames.com/ ...
- 识货的拿走:Android游戏框架解读之总体结构
Android游戏开发的框架图无偿奉上.
- 5个最佳的Android测试框架(带示例)
谷歌的Android生态系统正在不断地迅速扩张.有证据表明,新的移动OEM正在攻陷世界的每一个角落,不同的屏幕尺寸.ROM /固件.芯片组以及等等等等,层出不穷.于是乎,对于Android开发人员而言 ...
- 八款常见的Android游戏引擎
原文地址:http://bbs.csdn.net/topics/380203732 1.Angle Angle是一款专为Android平台设计的,敏捷且适合快速开发的2D游戏引擎,基于OpenGL ...
- Android 游戏教程让人物动起来
在这里给大家分享Android游戏教程怎样让人物动起来,话不多说了,直接进入正题. 一. 准备工作 首先要准备好要使用的人物动作图和地形图.把它分割成16个不同的动作,循环播放同一行的4个不同 ...
- 记录一下八款开源 Android 游戏引擎
记录一下八款开源 Android 游戏引擎 虽然android学了点点,然后现在又没学了(我为啥这么没有恒心呢大哭).以后有时间还是要继续学android的,一定要啊!虽然现在没学android游戏编 ...
- [Android游戏开发]八款开源 Android 游戏引擎 (巨好的资源)
初学Android游戏开发的朋友,往往会显得有些无所适从,他们常常不知道该从何处入手,每当遇到自己无法解决的难题时,又往往会一边羡慕于 iPhone下有诸如Cocos2d-iphone之类的免费游戏引 ...
- 八款开源 Android 游戏引擎 (巨好的资源)
转载地址:http://software.intel.com/zh-cn/blogs/2012/01/13/android-4 初学Android游戏开发的朋友,往往会显得有些无所适从,他们常常不知道 ...
- Android 八款开源 Android 游戏引擎
原文地址 本文内容 Angle Rokon LGame AndEngine libgdx jPCT Alien3d Catcake 最近无意间看到一篇关于 Android 搜索引擎的文章,于是搜索了, ...
随机推荐
- 小数点输出精度控制问题 .xml
pre{ line-height:1; color:#9f1d66; background-color:#d2d2d2; font-size:16px;}.sysFunc{color:#5d57ff; ...
- WebSocket with Flask
转自:https://blog.shonenada.com/post/websocket-with-flask/ WebSocket with Flask HTML5 以前,HTML 还不支持 Web ...
- MySql 5.6 慢查询
网上都巨坑 最后在官网找到了开启方法 原来是配置文件改了 Updated example for 2015 MySQL 5.6: slow_query_log = 1slow_query_log_fi ...
- 20160512关于mac安装caffe的记录
记得2015年在mac系统上安装过一次caffe,非常顺利,但是最近群里许多同学反映mac安装caffe出现了各种问题,同时我也在帮助别人安装caffe的时候也遇到了一些坑,不再像以前这么顺利了.估计 ...
- 手势冲突UIPanGestureRecognizer 和UIPinchGestureRecognizer
当同时使用pan和pin手势时假如冲突,需要加入下面方法 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shou ...
- 如何开启多用户同时远程连接(Windows2008 Windows2012)
- 【转】类中如何引用server.MapPath()
转至:http://blog.csdn.net/tangjianft/article/details/5357151 今天在写一个上传图片方法时遇到了两个问题:1.public string getI ...
- 关于python all(itrable)的使用 和列表表达式使用以及复习一下短路效应。
其实现在来看 并不是什么高级特性. 但是当时看到
- 删除Ngnix 日志
删除Ngnix日志的脚本 #!/bin/bash #初始化 LOGS_PATH=$(pwd)/logs YESTERDAY=$(date -d "yesterday" +%Y-%m ...
- HD1049Climbing Worm
Problem Description An inch worm is at the bottom of a well n inches deep. It has enough energy to c ...