侧面碰撞flash actionscript-3?

时间:2011-04-06 01:30:06

标签: flash actionscript-3 collision

有没有人有任何示例/知道任何教程可以让我在flash actionscript 3中与对象进行侧面碰撞?我一直在寻找,但却找不到任何东西..感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

我相信您正在寻找的是所有显示对象都可以使用的“hitTest”功能。 hitTestObject告诉您两个对象是否发生了碰撞,而hitTestPoint会告诉您对象是否与某个点发生了碰撞。比如说,名为“myDisplayObj”的MovieClip var:

if( myDisplayObj.hitTestObject(otherDisplayObj) ){ //do object collision code }
if( myDisplayObj.hitTestPoint(100,350) ){ //do point collision code }

答案 1 :(得分:0)

试试这个..

实现是 checkForCollision()将返回一个String来表示你碰撞的那一方。要检查碰撞的对象需要扩展此类。此外,如果要使用有角度的图块,请将 angl 属性设置为 tl,bl,tr,tl 以表示倾斜边的位置。希望这不会太混乱。

public class Impassable extends MovieClip
{
    // Vars
    public var angl:String = "";

    /**
     * Checks if the specified point collides with this
     * @param cx The x value of the point being checked
     * @param cy The y value of the point being checked
     * @param offset An offset from the edges of this that can be considered as part of the radius of this
     * @return A String representing the side that a collision was detected on
     */
    public function checkForCollision(cx:int, cy:int, offset:int=0):String
    {
        if(angl.length < 1)
        {
            // Horizontal
            if(cy > y - 1 && cy < y + height + 1)
            {
                if(cx > x - offset && cx < x + width/2) return 'WEST';
                if(cx < x + width + offset && cx > x + width/2) return 'EAST';
            }

            // Vertical
            if(cx > x - 1 && cx < x + height + 1)
            {
                if(cy > y - offset && cy < y + height/2) return 'NORTH';
                if(cy < y + height + offset && cy > y + height/2) return 'SOUTH';
            }
        }
        else
        {
            // Gradient (1)
            var xgr:Number = cx - x;
            var ygr:Number = cy - y;
            var ua:Boolean = false;

            // Angled Tiles
            if(angl == "tl")
            {
                // Top Left
                if(cx > x - 1 && cy > y - 1) ua = true;
                if(ua)
                {
                    // Angle Collision
                    if(cy < y + height - xgr + offset || cx < x + width - ygr + offset) return 'SOUTH_EAST';
                }
                else
                {
                    // Straight Collision
                    if(cy > y - 1 && cy < y + height + 1)
                    {
                        if(cx > x - offset && cx < x + width/2) return 'WEST';
                    }
                    if(cx > x - 1 && cx < x + height + 1)
                    {
                        if(cy > y - offset && cy < y + height/2) return 'NORTH';
                    }
                }
            }
            if(angl == "tr")
            {
                // Top Right
                if(cx < x + width + 1 && cy > y - 1) ua = true;
                if(ua)
                {
                    // Angle Collision
                    if(cy < y + height - (width - xgr) + offset || cx > x + ygr - offset) return 'SOUTH_WEST';
                }
                else
                {
                    // Straight Collision
                    if(cy > y - 1 && cy < y + height + 1)
                    {
                        if(cx < x + width + offset && cx > x + width/2) return 'EAST';
                    }
                    if(cx > x - 1 && cx < x + height + 1)
                    {
                        if(cy > y - offset && cy < y + height/2) return 'NORTH';
                    }
                }
            }
            if(angl == "br")
            {
                // Bottom Right
                if(cx < x + width + 1 && cy < y + height + 1) ua = true;
                if(ua)
                {
                    // Angle Collision
                    if(cx > x + (height - ygr) - offset || cy > y + height - xgr - offset) return 'NORTH_WEST';
                }
                else
                {
                    // Straight Collision
                    if(cy > y - 1 && cy < y + height + 1)
                    {
                        if(cx < x + width + offset && cx > x + width/2) return 'EAST'
                    }
                    if(cx > x - 1 && cx < x + height + 1)
                    {
                        if(cy < y + height + offset && cy > y + height/2) return 'SOUTH';
                    }
                }
            }
            if(angl == "bl")
            {
                // Bottom Left
                if(cx > x - 1 && cy < y + height + 1) ua = true;
                if(ua)
                {
                    // Angle Collision
                    if(cx < x + ygr + offset || cy > y + xgr - offset) return 'NORTH_EAST';
                }
                else
                {
                    // Straight Collision
                    if(cy > y - 1 && cy < y + height + 1)
                    {
                        if(cx > x - offset && cx < x + width/2) return 'WEST';
                    }
                    if(cx > x - 1 && cx < x + height + 1)
                    {
                        if(cy < y + height + offset && cy > y + height/2) return 'SOUTH';
                    }
                }
            }
        }

        return "";
    }
}