如何更新动作中的孩子?

时间:2010-08-15 14:42:20

标签: actionscript-3

对于初学者,我只想说我对动作脚本非常新,而且我没有使用adobe创意套件,我使用flex作为编译器的记事本。我有两个类,一个主类和一个名为OBJECT_square的类。

这是MAIN课程:

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 :(得分:0)

您无需手动重绘正方形。精灵具有x和y属性,您可以更改这些属性并自动移动。也没有理由在已经扩展sprite的类中创建一个sprite。你还有其他一些奇怪的事情,所以你的课程的固定版本看起来像:

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

您可能最好创建一个类来处理所有键盘输入,然后更改相关对象。