Как обновить детей в ActionScript? - PullRequest
0 голосов
/ 15 августа 2010

Для начала позвольте мне сказать, что я новичок в сценарии действий, а также что я не использую Adobe Creative Suite, я использую блокнот с Flex в качестве компилятора. У меня есть два класса, основной класс и класс с именем OBJECT_square.

Вот ГЛАВНЫЙ класс:

package 
{

        import flash.display.*;     import mx.core.*;       
        import flash.events.*;      import mx.collections.*;
        import flash.geom.*;        import mx.controls.*;
        import flash.text.*;        import mx.events.*;
                                    import mx.styles.*;
                                    import mx.containers.*;

        public class MAIN extends Sprite
        {
            public var APPLICATION:Application = Application(Application.application);
            public var keyDownText:TextField = new TextField();
            public function MAIN()
            {
                stage.addEventListener(KeyboardEvent.KEY_DOWN,KEY_DOWN);
                addEventListener(Event.ENTER_FRAME,STEP);
                this.addChild(new OBJECT_square().CREATE(10,100,1));
                this.addChild(new OBJECT_square().CREATE(10,200,1));
            }
            public function STEP():void {}
            public function DRAW():void {}
            public function KEY_DOWN(event:KeyboardEvent):void 
            {
                keyDownText.text = "Key code: " + event.keyCode;
                this.addChild(keyDownText);
            }
        }
    }

Вот класс OBJECT_square:

package
{
    import flash.display.*;
    import flash.events.*;

    public class OBJECT_square extends Sprite
    {
        public var X:int = 0;
        public var Y:int = 0;
        public var DEPTH:int = 0;
        public var SPRITE:Sprite = new Sprite();
        public function CREATE(X:int,Y:int,DEPTH:int):Sprite
        {
            addEventListener(KeyboardEvent.KEY_DOWN,KEY_DOWN);
            this.DEPTH = DEPTH;
            this.X = X;
            this.Y = Y;
            DRAW();
            return SPRITE;
        }
        public function KEY_DOWN(event:KeyboardEvent):void 
        {
            if (event.keyCode == 39) {X += 1; DRAW();}
        }
        public function DRAW():void
        {
            SPRITE.graphics.beginFill(0xFF0000,1);
            SPRITE.graphics.drawRect(X - 10,Y - 10,20,20);
            SPRITE.graphics.endFill();
        }
    }
}

Теперь моя проблема заключается в следующем. Проще говоря, я хотел бы, чтобы квадрат, который рисует OBJECT_square, двигался вправо, когда я нажимаю клавишу со стрелкой вправо. Прямо сейчас я могу нарисовать его только один раз (хотя на самом деле я создаю два отдельных квадрата в двух разных местах). Теперь мне нужно знать, правильно ли я использовал событие клавиатуры в OBJECT_square. Я также использовал событие клавиатуры в основном классе, чтобы отобразить последнюю нажатую клавишу, но я не уверен, как использовать ее в другом классе, кроме основного. Также я не уверен, как «обновить» квадрат так, чтобы он перерисовывался при перемещении, то есть удалял его старое «я» из списка отображения и заново вставлял его новое «я». Весь смысл кода заключается в том, что квадрат должен быть «самодостаточным», то есть содержать весь код, необходимый для его рисования и перемещения, а не полагаться на какой-либо другой класс. Я в основном хочу, чтобы, когда другой класс сделал квадрат, квадрат мог делать все остальное самостоятельно.

1 Ответ

0 голосов
/ 16 августа 2010

Вам не нужно продолжать перерисовывать квадрат вручную.Спрайты имеют свойства x и y, которые вы можете изменить, и они будут автоматически перемещены.Также нет причин создавать спрайт внутри класса, который уже расширяет спрайт.Есть несколько других странных вещей, которые вы делаете, поэтому исправленная версия вашего класса будет выглядеть примерно так:

package
{
    import flash.display.*;
    import flash.events.*;

    public class ObjectSquare extends Sprite
    {

        public function ObjectSquare (x:int,y:int):void
        {
            graphics.beginFill(0xFF0000,1);
            graphics.drawRect(x,y,30,30);
            graphics.endFill();
            addEventListener(KeyboardEvent.KEY_DOWN,KEY_DOWN);

        }
        public function KEY_DOWN(event:KeyboardEvent):void 
        {
            if (event.keyCode == 39) 
            {
                x += 1;
            }
        }

    }
}



package 
{

        import flash.display.*;     import mx.core.*;       
        import flash.events.*;      import mx.collections.*;
        import flash.geom.*;        import mx.controls.*;
        import flash.text.*;        import mx.events.*;
                                    import mx.styles.*;
                                    import mx.containers.*;
       //rename your class to Main. Should not be all caps
        public class Main extends Sprite 
        {
            public var APPLICATION:Application = Application(Application.application);
            public var keyDownText:TextField = new TextField();
            public function Main()
            {
                stage.addEventListener(KeyboardEvent.KEY_DOWN,onKeyPress);
                addChild(new ObjectSquare(10,100));
                addChild(new ObjectSquare(10,200));
            }

            public function onKeyPress(event:KeyboardEvent):void 
            {
                keyDownText.text = "Key code: " + event.keyCode;
                this.addChild(keyDownText);
            }
        }
    }

Возможно, вам лучше создать класс для обработки всех ваших вводов с клавиатуры, а затемизменить соответствующие объекты.

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