`
daojin
  • 浏览: 690079 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

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);
    }

}

 

0
0
分享到:
评论

相关推荐

    Android程序开发试验报告--AA结算app

    【Android程序开发试验报告--AA结算app】 本实验报告详细介绍了如何开发一款名为AAPay的AA结算应用程序。这款应用旨在解决多人共同消费时复杂的账单计算问题,提供了一个简单易用的团队账目管理工具,适合聚会、...

    外围AA碰撞中的重介子光产生

    在LHC的s = 2.76 TeV和s = 5.02 TeV时,在外围Pb-Pb碰撞中研究了重矢量介子ψ和Y的唯一光产生。 为了评估先前在超外围条件下测试过的圆锥形偶极子形式主义的鲁棒性,计算了三个中心度类别的速度分布和核修饰因子(RA...

    aard2-android, Android的Aard2,一个简单的字典应用程序.zip

    aard2-android, Android的Aard2,一个简单的字典应用程序 用于Android的 Aard 2Android 2的Aard是 Android的 Aard字典的继承者。 它带有重新设计的用户界面,书签,历史和更好的字典存储格式。下载用于Android的 Aa...

    在高能pA和AA碰撞中在中央生产中隔离Odderon

    我们研究了pA和AA碰撞中C偶数介子的中央排他性生产截面的速度依赖性,其中A是重离子。 我们观察到由$$ \γ$$γ-Odderon和Pomeron-Pomeron融合机制引起的贡献在质量上有不同的行为。 这可用于从仅在前向区域产生的$$ ...

    aa.rar_AA自动调焦_AA调焦_AA调焦指_处理系统_相机

    "aa.rar_AA自动调焦_AA调焦_AA调焦指_处理系统_相机"这个压缩包文件很可能包含了一份关于基于图像处理的相机自动调焦系统的详细资料,这将涉及到多个关键知识点。 首先,我们要理解“自动调焦”(AA自动调焦)的...

    aa.rar_android

    3. **传感器信息**:Android系统提供了一个传感器框架,通过`SensorManager`服务,开发者可以访问设备上的各种传感器,如加速度计、陀螺仪、光线感应器等。`Sensor`类代表一个传感器,`SensorEvent`类则封装了传感器...

    Android的学习资料汇编

    此文件可能是一个关于Android游戏开发的教程,可能包含了游戏编程的基本概念,如游戏循环,碰撞检测,动画处理,以及如何利用Android SDK中的Game Services来实现游戏得分和成就系统。对于希望开发Android游戏的...

    android图书管理系统+javaweb后台服务器代码

    《Android图书管理系统与JavaWeb...开发者需要具备扎实的Java基础,理解Android SDK和Web服务端框架的使用,同时掌握数据库设计和管理技巧。通过这个项目,不仅可以提升技术能力,还能了解到实际开发中的协作与沟通。

    AA制消费系统

    "AA制消费系统"是一种基于C++编程语言开发的管理信息系统(MIS),旨在提供高效、便捷的消费管理解决方案。该系统充分利用了C++的强大功能和灵活性,为用户带来直观且美观的界面体验。 在C++开发环境中,设计这样一...

    Android-app.rar

    Android--AA记账助手 Android--Hide-Music-Player Android-3D卡片效果 android个人中心页面效果源码 Android仿微博、微信、qq 点击缩略图TransferImage Android例子源码IOS风格的uitableview列表 Android例子源码IOS...

    AA制消费信息管理系统

    "AA制消费信息管理系统"是一个专门针对AA制消费场景设计的应用程序,旨在帮助用户更方便地管理和记录共同消费的情况。在多人共同消费时,往往会出现账目复杂、计算繁琐的问题,该系统就是为了解决这些问题而存在的。...

    Android_8.9.55_BBPJ_64_808277f8aa36e3494dae1b190c2aece.apk

    Android_8.9.55_BBPJ_64_808277f8aa36e3494dae1b190c2aece.apk

    常用开源游戏引擎(ios、android平台)

    RealmForge是.NET 3D游戏引擎Visual3D.NET的前身,这套引擎不仅包含了游戏引擎和运行时系统,还集成了.Net 2.0应用框架、XNA框架以及一系列开发工具。Visual3D设计师更是提供了类似Visual Studio 2005的可定制化设计...

    Android程序设计结课设计 Android 考试系统设计

    2.3 系统的主要功能 2 3.设计方案 3 3.1系统需求分析(给出程序的功能模块图,对各个功能作出详细介绍) 3 3.2系统界面设计(给出界面截图及其主要类的属性设置) 3 3.3系统程序设计(功能模块给出详细的程序代码,重点...

    Android手机另类刷机方法之ADB

    ADB作为Android开发中不可或缺的工具之一,在设备调试、系统升级等方面具有重要作用。本文介绍了一种基于ADB的特殊刷机方法,通过这种方式可以更灵活地管理和更新Android设备。掌握这些技巧对于开发者来说是非常有用...

    MDZ-16-AA+(Stock+1.3.106)

    Mi Box 3是由小米公司推出的一款基于Android系统的智能电视盒子,允许用户通过互联网流媒体服务观看视频、玩游戏和使用各种应用程序。 这个特定的固件版本"1.3.106"可能包含一系列的性能改进、错误修复和新功能。在...

    在pp,pA和AA碰撞中光子和Pomeron诱导的Dijets产生

    在本文中,我们对LHC能量下pp,pA和AA碰撞中光子-光子,光子-pomeron和pomeron-pomeron相互作用产生的双喷产生进行了详细的比较。 使用前向物理蒙特卡洛(FPMC)在LHC能量下计算横截面的横向动量,伪快速度和角度...

    aa.rar_51aa51_51aa51。com_www.51aa51_www51aa51com

    标题中的"aa.rar_51aa51_51aa51。com_www.51aa51_www51aa51com"似乎是一个压缩文件名,它可能包含了与一个网站(51aa51.com)相关的项目或教程。然而,这个部分并不直接提供具体的技术知识点,更像是一个文件的标识...

    基于Android系统的移栽机器人人机交互技术与状态监控系统设计.pdf

    数据采集模块是系统核心之一,它负责从移栽机器人实时获取地理位置信息、种苗质量信息等,并进行展示。同时,它还能实现故障信息的解析和报警,以及用户通过移动端对机器人参数进行设置和反馈信息的接收。 存储读取...

Global site tag (gtag.js) - Google Analytics