Просмотр полной версии : Проблема с добавлением в список отображения массива объектов
PainKiller
07.09.2011, 00:25
Извиняюсь, что спрашиваю, наверное, глупый вопрос, но экшн скрипт я начал изучать недавно и он поставил меня в тупик.
Имеется мувик на одном из кадров главной таймлайн (GamePlay), в котором создается массив объектов дочерних от класса Star (в классе прописано движение звезд). Подклассы этого класса прикреплены к разным мувикам с изображением звезд разной формы и цвета.
В общем вот код:
package main
{
import flash.display.*;
import stars.*;
public class GamePlay extends MovieClip
{
public function GamePlay()
{
stage.focus = this;
this.focusRect = false;
addStars ();
}
public function addStars ():void
{
var arrayOfStar15Big: Array = new Array ();
for (var i:int = 0; i < 5; i++)
{
arrayOfStar15Big.push(new Star15Big ());
arrayOfStar15Big[i].x = Math.floor(Math.random() * 900);
arrayOfStar15Big[i].y = Math.floor(Math.random() * 660);
addChild(arrayOfStar15Big [i]);
}
var arrayOfStar6Red: Array = new Array ();
for (var j:int = 0; j < 7; j++)
{
arrayOfStar6Red.push(new Star6Red ());
arrayOfStar6Red[i].x = Math.floor(Math.random() * 900);
arrayOfStar6Red[i].y = Math.floor(Math.random() * 660);
addChild(arrayOfStar6Red [i]);
}
}
}
}
Проблема в том, что звезды на сцене не появляются, и в отладчике видно что массивы равны undefined а root, stage и parent класса Star и дочерних классов равны null. Если же добавляешь звезды на мувик визуально вручную и даешь им названия - все отлично работает.
И еще - такой же код у меня прекрасно работал в другом fla файле, а тут возникли проблемы. Можно ли это как то исправить, а то расставлять звезды вручную по ряду причин не вариант.
По моему ошибка в циклах
попробуй так
var arrayOfStar15Big: Array = new Array ();
for (var i:int = 0; i < 5; i++)
{
var star15Big:Star15Big=new Star15Big ();
star15Big.x = Math.floor(Math.random() * 900);
star15Big.y = Math.floor(Math.random() * 660);
addChild(star15Big);
arrayOfStar15Big.push(star15Big)
}
var arrayOfStar6Red: Array = new Array ();
for (var j:int = 0; j < 7; j++)
{
var star6Red:Star6Red=new Star6Red ();
star6Red.x = Math.floor(Math.random() * 900);
star6Red.y = Math.floor(Math.random() * 660);
addChild(star6Red);
arrayOfStar6Red.push(new Star6Red ());
}
пришлось моделировать у себя текущую ситуацию....
оказалось банальная ошибка, вы во втором цикле перепутали операторы j != i
рабочий код:
package main
{
import flash.display.*;
import stars.*;
public class GamePlay extends MovieClip
{
public function GamePlay()
{
stage.focus = this;
this.focusRect = false;
addStars ();
}
public function addStars ():void
{
var arrayOfStar15Big: Array = new Array ();
for (var i:int = 0; i < 5; i++)
{
arrayOfStar15Big.push(new Star15Big());
arrayOfStar15Big[i].x = Math.floor(Math.random() * 900);
arrayOfStar15Big[i].y = Math.floor(Math.random() * 660);
addChild(arrayOfStar15Big[i]);
}
var arrayOfStar6Red: Array = new Array ();
for (var j:int = 0; j < 7; j++)
{
arrayOfStar6Red.push(new Star6Red());
arrayOfStar6Red[j].x = Math.floor(Math.random() * 900);
arrayOfStar6Red[j].y = Math.floor(Math.random() * 660);
addChild(arrayOfStar6Red[j]);
}
}
}
}
PainKiller
07.09.2011, 04:43
veisss большое спасибо за помощь, но код у вас не правильный, и без массива объектов тут никак не обойдешся
Добавлено через 4 минуты
Newred тоже большое спасибо за помощь, но дело не в этом. Код по идее работал хотя бы с первым массивом
veisss большое спасибо за помощь, но код у вас не правильный, и без массива объектов тут никак не обойдешся
Что в нем неправильного? Даже приводить не надо
PainKiller
07.09.2011, 20:39
Newred скопировал ваши исходники к себе в проект, тем более что пакеты и все названия совпадают. Результат такой же как и в первом посте, собственно я уже говорил что этот код работает в другом fla-файле. Тут наверное проблема в чем то другом, буду думать, спасибо в любом случае.
Добавлено через 34 минуты
Кажется стал догадоваться в чем проблема, проблема все таки в коде класа Star, осталось придумать как это исправить.
вот код класса:
package stars
{
import flash.display.*;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
public class Star extends MovieClip
{
public static var correctionVelosity = 1; // придумать как синхронизировать движение и сделать разные скорости
public var velosity:Number;
public function Star()
{
velosity = 1;
this.stage.addEventListener (KeyboardEvent.KEY_DOWN, moveStar); //проблема где то здесь.
addEventListener (Event.ENTER_FRAME, move);
}
public function move (e:Event):void
{
this.x -= velosity; // возможно отсюда надо вычитать константу и затем проверять что бы она не была < 0
if (this.x < 0)
{
this.x = parent.width + 10;
}
}
public function moveStar (e:KeyboardEvent):void
{
if (e.keyCode == Keyboard.SPACE)
{
acceleration ();
}
if (e.keyCode == Keyboard.SHIFT)
{
deceleration ();
}
}
public function acceleration ():void
{
velosity++;
if (velosity > 30)
{
velosity = 30;
}
}
public function deceleration ():void
{
velosity--;
if (velosity < 1)
{
velosity = 1;
}
}
}
}
по моему проблема в строчке this.stage.addEventListener (KeyboardEvent.KEY_DOWN, moveStar); я уже сталкивался с тем, что объекты на которые не наведен фокус выдают при использовании слушателя клавиатуры ошибку null, но здесь фокус наводится на весь мувик GamePlay.
Добавлено через 38 минут
То есть код слушателя клавиатуры срабатывает раньше чем объект добавляется на сцену, так помоему, и по этому он дает null в ран-тайме
Добавлено через 38 минут
Вопрос как это исправить
PainKiller
07.09.2011, 23:39
Сделал вот так:
package stars
{
import flash.display.*;
import flash.events.*;
import flash.ui.Keyboard;
public class Star extends MovieClip
{
public static var correctionVelosity = 1; // придумать как синхронизировать движение и сделать разные скорости
public var velosity:Number;
public function Star()
{
velosity = 1;
addEventListener (Event.ADDED_TO_STAGE, addListener);
addEventListener (Event.ENTER_FRAME, move);
}
public function addListener (e:Event):void
{
if (this.stage != null)
{
stage.addEventListener (KeyboardEvent.KEY_DOWN, moveStar);
}
}
public function move (e:Event):void
{
this.x -= velosity; // возможно отсюда надо вычитать константу и затем проверять что бы она не была < 0
if (this.x < 0)
{
this.x = parent.width + 10;
}
}
public function moveStar (e:KeyboardEvent):void
{
if (e.keyCode == Keyboard.SPACE)
{
acceleration ();
}
if (e.keyCode == Keyboard.SHIFT)
{
deceleration ();
}
}
public function acceleration ():void
{
velosity++;
if (velosity > 30)
{
velosity = 30;
}
}
public function deceleration ():void
{
velosity--;
if (velosity < 1)
{
velosity = 1;
}
}
}
}
Результат - TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at stars::Star/move()
У меня у самого там опечатка во втором цикле
Так правильнее
var arrayOfStar6Red: Array = new Array ();
for (var j:int = 0; j < 7; j++)
{
var star6Red:Star6Red=new Star6Red ();
star6Red.x = Math.floor(Math.random() * 900);
star6Red.y = Math.floor(Math.random() * 660);
addChild(star6Red);
arrayOfStar6Red.push(star6Red);
}
Тут этот объект добавляется в массив
arrayOfStar6Red.push(star6Red);
А Error #1009: тебе выдает эта строчка
this.x = parent.width + 10;//parent тут null
Это
addEventListener (Event.ENTER_FRAME, move);
перенеси в
public function addListener (e:Event):void
И всегда когда пользуешься опасными переменными(parent,stage...)
лучше проверяй их
if(parent){
//делай с parent-ом что хочешь
}else{
//ой
}
PainKiller
08.09.2011, 01:18
Добавлено через 1 час 4 минуты
veisss спасибо большое, все заработало. Кстати у этого кода интересная особенность обнаружилась - часть звезд во время движения исчезают со сцены, но это не принципиально хотя и интересно в чем причина.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.