AS3 ||Использование одной и той же функции с разными переменными - PullRequest
0 голосов
/ 25 апреля 2018

Я очень новичок в AS3, и я пытаюсь учиться, экспериментируя во флэш-памяти, делая простую 2D-игру с очень простым кодом.

Я сделал одно поле из 6, которое работает, и это видеоклип с различными рамками для каждого выращивания фруктов. Например, кадр 1-5 - это выращивание клубники, где кадр 5 - когда он готов к сбору, а затем 6-10 - из моркови и т. Д.

Есть ли способ сделать так, чтобы мне не нужно было писать точно такой же код для следующего поля обрезки, и вместо этого измените переменные в этом коде в зависимости от того, на каком поле обрезки вы щелкнете?

Вот пример кода

if (field1.currentFrame == 1)
        {
            field1.nextFrame();
            infoText.text = "You've watered the crop. Let's wait and see how it turns out!";
            function plantStrawberry():void
            {
                field1.nextFrame();
                if (field1.currentFrame == 5)
                {
                    clearInterval(strawberryInterval);
                }
            }
            var strawberryInterval = setInterval(plantStrawberry,5000);
        }

Пожалуйста, нет Judgerino, как я уже сказал, я очень плохо знаком с AS3, смеется.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Хотя руководство BFAT абсолютно правильно, это не единственный способ сделать что-то, более того, если вы когда-нибудь перейдете от Flash и AS3 к чему-то другому, или дажепопробуйте Starling (фреймворк, позволяющий создавать быстрые и не запаздывающие мобильные приложения во Flash / AS3), и вы обнаружите, что эта концепция неприменима.Это очень Flash-y, и я аплодирую ему.

Вместо того, чтобы делать каждое поле подклассом абстрактным (значит, оно никогда не создается само по себе) Crop класс, вы можете сделать Crop class принимает 1 из этих 6 полей в качестве аргумента при создании (или позже).По сути, вы говорите: «Я хочу сделать поле на полях с графикой пшеницы».Итак, позвольте мне немного переделать этот класс.

package
{
    // Imports.
    import flash.display.Sprite;
    import flash.display.MovieClip;

    import flash.utils.Timer;

    import flash.events.Event;
    import flash.events.TimerEvent;

    public class Crop extends Sprite
    {
        // I agree with the use of Timer.
        private var timer:Timer;

        // Visuals go here.
        private var field:MovieClip;

        // Class constructor.
        public function Crop(FieldClass:Class)
        {
            // With "new" keyword you can omit ()
            // if there are no mandatory arguments.
            field = new FieldClass;
            field.stop();

            addChild(field);
        }

        // A function that starts the timer ticking.
        public function startGrowing():void
        {
            timer = new Timer(5000, 4);
            timer.addEventListener(TimerEvent.TIMER, grow);
            timer.start();
        }

        // This function is called every timer tick.
        private function grow(e:Event):void
        {
            // Command the graphics to go to the next frame.
            field.nextFrame();
        }
    }
}

Затем, использование.Когда вы создаете поля, вам нужно установить для них классы AS3, чтобы иметь доступ, оставив базовый класс как есть, Flash автоматически установит для него неспецифический MovieClip .Меньше, у вас есть посевов. Пшеница полевых и посевов. Ячмень полевых.

import Crop;
import crops.Wheat;
import crops.Barley;

var W:Crop = new Crop(Wheat);
var B:Crop = new Crop(Barley);

addChild(W);
addChild(B);
B.x = 100;

W.startGrowing();
B.startGrowing();
0 голосов
/ 25 апреля 2018

В этом сценарии есть несколько способов сделать СУХОЙ (не повторяйте себя) с вашим кодом. Лучший способ - научиться пользоваться классами. Классы - это чертежи, предназначенные именно для этих сценариев.

Вот пример простого класса, который делает то, что вы хотите. В Flash / Animate перейдите к file , затем new , затем ' ActionScript 3.0 Class ' - присвойте ему имя Crop.

В появившемся документе должен быть какой-то базовый шаблонный код. Все должно быть в упаковке. Пакет сообщает flash, где найти этот класс - поэтому в этом примере оставьте его как есть (просто package {) и сохраните этот файл в той же папке, что и ваш .fla. Все функции должны быть заключены в объявление класса, оно должно быть сгенерировано для вас на основе введенного вами имени (Crop). Далее вы увидите одну функцию, имя которой совпадает с именем класса. Это называется конструктором, и эта функция запускается всякий раз, когда вы создаете новый экземпляр этого класса. Так как классы являются чертежами, вы создаете их экземпляры, которые являются объектами - эти объекты затем получают весь код, который вы помещаете в этот класс.

Итак, для начала, вы должны иметь это:

package  {
    public class Crop {
        public function Crop() {
            // constructor code
        }
    }
}

Давайте продолжим и введем ваш код. Подробности см. В комментариях к коду:

package  {
    //imports should go here
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.events.TimerEvent;
    import flash.utils.Timer;

    //lets make this class extend MovieClip - that means it will be a MovieClip in addition to everything else you add below
    public class Crop extends MovieClip {

        //instead of setInterval, use a timer - it's easier to manage and cleanup
        //in class files, variables and functions have access modifiers, that's what the public and private words are about
        //private means only this class can ever use the var/function
        private var timer:Timer;

        public function Crop() {
            //initialize the timer - have it tick every 5 seconds, and repeat 4 times (to move you from frame 1 - 5)
            timer = new Timer(5000, 4);
            //listen for the TIMER event (which is the tick) and call the function 'grow' when the timer ticks
            timer.addEventListener(TimerEvent.TIMER, grow);
        }

        //a function that starts the timer ticking
        public function startGrowing():void {
            timer.start();
        }

        //this function is called every timer tick.
        private function grow(e:Event):void {
            this.nextFrame(); //go to the next frame of your crop
        }
    }
}

Сохраните файл. Теперь, когда у вас есть этот класс, вам нужно присоединить его к вашим ресурсам библиотеки, чтобы они все получили эту функциональность.

На панели библиотеки для каждого объекта обрезки щелкните правой кнопкой мыши (или нажмите Ctrl + щелчок на Mac) и перейдите к properties. В свойствах нажмите advanced и присвойте ему уникальное имя класса (например, Strawberry). Затем в поле базового класса введите Crop (класс, который мы только что создали). Повторите для остальных.

enter image description here

Теперь на вашей временной шкале, когда вы хотите, чтобы урожай начал расти, вы можете сделать:

field1.startGrowing();  //assuming your instance `field1` is one of the crops that you assigned the base class `Crop` to

Надеюсь, это дает точку входа во власть классов. Вы можете добавить больше функциональности в этот, и он автоматически применяется ко всем культурам, к которым вы его прикрепили.

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