Как я могу использовать Action Script 3.0, чтобы случайно расположенные символы пролетали мимо? - PullRequest
1 голос
/ 17 марта 2010

Я пытаюсь сделать простую анимацию с помощью Flash CS4 и Action Script 3.0, чтобы множество символов постоянно пролетали справа налево. Я хочу, чтобы, как только символ достиг конца экрана, он был уничтожен, а другой был помещен в начальную позицию.

Я намереваюсь дать каждому символу случайную скорость и создавать случайный символ каждый раз, когда один «уничтожается». Любые подсказки, где я могу начать?

Ответы [ 4 ]

2 голосов
/ 17 марта 2010

Поскольку вы, кажется, плохо знакомы с флеш-платформой, я думаю, что написание классов не должно быть вашим первым портом вызова при изучении ActionScript. Определенно, просто поиграйте на графике и изучите основы. Как очень простое решение этой проблемы, я бы предложил создать MovieClip в библиотеке с именем класса, например «MyBall» ... и вставить его в первый кадр основной временной шкалы и вуаля.

    // Create some variables to store data
var numberOfBalls : int = 20;
var myBalls : Array = [];
var xVelocities : Array = [];

var maxXVelocitySpeed : Number = 5;
var minXVelocitySpeed : Number = 2;

// Add your orginal balls to the stage
for (var i : int = 0; i < numberOfBalls; i++)
{
    var myBall : MyBall = new MyBall();
    myBall.x = -(Math.random() * stage.stageWidth);
    myBall.y = Math.random() * stage.stageHeight;

    var xVelocity : Number = minXVelocitySpeed + (Math.random() * (maxXVelocitySpeed - minXVelocitySpeed));

    myBalls.push(myBall);
    xVelocities.push(xVelocity);

    addChild(myBall);
}

// Add a listener for enter frame events
addEventListener(Event.ENTER_FRAME, enterFrameHandler);


//Run this code on every frame to move the balls and reposition them if they are off the stage
function enterFrameHandler(event : Event) : void
{
    for each( var myBall : MyBall in myBalls)
    {
        var ballIndex : int = myBalls.indexOf(myBall);

        myBall.x += xVelocity[ballIndex];

        if (myBall.x > stage.stageWidth)
        {
            myBall.x = -(Math.random() * stage.stageWidth);
            myBall.y = Math.random() * stage.stageHeight;
        }
    }
}
1 голос
/ 17 марта 2010

Сначала превратите свои символы в мувиклипы. Затем создайте базовый класс MySymbol.as для ваших символов, например:

package {
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.geom.Point;


    public class MySymbol extends MovieClip
    {
        public var speed:Number;        // Pixels moved per frame


        public function MySymbol(speed:Number, startPosition:Point)
        {
            this.speed = speed;
            this.addEventListener(Event.ENTER_FRAME, update);

            this.x = startPosition.x;
            this.y = startPosition.y;
        }


        private function update():void
        {
            this.x -= this.speed;
            if (this.x < 0 - this.width) {      // We're at the left edge
                this.removeEventListener(Event.ENTER_FRAME, update);
                this.dispatchEvent(new Event(Event.COMPLETE));
            }
        }
    }
}

Затем убедитесь, что ваши видеоклипы экспортированы для AS3 (опция «Связывание» для элемента в библиотеке). Сделайте имя класса для каждого элемента уникальным (например, MySymbol1, MySymbol2) и установите для базового класса значение MySymbol.

Ваш класс документа может выглядеть примерно так:

package {
    import flash.display.MovieClip;
    import flash.events.Event;
    import MySymbol;                // Not strictly needed

    public class DocumentClass extends flash.display.MovieClip
    {
        private static var SYMBOLS:Array = new Array(MySymbol1, MySymbol2);

        public function DocumentClass()
        {
            // Create five symbols:
            for (var i:int = 0; i < 5; i++) {
                makeSymbol();
            }
        }


        private function makeSymbol():void
        {
            // Pick a random symbol from the array:
            var symType:Class = SYMBOLS[Math.random() * SYMBOLS.length];

            // Construct the new symbol:
            var loc:Point = new Point(stage.stageWidth, Math.random() * stage.stageHeight);
            var sym:MySymbol = new symType(1 + Math.random() * 30, loc);

            // Listen for the object hitting the left edge:
            sym.addEventListener(Event.COMPLETE, remakeObject);
            this.addChild(sym);
        }


        private function remakeObject(e:Event):void
        {
            e.target.removeEventListener(Event.COMPLETE, remakeObject);
            this.removeChild(e.target);

            // Replace the dead symbol:
            makeSymbol();
        }
    }
}

Гораздо эффективнее, если вместо уничтожения и воссоздания объекта, летящего за сценой, вы повторно используете существующий и перемещаете его вправо. Но эту оптимизацию вы можете реализовать позже, если все станет медленно.

Обратите внимание, что весь приведенный выше код является НЕПРОВЕРЕННЫМ, и я давно не кодировал AS3, так что, вероятно, в нем есть по крайней мере несколько ошибок. Надеюсь, это послужит хорошей отправной точкой.

0 голосов
/ 17 марта 2010
  • Определите класс Circle (символ), который расширяет Sprite / Shape и имеет переменную velocity
  • Нарисуйте круг (или любой другой) со случайным цветом
    Math.floor(Math.random() * 0xffffff)
  • Назначить случайное значение скорости
    minVelocity + Math.floor(Math.random() * velocityRange)
  • Создание метода start() внутри класса Circle, который регистрирует обработчик ввода кадра
  • Увеличьте this.y внутри обработчика кадра ввода и отправьте событие 'recycleMe', если y больше максимального значения.
  • Создайте N экземпляров Circle, addChild из них и вызовите их start() методы.
  • прослушивание 'recycleMe' событий для каждого из них и сброс значения y из обработчика.
0 голосов
/ 17 марта 2010

Вот несколько подсказок, с которых можно начать.

MovieClips имеют свойства x и y. Если бы вы со временем добавили к этим числам, вы бы увидели движение MovieClip вдоль оси x и / или оси stage. Сделайте это, используя Event.ENTER_FRAME, который позволит вам изменять значения каждый раз, когда экран будет обновляться.

Ваш stage будет иметь заданную ширину (свойство stageWidth). Вы, вероятно, хотите отслеживать, когда свойство MovieClip x больше ширины вашей сцены. Если он удален (removeChild), добавьте новый (addChild) и верните его в начальную x/y позицию.

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