as3 hitTestPoint обнаруживает альфа

Я пытаюсь создать лабиринт там, где пользователь рисует мышью, и если он ударит о стену, он стирает только что нарисованную линию. У меня есть файл PNG с альфа, который создает стены лабиринта.

Мне нужно, чтобы пользователь рисовал на альфе, но когда он нажмет не альфу, он запустит действие и сотрет линию.

Вот строка, с которой у меня возникают проблемы:

if (myshape.hitTestPoint(theBall.x,theBall.y, true))

Вот полный код:

package 
{
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import flash.display.DisplayObject;
    import flash.display.Graphics;
    import flash.display.JointStyle;
    import flash.display.LineScaleMode;
    import flash.display.Shape;
    import flash.display.Sprite;
    import flash.events.*;



    public class MazeClass extends Sprite
    {
        //Are we drawing or not?
        private var drawing:Boolean;
        public var myshape:Shape;
        public var alreadyDrawn:Shape;
        public var theBall:Ball = new Ball();
        //alreadyDrawn = new Shape();


        public function MazeClass()
        {

            if (stage)
            {

                myshape = new Shape();
                myshape.graphics.lineStyle(12,0x000000);
                addChild(myshape);
                drawing = false;//to start with
                stage.addEventListener(MouseEvent.MOUSE_DOWN, startDrawing);
                stage.addEventListener(MouseEvent.MOUSE_MOVE, draw);
                stage.addEventListener(MouseEvent.MOUSE_UP, stopDrawing);
                //stage.addEventListener(Event.ENTER_FRAME, checkIt);

                addChild(theBall);
            }
        }


        public function startDrawing(event:MouseEvent):void
        {

            myshape.graphics.moveTo( mouseX, mouseY);
            drawing = true;
        }


        public function draw(event:MouseEvent)
        {
            if (drawing)
            {
                //checkIt();
                myshape.graphics.lineTo(mouseX,mouseY);

                if (myshape.hitTestPoint(theBall.x,theBall.y, true))
                {
                    trace("Hit A WALL!");
                    myshape.graphics.clear();
                    myshape.graphics.lineStyle(12, 0xFFFFFF);
                    myshape.graphics.moveTo(mouseX,mouseY);
                }
            }
        }


        public function stopDrawing(event:MouseEvent)
        {
            drawing = false;
        }



    }
}

2 ответа

Другой вариант - проверить цвет пикселя растровых данных карты, который соответствует "позиции игрока" (в данном случае это конец нарисованной линии):

var testPixel:uint = _myBitmapData.getPixel(xPosition, yPosition);

Или вы можете использовать.getPixel32, который включает в себя альфа в возвращаемой uint.

Я НАШЕЛ РАБОЧЕЕ РЕШЕНИЕ:

Я нашел рабочее решение благодаря fsbmain. Спасибо. Я публикую свой полный код в надежде, что это может помочь кому-то еще.

В конце концов мне пришлось использовать другой мувиклип, а не мышь, но это сработало для меня. Теперь вместо того, чтобы рисовать где-нибудь в лабиринте, они должны перетаскивать маленького персонажа по имени Бо через лабиринт. Это работает лучше для меня.

Было бы неплохо узнать, как определить, попала ли мышь или фактическая линия, которую я рисую, в стену. Может быть, кто-то может сделать предложение. Тем не менее, спасибо за помощь мне получить это далеко.

Короткий и важный код, позволяющий моему мувиклипу определять альфа, можно найти здесь. Это действительно очень мало по сравнению с другими сложными вариантами, которые я нашел. Вот ссылка: http://www.mikechambers.com/blog/2009/06/24/using-bitmapdata-hittest-for-collision-detection/

