Проблемы с созданием нескольких объектов (массивов) во Flash

Я делаю основную игру типа Galaga во Flash и столкнулся с проблемами. Это мой первый раз, когда я действительно возился с ActionScript.
Я создал массив для своих врагов и хотел бы знать, как бы я сделал так, чтобы они появлялись в соответствующих местах, например, в Галаге, и чтобы они двигались равномерно по форме слева направо, спускаясь, когда они достигли края сцены.

Игра

package
{
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.utils.Timer;
    import flash.events.TimerEvent;
    import flash.events.KeyboardEvent;
    import flash.ui.Keyboard;
    public class SpaceVigilanteGame extends MovieClip

    {
        public var army:Array;
        public var avatar:Avatar;
        public var gameTimer:Timer;
        public var useMouseControl:Boolean; 
        public var rightKeyIsBeingPressed:Boolean;
        public var leftKeyIsBeingPressed:Boolean; 
        var gameWidth:int = 0;
        var gameHeight:int = 0;

        public function SpaceVigilanteGame()
        {   useMouseControl = false;
            leftKeyIsBeingPressed = false;
            rightKeyIsBeingPressed = false;
            army = new Array();
            var newEnemy = new Enemy( 60, 30 );
            army.push( newEnemy );
            addChild( newEnemy );
            avatar = new Avatar();
            addChild( avatar );

            if ( useMouseControl )
            {
                avatar.x = mouseX;
                avatar.y = mouseY;
            }
            else
            {
                avatar.x = 50;
                avatar.y = 400;
            }

            gameWidth = stage.stageWidth;
            gameHeight = stage.stageHeight;


            gameTimer = new Timer( 25 );
            gameTimer.addEventListener( TimerEvent.TIMER, moveEnemy );
            gameTimer.addEventListener( TimerEvent.TIMER, moveAvatar );
            gameTimer.start();
            stage.addEventListener( KeyboardEvent.KEY_DOWN, onKeyPress );
            stage.addEventListener( KeyboardEvent.KEY_UP, onKeyRelease );

        function onKeyPress( keyboardEvent:KeyboardEvent ):void
        {
            if ( keyboardEvent.keyCode == Keyboard.RIGHT )
            {
                rightKeyIsBeingPressed = true;
            }
            else if ( keyboardEvent.keyCode == Keyboard.LEFT ) 
            {
                leftKeyIsBeingPressed = true;
            }
        }
        function onKeyRelease( keyboardEvent:KeyboardEvent ):void
        {
            if ( keyboardEvent.keyCode == Keyboard.RIGHT )
            {
                rightKeyIsBeingPressed = false;
            }
            else if (keyboardEvent.keyCode ==Keyboard.LEFT )
            {
                leftKeyIsBeingPressed = false;
            }
        }
        }
        public function moveEnemy( timerEvent:TimerEvent ):void 
        {
            for each ( var enemy:Enemy in army ) 
            {

            }
            //enemy.moveDownABit();
            if(enemy.x+enemy.width+2<=gameWidth)
                {
                    enemy.moveRight();
                }
            else if(enemy.y+enemy.height+2<=gameHeight)
                {
                    enemy.moveDown();
                }
            else if(enemy.x-2>=0)
                {
                    enemy.moveLeft();
                }
            else if(enemy.y-2>=0)
                {
                    enemy.moveUp();
                }

        }
        public function moveAvatar( timerEvent:TimerEvent ):void
        {
            if ( useMouseControl )
            {
                avatar.x = mouseX;
                avatar.y = mouseY;
            }
            else if ( rightKeyIsBeingPressed )
                {
                    avatar.moveRight();
                }
            else if ( leftKeyIsBeingPressed )
                {
                    avatar.moveLeft();
                }
        }



    }
}

Вражеский класс

package 
{
    import flash.display.MovieClip;
    public class Enemy extends MovieClip 
    {
        public function Enemy( startX:Number, startY:Number ) 
        {
            x = startX;
            y = startY;
        }


        public function moveRight():void
        {
            x = x + 2;
        }

        public function moveDown():void
        {
            y = y + 2;
        }

        public function moveLeft():void
        {
            x = x - 2;
        }

        public function moveUp():void
        {
            y = y - 2;
        }
    }
}

1 ответ

Решение

Я хотел бы предложить, чтобы во время создания противника (из которых, кажется, есть только один), вы должны устанавливать местоположения, соответствующие друг другу.

В качестве примера:

Ваш код в настоящее время делает это:

var newEnemy = new Enemy( 60, 30 );
army.push( newEnemy );
addChild( newEnemy );

Возможно, это должно сделать что-то вроде этого:

for(var x:int = 0; x< ARMY_WIDTH; x++)
{
    for(var y:int = 0; y < ARMY_HEIGHT; y++)
    {
        army.push(new Enemy(60 + x * X_GAP, 30 + y *Y_GAP));
        this.addChild(army[army.length-1]);
    }
}

Теперь я сделал много предположений в приведенном выше коде; Я изобрел константы, которые у вас могут не быть, и я только решил вашу непосредственную проблему. В идеале вам нужно искать более продвинутые решения для вашей проблемы, что-то вроде фабричного класса, который создает для вас ваших врагов или перерабатывает их из пула врагов.

Тем не менее, вы только начинаете, и вы многое со временем поймете. Удачи в вашем проекте, и я надеюсь, что вы продолжите развивать свои навыки:)

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