Ошибка ссылки AS3 при использовании пользовательского события - PullRequest
0 голосов
/ 25 декабря 2011

* РЕДАКТИРОВАТЬ - Я нахожу, что выдает ошибку, когда я пытаюсь изменить графические свойства фрагмента ролика. *

Я получаю этоошибка.«ReferenceError: Ошибка # 1069: элемент свойства не найден на flash.events.MouseEvent и значение по умолчанию отсутствует. PlayScreen / onClick ()».Я провел небольшое исследование, и большинство сайтов говорят, что это из-за опечатки.но насколько я могу судить, это выглядит хорошо?

У меня есть два события, которые изложены точно так же, как я могу сказать.Один запускается по щелчку, а другой - по нему.Событие hover работает нормально, но когда я использую событие onclick, я получаю сообщение об ошибке выше.Однако, несмотря на то, что я получаю сообщение об ошибке, функция по-прежнему работает как надо.

Вот мой код.код ниже создает новую сетку.Затем добавляются пользовательские события.событие hover работает без ошибок.событие onclick работает нормально, но я получаю сообщение об ошибке.

package  {
import flash.events.MouseEvent;
import flash.display.MovieClip;
public class PlayScreen extends MovieClip {
    public var grid:Grid;

    public function PlayScreen() {
        grid = new Grid();
        grid.addEventListener( GridEvent.HOVER, onHover);
        grid.addEventListener( GridEvent.TILECLICK, onClick);
        grid.x = 0;
        grid.y = 0;
        addChild( grid );

    }

    public function onHover(event:*){
        event.item.graphics.beginFill(0x66ff66);
        event.item.graphics.lineStyle(2, 0x22ff22);
        event.item.graphics.drawRect(-30*0.5, -30*0.5, 30, 30);
        event.item.graphics.endFill();

    }

    public function onClick(event:*){
        event.item.graphics.beginFill(0x000000);
        event.item.graphics.lineStyle(2, 0x22ff22);
        event.item.graphics.drawRect(-30*0.5, -30*0.5, 30, 30);
        event.item.graphics.endFill();
    }

Ниже приведен мой класс сетки.Он содержит мувиклип, к которому добавлены два события mouseEvents, которые затем запускают пользовательские события.

package  {
import flash.display.MovieClip;
import flash.events.MouseEvent;

public class Grid extends MovieClip {

    public function Grid() {
        var test = new MovieClip();
        test.x = 0;
        test.y = 0;
        test.graphics.beginFill(0x66ff66); 
        test.graphics.drawRect(-tileWidth*0.5, -tileHeight*0.5, tileWidth, tileHeight);
        test.graphics.endFill();
        test.addEventListener(MouseEvent.MOUSE_OVER, overTile);
        test.addEventListener(MouseEvent.MOUSE_DOWN, clickTile);
        addChild(test);
    }

    function overTile (event:*) {
        dispatchEvent( new GridEvent( GridEvent.HOVER, event.target) );
    }

    function clickTile(event:*) {
        dispatchEvent( new GridEvent( GridEvent.TILECLICK, event.target) );
    }

}

Ниже приведены мои пользовательские события

   package  
{
    import flash.events.Event;
    public class GridEvent extends Event
    {
        public static const HOVER :String = "hover";
        public static const TILECLICK :String = "click";
        public var item;

        public function GridEvent (type:String, item)
        {
                this.item = item;
                super(type);
        }

    }
}

1 Ответ

1 голос
/ 25 декабря 2011

попробуйте указать тип event и item.используйте Sprite вместо MovieClip.

и еще одну вещь, которую я не реализовал - было бы лучше, если бы вы создали собственный класс Tile для своих плиток, тогда вы могли бы установить тип элемента в вашемGridEvent как Tile, а не как Sprite / MovieClip.

это должно работать ....

package  
{
    import flash.events.MouseEvent;
    import flash.display.MovieClip;
    public class PlayScreen extends MovieClip 
    {
        public var grid:Grid;

        public function PlayScreen() 
        {
            grid = new Grid();
            grid.addEventListener( GridEvent.HOVER, onHover);
            grid.addEventListener( GridEvent.TILECLICK, onClick);
            grid.x = 0;
            grid.y = 0;
            addChild( grid );

        }

        private function onHover(event:GridEvent):void
        {
            if (event.item != null)
            {
                var g:Graphics = event.item.graphics;
                g.beginFill(0x66ff66);
                g.lineStyle(2, 0x22ff22);
                g.drawRect(-30*0.5, -30*0.5, 30, 30);
                g.endFill();
            }
        }

        private function onClick(event:GridEvent):void
        {
            if (event.item != null)
            {
                var g:Graphics = event.item.graphics;
                g.beginFill(0x000000);
                g.lineStyle(2, 0x22ff22);
                g.drawRect(-30*0.5, -30*0.5, 30, 30);
                g.endFill();
            }
        }
    }
}

package  
{
    import flash.display.MovieClip;
    import flash.events.MouseEvent;

    public class Grid extends Sprite 
    {
        public function Grid() 
        {
            var test = new Sprite();
            test.x = 0;
            test.y = 0;
            test.graphics.beginFill(0x66ff66); 
            test.graphics.drawRect(-tileWidth*0.5, -tileHeight*0.5, tileWidth, tileHeight);
            test.graphics.endFill();
            test.addEventListener(MouseEvent.MOUSE_OVER, overTile);
            test.addEventListener(MouseEvent.MOUSE_DOWN, clickTile);
            addChild(test);

            test.mouseChildren = false;
        }

        private function overTile (event:MouseEvent):void 
        {
            if (event.cancelable)
            {
                // stop MouseEvent from bubbling
                event.stopImmediatePropagation();
            }
            dispatchEvent( new GridEvent( GridEvent.HOVER, event.target) );
        }

        private function clickTile(event:MouseEvent):void 
        {
            if (event.cancelable)
            {
                // stop MouseEvent from bubbling
                event.stopImmediatePropagation();
            }
            dispatchEvent( new GridEvent( GridEvent.TILECLICK, event.target) );
        }
    }
}

package  
{
    import flash.events.Event;
    public class GridEvent extends Event
    {
        public static const HOVER :String = "hover";
        public static const TILECLICK :String = "click";
        public var item:Sprite;

        public function GridEvent (type:String, item:Sprite)
        {
                this.item = item;
                super(type);
        }

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...