(动作稿3)墙壁与播放器之间是否具有完美的像素碰撞检测功能? [英] (Actionscript 3) Pixel-perfect collision detection between the walls and player?

查看:88
本文介绍了(动作稿3)墙壁与播放器之间是否具有完美的像素碰撞检测功能?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试制作一个Flash游戏,其中在玩家和墙壁之间进行碰撞检测.但是,当我尝试使用Wall11.hitTestPoint()时,无法获得完美的碰撞检测.然后,我决定使用位图,但由于壁的形状不规则(不是正方形,矩形,圆形或任何常规形状),因此很难对此进行编码.无论如何,有没有改善与墙的碰撞检测的方法?

I am trying to make a flash game in which there is collision detection between the player and the walls. However, when I try using Wall11.hitTestPoint(), I cannot get the collision detection to be perfect. Then, I decided to use bitmap but it is hard to code this because the wall is irregularly shaped (it is not a square, rectangle, circle or any regular shape). Is there anyway to improve the collision detection with walls?

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

推荐答案

这些是hitTestPoint内容的基础.

These are basics of hitTestPoint stuff.

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

这篇关于(动作稿3)墙壁与播放器之间是否具有完美的像素碰撞检测功能?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