PDA

Просмотр полной версии : Error #2006 подскажыте в чем фишка...


Killer_13
29.11.2009, 20:49
Здравств.

Вот... должен быть ролик (танцующая девушка) которая вызывается функцией copyGirl()
а ззади нее фон должен меняться к примеру каждых 3 секунды вызывается функцией tim().
вот код

package
{
import flash.display.*;
import flash.events.*;
import flash.net.URLRequest;
import flash.utils.Timer;

public class girl extends Sprite
{
public function girl()
{
tim();
copyGirl();
}

public function tim(){
var timer:Timer = new Timer(3000, 0);
timer.addEventListener(TimerEvent.TIMER, bild);
timer.start();
}

var loader:Loader = new Loader();

public function bild(e:TimerEvent):void
{

var randBild:int = Math.random()*5;
var nam:String = "swirl-"+randBild+".jpg";
var urlR:URLRequest = new URLRequest(nam);
trace(nam);
loader.load(urlR);
stage.addChildAt(loader,1);
}

public function copyGirl()
{
var childs:Array = [];

for (var i:uint = 0; i<2; i++){
var st:mcgirl = new mcgirl;
stage.addChildAt(st,2);
childs.push(st);
}

var g0:mcgirl = childs[0];
var g1:mcgirl = childs[1];

g0.x = -110;
g0.y = 90;
g1.x = 120;
g1.y = 90;
}
}
}

если первой запускается функция tim() тогда ролик не грузиться только меняются картинки, но начинают появлятся через 3 секунды, понятно почему, нужно еще прописать с самого начало картинку чтоб подгружалась, а потом каждых 3 сек.
пишет
RangeError: Error #2006: Предоставленный индекс выходит за допустимые пределы.
at flash.display::DisplayObjectContainer/addChildAt()
at flash.display::Stage/addChildAt()
at girl/copyGirl()
at girl()

а если первой ставлю ф-цию copz Girl(), то вообще ничего не работает. :(

Подскажите как и в будущем избегать такой ошыбки?

Пасибо.

Felicast
29.11.2009, 21:08
ну судя по коду ошибка здесь:

stage.addChildAt(st,2);

два вопроса:
1 зачем вы добавляете на stage? - это плохо
2 вы добавляете st во второй уровень. вы уверены, что там добавлены объекты в 0-й и 1-й уровни?

veisss
29.11.2009, 21:16
скорей всего проблема тута

stage.addChildAt(loader,1);
stage.addChildAt(st,2);

помоему ты строго прописываешь индекс используй

container.addChildAt(child,0); //в начало
container.addChildAt(child,container.numChilden-1); //в конец

Killer_13
29.11.2009, 21:27
Felicast -
1. потому, что новичек, как правильней добавлять обьекты?
2. не уверен, проверю, попробую

veisss
попробую, отпишусь

пасибо.

SamFR
29.11.2009, 21:28
container.addChildAt(child,container.numChilden-1); //в конец
равносильно

container.addChild(child);
:)

Felicast
29.11.2009, 22:06
1. потому, что новичек, как правильней добавлять обьекты?
можно просто addChild/addChildAt
можно завести контейнер какой-нибудь. (как в приведенных примерах (container))

Killer_13
29.11.2009, 22:07
SamFR
container.addChildAt(child,container.numChilden-1); //в конец

а первый елемент как тогда?

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

Добавлено через 1 минуту
Felicast дык контейнер это свойство или нужно создавать к примеру
var container:---- = new ----()