package 
{
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import flash.display.DisplayObject;
    import flash.display.Graphics;
    import flash.display.JointStyle;
    import flash.display.LineScaleMode;
    import flash.display.Shape;
    import flash.display.Sprite;
    import flash.events.*;
    import flash.events.KeyboardEvent;
    import flash.ui.Keyboard;

    import flash.events.TouchEvent;
    import flash.ui.Multitouch;
    import flash.ui.MultitouchInputMode;

    import flash.desktop.NativeApplication;
    import flash.system.Capabilities;

    import flash.display.*;
    import flash.geom.*;

    import flash.display.BitmapData;

    import flash.display.Bitmap;

    import flash.geom.Matrix;

    public class MazeClass extends Sprite
    {
        //Are we drawing or not?
        private var drawing:Boolean;
        public var myshape:Shape;
        public var alreadyDrawn:Shape;
        public var theMap:*;

        public var swiper:Swiper = new Swiper();

        public var Beau:littleBeau = new littleBeau();

        //alreadyDrawn = new Shape();


        public var currentGalleryItem:Number = 1;
        public var totalGalleryItems:Number = 4;

        public var redClipBmpData:BitmapData;
        public var blueClipBmpData:BitmapData;
        public var  redRect:Rectangle;
        public var blueRect:Rectangle;

        public function MazeClass()
        {

            if (stage)
            {
                theMap = new MapOne();

                myshape = new Shape();
                myshape.graphics.lineStyle(33,0x0aa6df);
                addChild(myshape);
                drawing = false;//to start with
                stage.addEventListener(MouseEvent.MOUSE_DOWN, startDrawing);
                stage.addEventListener(MouseEvent.MOUSE_MOVE, draw);
                stage.addEventListener(MouseEvent.MOUSE_UP, stopDrawing);
                //stage.addEventListener(Event.ENTER_FRAME, checkIt);


                stage.addEventListener(KeyboardEvent.KEY_UP, fl_OptionsMenuHandler);

                Multitouch.inputMode = MultitouchInputMode.GESTURE;




                addChild(theMap);
                //theMap.height = stage.stageHeight - 200;
                theMap.theStart.alpha = 0;
                theMap.theFinish.alpha = 0;


                addChild(swiper);
                swiper.y = stage.stageHeight - swiper.height;
                swiper.addEventListener(TransformGestureEvent.GESTURE_SWIPE, fl_SwipeToGoToNextPreviousFrame);

                addChild(Beau);
                Beau.x = theMap.theStart.x;
                Beau.y = theMap.theStart.y - swiper.height;

                Beau.addEventListener(MouseEvent.MOUSE_DOWN, BeauStartDrag);
                Beau.addEventListener(MouseEvent.MOUSE_UP, BeauStopDrag);



                redRect = theMap.getBounds(this);
                redClipBmpData = new BitmapData(redRect.width,redRect.height,true,0);
                redClipBmpData.draw(theMap);

                blueRect = Beau.getBounds(this);
                blueClipBmpData = new BitmapData(blueRect.width,blueRect.height,true,0);
                blueClipBmpData.draw(Beau);

                //blueClipBmpData.x = theMap.theStart.x;
                //blueClipBmpData.y = theMap.theStart.y - swiper.height;

                stage.addEventListener(Event.ENTER_FRAME, enterFrame);

            }
        }




        public function enterFrame(e:Event):void
        {
            //Beau.x = mouseX;
            //Beau.y = mouseY;

            if (redClipBmpData.hitTest(new Point(theMap.x, theMap.y),
                                            255,
                                            blueClipBmpData,
                                            new Point(Beau.x, Beau.y),
                                            255

                                      ))
            {
                trace("hit");
                clearAll();
                //redClip.filters = [new GlowFilter()];
            }
            else
            {
                trace("No Hit");
            }
        }





        public function BeauStartDrag(event:MouseEvent):void
        {

            Beau.startDrag();
            drawing = true;
        }
        public function BeauStopDrag(event:MouseEvent):void
        {
            drawing = false;
            Beau.stopDrag();
        }

        public function startDrawing(event:MouseEvent):void
        {

            myshape.graphics.moveTo( mouseX, mouseY);
        }
        //drawing = true;


        public function draw(event:MouseEvent)
        {
            if (drawing)
            {
                //checkIt();
                myshape.graphics.lineTo(mouseX,mouseY);


            }
        }


        public function stopDrawing(event:MouseEvent)
        {
            //drawing = false;
        }


        public function fl_OptionsMenuHandler(event:KeyboardEvent):void
        {
            if ((event.keyCode == 95) || (event.keyCode == Keyboard.MENU))
            {
                NativeApplication.nativeApplication.exit(0);
            }
        }

        public function clearAll()
        {
            myshape.graphics.clear();
            myshape.graphics.lineStyle(12, 0x0aa6df);
            myshape.graphics.moveTo(mouseX,mouseY);
            Beau.x = theMap.theStart.x;
                    Beau.y = theMap.theStart.y - swiper.height;
                    drawing = false;
            Beau.stopDrag();
        }





        public function fl_SwipeToGoToNextPreviousFrame(event:TransformGestureEvent):void
        {
            if (event.offsetX == 1)
            {
                if (currentGalleryItem > 1)
                {
                    currentGalleryItem--;
                    trace("swipe Right");
                    clearAll();
                    removeChild(theMap);
                    theMap = new MapOne();
                    addChild(theMap);
                    theMap.height = stage.stageHeight - 200;

                    theMap.theStart.alpha = 0;
                    theMap.theFinish.alpha = 0;
                    addChild(Beau);
                    Beau.x = theMap.theStart.x;
                    Beau.y = theMap.theStart.y - swiper.height;
                }
            }
            else if (event.offsetX == -1)
            {
                if (currentGalleryItem < totalGalleryItems)
                {
                    currentGalleryItem++;
                    trace("swipe Left");
                    clearAll();
                    removeChild(theMap);
                    theMap = new MapTwo();
                    addChild(theMap);
                    theMap.height = stage.stageHeight - 200;

                    theMap.theStart.alpha = 0;
                    theMap.theFinish.alpha = 0;
                    addChild(Beau);
                    Beau.x = theMap.theStart.x;
                    Beau.y = theMap.theStart.y - swiper.height;

                }
            }
        }

    }
}
Другие вопросы по тегам