Форум 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=148497)

DZHETIGAPA 04.01.2011 01:35

Вывод координат экземпляров классов
 
Возник вопрос в понимании ActionScript.

Создал два символа и подключил к ним классы. И так, есть два класса шаров-мячиков(Shar и SharZloi). Оба эти класса расширяются третьим классом(XYRandom), в котором указаны координаты возникновения экземпляров этих классов на сцене. И затем оба эти класса добавляются в главный класс Main.

Мне нужно видеть координаты каждого экземпляра класса в другом классе. Но почему-то выводятся одни нули.

Вот код:
Код AS3:

package  
{
        import flash.display.MovieClip;
        import flash.events.*;
 
        public class XYRandom extends MovieClip
        {
 
                public function XYRandom():void
                {
                        this.addEventListener(Event.ADDED_TO_STAGE, added);
                }
 
                private function added(e:Event):void
                {
                        this.x = Math.random() * stage.stageWidth;
                        this.y = Math.random() * stage.stageHeight;
                }
        }
}
 
package 
{
        import flash.display.*;
        import flash.events.*;
        import com.greensock.*;
 
        public class Shar extends XYRandom
        {
 
                public function Shar():void
                {
                        this.addEventListener(Event.ADDED_TO_STAGE, added)
                }
 
                private function added(e:Event):void
                {
                        addEventListener(Event.ENTER_FRAME, onFrame)
                }
 
                private function onFrame(e:Event):void
                {
                        var dx:Number = this.x + mouseX;
                        var dy:Number = this.y +mouseY;
                        TweenLite.to(this, 0.5, {x:dx, y:dy})
                }
        }
}
 
package 
{
        import flash.events.Event;
        import flash.display.*;
        /**
        * ...
        * @author
        */

        public class SharZloi extends XYRandom
        {
 
                private var shar:Shar;
 
                public function SharZloi():void
                {
                        this.addEventListener(Event.ADDED_TO_STAGE, added);
                }
 
                private function added(e:Event):void
                {
                        shar = new Shar();
                        addEventListener(Event.ENTER_FRAME, onFrame)
                }
 
                private function onFrame(e:Event):void
                {
                        trace(shar.x)//Выводит нули
                }
        }
}
 
package 
{
        import flash.display.*;
        import flash.events.*;
        import com.greensock.*;
        /**
        * ...
        * @author
        */

        public class Main extends Sprite
        {
 
                public function Main():void
                {
                        var shar:MovieClip = new Shar();
                        addChild(shar);
 
                        var zloi:MovieClip = new SharZloi();
                        addChild(zloi);
 
                }
        }
}

Доступ к координатам экземпляров классов могу только получить в главном классе Main, но мне надо именно в двух вышеназванных классах.

Объясните пожалуйста мою ошибку.

udaaff 04.01.2011 01:45

Шар у вас на сцену не добавляется.

MetSerp 04.01.2011 01:51

могу ошибаться но
Код AS3:

 var shar:MovieClip = new Shar();
                        addChild(shar);

это свойство объекта Main, а
Код AS3:

trace(shar.x)

выводит значение
Код AS3:

private var shar:Shar;

так как он в более близкой области видимости и найдя его определение внутри класса SharZloi, дальше поиск не происходит.

DZHETIGAPA 04.01.2011 01:53

Да... щас добавил экземпляр класса Shar на сцену в классе SharZloi, все работает. Но у меня вопрос: Зачем тогда нужно событие Event.ADDED_TO_STAGE. Ведь по идее оно происходит, когда экземпляр добавлен на сцену. Или я не так понимаю?

MetSerp 04.01.2011 01:57

все верно оно происходит, но вы добавляете на сцену не тот объект за которым следите.

DZHETIGAPA 04.01.2011 01:59

Цитата:

Сообщение от udaaff (Сообщение 961776)
Шар у вас на сцену не добавляется.

Шар то добавляется, но в классе Main. Если добавляю в классе SharZloi, то все работает. Вопрос сформулировал выше про событие добавление объекта на сцену.

saikspaik 04.01.2011 01:59

В общем тебе не нужно в классе SharZloi, создавать экземпляр класса Shar, он у тебя уже создан в Main.
Тебе просто нужно просто передать в SharZloi ссылку на экземпляр класса Shar и потом использовать его свойства.

MetSerp 04.01.2011 02:03

собственно в вашем случае достаточно вывести
Код AS3:

var shar:MovieClip = new Shar();
var zloi:MovieClip = new SharZloi();

в свойства уровня класса, а не метода конструктора, эти свойства и будут содержать ссылки на данные объекты.

-De- 04.01.2011 02:03

shar не добавлен на сцену, соответственно его added не вызвалось и координаты его 0. Зачем shar делается полем SharZloi, если SharZloi расширяет XYRandom?
Почему везде private function added(e:Event):void может, стоит их чуть по-рахному назвать?
Меня вот удивило, что оно не ругнулось насчёт override, что, если private, то метод уже не виртуальный во флэше выходит?

DZHETIGAPA 04.01.2011 02:16

Понял главную ошибку: Объект еще не на сцене, а я вывожу его координаты.

Цитата:

Сообщение от MetSerp (Сообщение 961782)
собственно в вашем случае достаточно вывести
Код AS3:

var shar:MovieClip = new Shar();
var zloi:MovieClip = new SharZloi();

в свойства уровня класса, а не метода конструктора, эти свойства и будут содержать ссылки на данные объекты.

Честно говоря не понял, о чем ты. Думаю это ничего не исправит.
Цитата:

shar не добавлен на сцену, соответственно его added не вызвалось и координаты его 0.
Спасибо понял. хотя интересно. Если объект не добавлен, то и координата должна быть не определена, то есть даже не равна нулю.
Цитата:

Зачем shar делается полем SharZloi, если SharZloi расширяет XYRandom?
Про поле я не понял:)
Цитата:

Почему везде private function added(e:Event):void может, стоит их чуть по-рахному назвать?
Можно. Просто это для быстроты.
Цитата:

Меня вот удивило, что оно не ругнулось насчёт override, что, если private, то метод уже не виртуальный во флэше выходит?
Ты имеешь виду, эту строчку:
Код AS3:

private function added(e:Event):void
                {
                        this.x = Math.random() * stage.stageWidth;
                        this.y = Math.random() * stage.stageHeight;
                }

Или о чем ты?


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

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