Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Проблема с добавлением в список отображения массива объектов (http://www.flasher.ru/forum/showthread.php?t=166939)

PainKiller 07.09.2011 00:25

Проблема с добавлением в список отображения массива объектов
 
Извиняюсь, что спрашиваю, наверное, глупый вопрос, но экшн скрипт я начал изучать недавно и он поставил меня в тупик.
Имеется мувик на одном из кадров главной таймлайн (GamePlay), в котором создается массив объектов дочерних от класса Star (в классе прописано движение звезд). Подклассы этого класса прикреплены к разным мувикам с изображением звезд разной формы и цвета.
В общем вот код:
Код AS3:

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 файле, а тут возникли проблемы. Можно ли это как то исправить, а то расставлять звезды вручную по ряду причин не вариант.

veisss 07.09.2011 02:08

По моему ошибка в циклах
попробуй так
Код AS3:

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 ());
}


Newred 07.09.2011 04:33

пришлось моделировать у себя текущую ситуацию....
оказалось банальная ошибка, вы во втором цикле перепутали операторы j != i

рабочий код:
Код AS3:

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 тоже большое спасибо за помощь, но дело не в этом. Код по идее работал хотя бы с первым массивом

Newred 07.09.2011 04:53

Вложений: 1
вот вам исходники)

GBee 07.09.2011 13:24

Цитата:

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 минут
Вопрос как это исправить

GBee 07.09.2011 21:48

ADDED_TO_STAGE

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()

veisss 08.09.2011 00:49

У меня у самого там опечатка во втором цикле
Так правильнее
Код AS3:

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);
}

Тут этот объект добавляется в массив
Код AS3:

arrayOfStar6Red.push(star6Red);



А Error #1009: тебе выдает эта строчка
Код AS3:

this.x = parent.width + 10;//parent тут null

Это
Код AS3:

addEventListener (Event.ENTER_FRAME, move);

перенеси в
Код AS3:

public function addListener (e:Event):void

И всегда когда пользуешься опасными переменными(parent,stage...)
лучше проверяй их
Код AS3:

if(parent){
    //делай с parent-ом что хочешь
}else{
    //ой
}



Часовой пояс GMT +4, время: 00:18.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.