#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:
- В AS вы можете добавлять пользовательские свойства к MovieClips, поэтому вам не нужно создавать пользовательский класс.
- Вы переопределяете тот же экземпляр drop в цикле for, что может оказаться бесполезным.
Удалите это:
private var Drop: Class;
Удалите это:
public var drop:MovieClip;
В вашем цикле for используйте это:
var drop = new MovieClip();
Если вам нужны фрагменты, создайте массив и поместите в него фрагменты.
Я надеюсь, это то, что ты ищешь, удачи, Роб
Комментарии:
1. Класс Drop — это его растровая графика, которую он по ошибке переносит в MovieClip.