Как правильно создавать видеоролики во FlashDevelop

#flash #actionscript-3 #null #movieclip #flashdevelop

#flash #actionscript-3 #null #видеоролик #flashdevelop

Вопрос:

Я пытаюсь понять, почему, когда я создаю movieclip во flashdevelop, указанный movieclip всегда заканчивается нулевым значением.

Вот код, который я пытаюсь использовать:

 import flash.display.MovieClip;
    import flash.events.Event;
    import flash.display.Sprite;
    import flash.display.Bitmap;

    public class Rain extends MovieClip
    {
        [Embed(source = '../../../../../lib/images/icons/drop.png')]
        private var Drop: Class;

        private var offset:int = 50;
        private var dropsNumber:int;
        private var dropsVector:Vector.<MovieClip> = new Vector.<MovieClip>();

        public var drop:MovieClip;

        public function init(drops:int, fallSpeed:int, windSpeed:int, hArea:int, vArea:int, dir:String):void
        {
            dropsNumber = drops;

            if (dir == "right")
            {
                offset *= -1;
            }

            for (var i:int = 0; i < drops; i  )
            {
                drop = new Drop() as MovieClip;

                drop.fallSpeed = fallSpeed;
                drop.windSpeed = windSpeed;
                drop.dir = dir;
                drop.hArea = hArea;
                drop.vArea = vArea;

                drop.x = Math.random() * (hArea   offset);
                drop.y=Math.random()*vArea;

                //

                drop.scaleX = Math.round(((Math.random() * 1)   0.3) * 10) / 10;
                drop.scaleY=drop.scaleX;

                //

                dropsVector.push(drop);

                addChild(drop);
            }

            inTheDirection();
        }

        private function inTheDirection():void
        {
            for (var i:int = 0; i < dropsNumber; i  )
            {
                switch (dropsVector[i].dir)
                {
                    case "left" :

                        dropsVector[i].addEventListener(Event.ENTER_FRAME, moveLeft);

                        break;

                    case "right" :

                        dropsVector[i].scaleX*=-1;
                        dropsVector[i].addEventListener(Event.ENTER_FRAME, moveRight);

                        break;

                    default :

                        trace("There is some error dude...");
                }
            }
        }

        private function moveLeft(e:Event):void
        {
            e.target.x-=e.target.windSpeed;
            e.target.y =Math.random()*e.target.fallSpeed;

            if (e.target.y>e.target.vArea e.target.height)
            {
                e.target.x = Math.random() * (e.target.hArea   (offset * 2));
                e.target.y=- e.target.height;
            }
        }

        private function moveRight(e:Event):void
        {
            e.target.x =e.target.windSpeed;
            e.target.y =Math.random()*e.target.fallSpeed;

            if (e.target.y>e.target.vArea e.target.height)
            {
                e.target.x = Math.random() * (e.target.hArea - offset * 2)   offset * 2;//Check
                e.target.y=- e.target.height;
            }
        }
    }
  

Он предназначен для рисования капель дождя на экране для создания эффекта дождя, но я получаю эту ошибку:

 **[Fault] exception, information=TypeError: Error #1009: Cannot access a property or method of a null object reference.
Fault, Rain.as:32**
  

Я кое-что осмотрел, но безрезультатно. Поэтому мы высоко ценим любую помощь!

Спасибо!

Комментарии:

1. new Drop () выдает вам растровое изображение, а не видеоролик, поэтому приведение завершается неудачей, и вы получаете ‘null’.

Ответ №1:

Проблема в том, что ваш класс Drop — это Bitmap. У него не может быть свойств, добавляемых динамически.

Простое решение — создать пустые видеоклипы и добавить к ним свой drop. Лучшее решение — написать пользовательский класс для вашего Drop, который обладает необходимыми вам свойствами. Но поскольку вы просили только простое исправление, попробуйте это:

 drop = new MovieClip();
drop.addChild(new Drop());
  

Это должно заменить:

 drop = new Drop() as MovieClip; // replace this line
  

Лучшее решение — создать класс, который расширяет Bitmap с нужными вам свойствами, вот так:

 package 
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;

    /**
     * ...
     * @author ...
     */

     [Embed(source = '../../../../../lib/images/icons/drop.png')]
      private var DropArt: Class;
      public var fallSpeed;
      public var windSpeed;
      public var dir;
      public var hArea;
      public var vArea;

    public class  Drop extends Bitmap
    {   
        var art:Bitmap  = new DropArt();
        this.bitmapData = art.bitmapData;
    }

}
  

Ответ №2:

  1. В AS вы можете добавлять пользовательские свойства к MovieClips, поэтому вам не нужно создавать пользовательский класс.
  2. Вы переопределяете тот же экземпляр drop в цикле for, что может оказаться бесполезным.

Удалите это:

 private var Drop: Class;
  

Удалите это:

 public var drop:MovieClip;
  

В вашем цикле for используйте это:

 var drop = new MovieClip();
  

Если вам нужны фрагменты, создайте массив и поместите в него фрагменты.

Я надеюсь, это то, что ты ищешь, удачи, Роб

Комментарии:

1. Класс Drop — это его растровая графика, которую он по ошибке переносит в MovieClip.