Добавлено через 2 часа 36 минут
Вот.. переделал, кажется правильно, но остается та ж ошыбка... :(
Что я сделал неправильно?

package
{
import flash.display.*;
import flash.events.*;
import flash.net.URLRequest;
import flash.utils.Timer;

public class girl extends Sprite
{
public function girl()
{
tim();
copyGirl();
}

public function tim(){
var timer:Timer = new Timer(3000, 0);
timer.addEventListener(TimerEvent.TIMER, bild);
timer.start();
}

var container:Sprite = new Sprite();
var loader:Loader = new Loader();

public function bild(e:TimerEvent):void
{

var randBild:int = Math.random()*5;
var nam:String = "swirl-"+randBild+".jpg";
var urlR:URLRequest = new URLRequest(nam);
trace(nam);
loader.load(urlR);
container.addChildAt(loader,0);
}

public function copyGirl()
{
var childs:Array = [];

for (var i:uint = 0; i<2; i++){
var st:mcgirl = new mcgirl;
container.addChildAt(st,container.numChildren-1);
childs.push(st);
}

var g0:mcgirl = childs[0];
var g1:mcgirl = childs[1];

g0.x = -110;
g0.y = 90;
g1.x = 120;
g1.y = 90;
}
}
}

SamFR
30.11.2009, 01:09
Используйте addChildAt() только в том случае, когда вам нужно добавить объект на уже занятую позицию. В остальных случаях – addChild().

public function bild(e:TimerEvent):void
{
var randBild:int = Math.random()*5;
var nam:String = "swirl-"+randBild+".jpg";
var urlR:URLRequest = new URLRequest(nam);
trace(nam);
loader.load(urlR);
container.addChild(loader);
}

public function copyGirl()
{
var childs:Array = [];

for (var i:uint = 0; i<2; i++){
var st:DisplayObject = new mcgirl;
container.addChild(st);
childs.push(st);
}

var g0:mcgirl = childs[0];
var g1:mcgirl = childs[1];

g0.x = -110;
g0.y = 90;
g1.x = 120;
g1.y = 90;
}

Добавлено через 1 минуту
Позвольте поинтересоваться, зачем вам тут лоадер?

Killer_13
30.11.2009, 01:33
Чуток не понял, как эт на уже занятую позицию, а почему не работает так как делал я? Читал, в книге и в хелпе адобовском - вроде все правильно, методом addChildAt добавляю в контейнер обьекты, а потом присваиваю им индексы 0 первый элемент, тоисть самый нижний, далее 1 и так д... numChilden-1 последний элемент тоисть самы верхний.
Пасиб.

лоадер... хммм, ну с помощью него я загружаю извне картинки которые меняются рандом на фоне..
Или, эт тоже неправильная тропинка для этого дела? Пасиб

Добавлено через 6 минут
Не работает и так, - ругается на строку,
container.addChildAt(st);

- что не хватает параметров
попробовал и так писать,
container.addChildAt(st,1);

container.addChildAt(st,container.numChildren-1);

все равно остается та же ошыбка. :(

Dimax4d
30.11.2009, 01:43
Пишите вот так, должно заработать

container.addChild(st);

UPD. А не работало потому что при добавлении первого ребенка у вас container.numChildren=0 и следовательно container.numChildren-1 = -1, а на -1 позицию добавлять нельзя. Вот и получается ваш

Error #2006: Предоставленный индекс выходит за допустимые пределы.

Killer_13
30.11.2009, 01:48
:( мистика какая то.. :) компилируется без ошыбок, но не отображается ничего,
на выходе
trace(nam);

генерирует имена случайных картинок, а ничего не отображается. :(
Что может быть?
Я понимаю, что по идее должно работать потому, что при добавлении обьектов они размещаются по принцыпу первый с самого низу.

Dimax4d
30.11.2009, 01:59
А вы контейнер в список отображения добавили?

stage.addChild(container);

Killer_13
30.11.2009, 02:08
нет, только что попробовал, - добавил сразу после создания контейнера

var container:Sprite = new Sprite();
stage.addChild(container);
var loader:Loader = new Loader();
ошыбка 1120:Access of undefined property stage

Dimax4d
30.11.2009, 02:10
Ошибся,

super.addChild(container);

SamFR
30.11.2009, 02:16
Извиняюсь, в своём примере я забыл убрать At с строчке
container.addChildAt(st);

Должно быть
container.addChild(st);

Killer_13
30.11.2009, 02:16
А что есть super? Не встречал такого...
Если заменить stage на super, то
1061: Call to a possibly undefined method addChild through a reference with static type flash.display:InteractiveObject.

Добавлено через 2 минуты
SamFR
ничего, но к сожалению не работает ни с ат ни без ат. :(
оказывается, - как добрые люди подсказывают - нужно еще этот контейнер добавить на stage че т... не хочет он никак добавляться.. :(

Dimax4d
30.11.2009, 02:19
super - вызов метода родительского класса. То, что я написал, надо добавлять в основной класс, который наследуется от Sprite

И если можно полный код в студию!

SamFR
30.11.2009, 02:22
А обращаться к stage можно только после добавления объекта, из которого происходит обращение, в дисплей-лист. То есть после прихода события Event.ADDED_TO_STAGE. До этого stage равняется null, отсюда и ошибка.

Однако добавлять на stage – нехорошо хотя бы потому, что ссылка на него доступна не всегда. Добавляйте в Document Class из него же, то есть в классе документа this.addChild(container).

Killer_13
30.11.2009, 02:24
Весь код
package
{
import flash.display.*;
import flash.events.*;
import flash.net.URLRequest;
import flash.utils.Timer;

public class girl extends Sprite
{
public function girl()
{
tim();
copyGirl();
}

public function tim(){
var timer:Timer = new Timer(3000, 0);
timer.addEventListener(TimerEvent.TIMER, bild);
timer.start();
}

var container:Sprite = new Sprite();
super.addChild(container);
var loader:Loader = new Loader();

public function bild(e:TimerEvent):void
{

var randBild:int = Math.random()*5;
var nam:String = "swirl-"+randBild+".jpg";
var urlR:URLRequest = new URLRequest(nam);
trace(nam);
loader.load(urlR);
container.addChild(loader);
}

public function copyGirl()
{
var childs:Array = [];

for (var i:uint = 0; i<2; i++){
var st:mcgirl = new mcgirl;
container.addChild(st);
childs.push(st);
}

var g0:mcgirl = childs[0];
var g1:mcgirl = childs[1];

g0.x = -110;
g0.y = 90;
g1.x = 120;
g1.y = 90;
}
}
}

SamFR
30.11.2009, 02:26
Вы неправильно спроектировали свою программу. Создание и добавление основных контейнеров, а также управление общим ходом программы должно вестись из управляющего класса. Чаще всего это – Document Class. Перенесите в него управление фоном (смена фоновых картинок), создание и добавление объектов girl. Иначе через некоторое время вы сами запутаетесь в своём коде, немотря на всю его простоту.

Добавлено через 1 минуту
Или girl это и есть класс документа? Какой класс у вас назначен в поле Class вашего .fla документа?

Killer_13
30.11.2009, 02:31
Уххх пасиб.
Добавил код в документ класса и все заработало.
this.addChild(container).

НО, в моем случае, у меня каждых 3 секунды вызывается новая картинка тогда функция copyGirl которая загружает ролик идет под низ, можно как то ей указать, чтоб при любых обстоятельствах она оставалась сверху.

Добавлено через 2 минуты
SamFR - да, girl это и есть класс документа и он прописан в поле Class .fla документа.
Эт просто небольшая лабораторная работа, нету смысла проектировать несколько классов и так д или..?
Пасиб.

SamFR
30.11.2009, 02:34
тогда функция copyGirl которая загружает ролик идет под низ, можно как то ей указать, чтоб при любых обстоятельствах она оставалась сверху.
Функция идёт под низ? Я, наверное, чего-то не понимаю :)

Killer_13
30.11.2009, 02:41
Функция copyGirl берет с библиотеки мувиклип - там 2 танцующие девочки, и задумка такова, чтоб они оставались с самого верху, а ззади, чтоб менялся фон каждых несколько секунд... вот... .тот мувик с девочками загружается, - потом через 3 секунды начинается смена картинок каждых 3 секунды в итоге они создаются на новом уровне тоисть становятся на уровень выше и перекривают танцующих девушек.
Или в данном случае нужно как то сделать еще 2 контейнеры в container

Dimax4d
30.11.2009, 03:01
Для каждой из девушек по контейнеру, и фону тоже контейнер. Добавляете их в нужном порядке и делаете с ними что хотите

Killer_13
30.11.2009, 03:15
Сделал, - работает!!!
Огромное спасибо, помогли разобраться.
А не могли бы подсказать как мне сделать, чтоб таймер загружал картинку сразу а не через 3 секунды, потому, что получается сл картина.
Грузятся девочки, а потом (через 3 секунды) начинают менятся картинки, а нужно чтоб они начали менятся с самого начала, ну.. чтоб небыло пробела в 3 секунды при начальной загрузке.
Пас.

SamFR
30.11.2009, 03:15
Каждой девушке – по контейнеру! Прям лозунг :D
Мне кажется, хватит им и одного на двоих. Такая вот дискриминация)

А для фоновых картинок – да, можно либо сделать отдельный контейнер, либо добавлять картинки на нулевой уровень: container.addChildAt(image, 0). Только нужно убедиться, что существует: container.numChildren > 0. В противном случае вызывать container.addChild(image).

Killer_13, только не забывайте удалять из контейнера отработавшие картинки. Пока я соответствующего кода у вас не увидел. Иначе ваша программа через определённое время выжрет всю оперативную память, а это нехорошо :)

Добавлено через 4 минуты
А не могли бы подсказать как мне сделать, чтоб таймер загружал картинку сразу а не через 3 секунды, потому, что получается сл картина.

Вызовите bild() в единожды том же блоке, где запускаете таймер. Только объявите bild с аргументом по умолчанию:
public function bild(e:TimerEvent = null):void

Killer_13
30.11.2009, 03:20
Ну я так и сделал, сделал 2 контейнера, один для картинок сзади, другой для танцовщиц. :)

понял, на удаление сделаю, хотел сделать, но все по порядку нужно делать. :)

Добавлено через 4 минуты
ну... мог бы и сам догадаться - еще раз функцию запустить :)

Только объявите bild с аргументом по умолчанию:
а до этого еще не дорос, еще не понимаю чуток - нужно будет почитать.
Удалять обьекты буду уже завтра. :)