(Actionscript 3)墙壁和播放器之间的像素完美碰撞检测?

时间:2017-02-13 23:06:53

标签: actionscript-3 flash

我正在尝试制作一个Flash游戏,其中玩家和墙壁之间存在碰撞检测。但是,当我尝试使用Wall11.hitTestPoint()时,我无法让碰撞检测变得完美。然后,我决定使用位图,但很难编码,因为墙是不规则形状(它不是正方形,矩形,圆形或任何规则形状)。反正是否有改善墙壁的碰撞检测?

function checkCollision(_debug:Boolean = false):Boolean {           
        var bmd1:BitmapData = new BitmapData(Wall11.width, Wall11.height, true, 0);
        var bmd2:BitmapData = new BitmapData(LevelOnePlayer.width, LevelOnePlayer.height, true, 0);

        bmd1.draw(Wall11);
        bmd2.draw(LevelOnePlayer);

        if (_debug) {
            var bmp:Bitmap = new Bitmap(bmd1);
            bmp.x = Wall11.x;
            bmp.y = Wall11.y;
            addChild(bmp);

            var bmp2:Bitmap = new Bitmap(bmd2);
            bmp2.x = LevelOnePlayer.x;
            bmp2.y = LevelOnePlayer.y;
            addChild(bmp2);
        }
        if(bmd1.hitTest(new Point(Wall11.x, Wall11.y), 255, bmd2, new Point(LevelOnePlayer.x, LevelOnePlayer.y), 255))
        return true;
        if (!_debug) {
            bmd1.dispose();
            bmd2.dispose();
        }
        return false;
    }    

1 个答案:

答案 0 :(得分:0)

这些是hitTestPoint的基础知识。

package 
{
    import flash.geom.Point;

    import flash.events.Event;

    import flash.display.Shape;
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;

    import flash.text.TextField;
    import flash.text.TextFormat;
    import flash.text.TextFormatAlign;

    public class HitTest extends Sprite
    {
        private var textArea:TextField;
        private var Circle:Shape;
        private var Box:Shape;

        public function HitTest()
        {
            if (stage) onStage();
            else addEventListener(Event.ADDED_TO_STAGE, onStage);
        }

        private function onStage(e:Event = null):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, onStage);

            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.showDefaultContextMenu = false;
            stage.align = StageAlign.TOP_LEFT;
            stage.stageFocusRect = false;

            addShapes();
            addLabel();
            onFrame();

            // Call it every frame to keep things updated.
            addEventListener(Event.ENTER_FRAME, onFrame);
        }

        private function onFrame(e:Event = null):void
        {
            // Place graphics to the center of the stage.
            x = stage.stageWidth >> 1;
            y = stage.stageHeight >> 1;

            // Lets detect collision with the circle.
            var aPoint:Point = new Point();

            // Take local mouse coordinates within the target shape.
            aPoint.x = Circle.mouseX;
            aPoint.y = Circle.mouseY;

            // Convert them into the root coordinates - it is the ONLY correct way.
            // Comment the next 2 lines to see how local coordinates fail to work.
            aPoint = Circle.localToGlobal(aPoint);
            aPoint = root.globalToLocal(aPoint);

            // Hit test the point against shape.
            // Set the last parameter to false to see hitTest against the shape bounding box.
            var aHit:Boolean = Circle.hitTestPoint(aPoint.x, aPoint.y, true);

            textArea.text = aHit? "! HIT !": "NO HIT";
        }

        private function addShapes():void
        {
            Circle = new Shape();
            Circle.graphics.lineStyle(2, 0x000000, 1);
            Circle.graphics.beginFill(0xCC99FF, 1);
            Circle.graphics.drawCircle(0, 0, 50);
            Circle.graphics.endFill();

            Box = new Shape();
            Box.graphics.lineStyle(0, 0xCCCCCC, 1);
            Box.graphics.drawRect(-50, -50, 100, 100);

            addChild(Box);
            addChild(Circle);
        }

        private function addLabel():void
        {
            textArea = new TextField();

            textArea.x = 10;
            textArea.y = 10;
            textArea.width = 70;
            textArea.height = 20;

            textArea.border = true;
            textArea.wordWrap = false;
            textArea.multiline = true;
            textArea.selectable = true;
            textArea.background = true;
            textArea.mouseEnabled = false;

            var aFormat:TextFormat;

            aFormat = textArea.getTextFormat();
            aFormat.font = "_typewriter";
            aFormat.size = 12;
            aFormat.bold = true;
            aFormat.align = TextFormatAlign.CENTER;

            textArea.setTextFormat(aFormat);
            textArea.defaultTextFormat = aFormat;

            stage.addChild(textArea);
            textArea.text = "NO HIT";
        }
    }
}
相关问题