Collision Detection of Sprites in Actionscript 3.0 Flash

后端 未结 3 1682
我寻月下人不归
我寻月下人不归 2021-01-16 11:28

I am making an achtung die kurve-like game in AS3.0. So far I\'ve done the movements of the 4 different players, and it works alright.

I am now to make collision de

3条回答
  •  轮回少年
    2021-01-16 11:50

    Try this function if you want a Pixel Perfect Collision Detection with efficient CPU usage:

    trace("Collided: " + (areaOfCollision(mc1, mc2) != null));
    trace("Where: " + areaOfCollision(mc1, mc2));
    
    function areaOfCollision(object1:DisplayObject, object2:DisplayObject, tolerance:int = 255):Rectangle {
        if (object1.hitTestObject(object2)) {
            var limits1:Rectangle = object1.getBounds(object1.parent);
            var limits2:Rectangle = object2.getBounds(object2.parent);
            var limits:Rectangle = limits1.intersection(limits2);
            limits.x = Math.floor(limits.x);
            limits.y = Math.floor(limits.y);
            limits.width = Math.ceil(limits.width);
            limits.height = Math.ceil(limits.height);
            if (limits.width < 1 || limits.height < 1) return null;
    
            var image:BitmapData = new BitmapData(limits.width, limits.height, false);
            var matrix:Matrix = object1.transform.concatenatedMatrix;
            matrix.translate(-limits.left, -limits.top);
            image.draw(object1, matrix, new ColorTransform(1, 1, 1, 1, 255, -255, -255, tolerance));
            matrix = object2.transform.concatenatedMatrix;
            matrix.translate(-limits.left, -limits.top);
            image.draw(object2, matrix, new ColorTransform(1, 1, 1, 1, 255, 255, 255, tolerance), BlendMode.DIFFERENCE);
    
            var intersection:Rectangle = image.getColorBoundsRect(0xFFFFFFFF, 0xFF00FFFF);
            if (intersection.width == 0) return null;
            intersection.offset(limits.left, limits.top);
            return intersection;
        }
        return null;
    }
    

    After a successful preliminary hitTestObject(), this function backgroundly takes a snapshot from the shapes of both objects painted with different colors each, then overlays them intersecting the colors on a new one, returning the Rectangle of the resulting shape. So cool.

    To learn more about Pixel Perfect Collision Detection you can google Collision Detection followed by one of these names: "The ActionScript Man", "Troy Gilbert", "Boulevart (wim)", "Grant Skinner (gSkinner)" or "Senocular". Those guys are awesome AS3 references by the way.

提交回复
热议问题