Просмотр полной версии : Вывод координат экземпляров классов
DZHETIGAPA
04.01.2011, 01:35
Возник вопрос в понимании ActionScript.
Создал два символа и подключил к ним классы. И так, есть два класса шаров-мячиков(Shar и SharZloi). Оба эти класса расширяются третьим классом(XYRandom), в котором указаны координаты возникновения экземпляров этих классов на сцене. И затем оба эти класса добавляются в главный класс Main.
Мне нужно видеть координаты каждого экземпляра класса в другом классе. Но почему-то выводятся одни нули.
Вот код:
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, но мне надо именно в двух вышеназванных классах.
Объясните пожалуйста мою ошибку.
Шар у вас на сцену не добавляется.
могу ошибаться но
var shar:MovieClip = new Shar();
addChild(shar);
это свойство объекта Main, а
trace(shar.x)
выводит значение
private var shar:Shar;
так как он в более близкой области видимости и найдя его определение внутри класса SharZloi, дальше поиск не происходит.
DZHETIGAPA
04.01.2011, 01:53
Да... щас добавил экземпляр класса Shar на сцену в классе SharZloi, все работает. Но у меня вопрос: Зачем тогда нужно событие Event.ADDED_TO_STAGE. Ведь по идее оно происходит, когда экземпляр добавлен на сцену. Или я не так понимаю?
все верно оно происходит, но вы добавляете на сцену не тот объект за которым следите.
DZHETIGAPA
04.01.2011, 01:59
Шар у вас на сцену не добавляется.
Шар то добавляется, но в классе Main. Если добавляю в классе SharZloi, то все работает. Вопрос сформулировал выше про событие добавление объекта на сцену.
saikspaik
04.01.2011, 01:59
В общем тебе не нужно в классе SharZloi, создавать экземпляр класса Shar, он у тебя уже создан в Main.
Тебе просто нужно просто передать в SharZloi ссылку на экземпляр класса Shar и потом использовать его свойства.
собственно в вашем случае достаточно вывести
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, то метод уже не виртуальный во флэше выходит?
DZHETIGAPA
04.01.2011, 02:16
Понял главную ошибку: Объект еще не на сцене, а я вывожу его координаты.
собственно в вашем случае достаточно вывести
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, то метод уже не виртуальный во флэше выходит?
Ты имеешь виду, эту строчку:
private function added(e:Event):void
{
this.x = Math.random() * stage.stageWidth;
this.y = Math.random() * stage.stageHeight;
}
Или о чем ты?
Если объект не добавлен, то и координата должна быть не определена, то есть даже не равна нулю.
у предопределенных свойств существуют значения по умолчанию в случае с координатами это 0
Честно говоря не понял, о чем ты. Думаю это ничего не исправит.
в данном коде - не исправит.
а если переделать классы шар и шарзлой удалив в них определения одноименных с главным классом свойств или забирать в них ссылку на объект из свойств Main класса должно помочь.
Вообще может исходя из задачи будет проще сориентироваться?
Добавлено через 3 минуты
удивило, что оно не ругнулось насчёт override, что, если private,
насколько я знаю private доступен только внутри класса, потому override нету.
DZHETIGAPA
04.01.2011, 22:15
Добавил в класс Shar экземпляр класса SharZloi.НО... теперь поведение объекта класса SharZloi на сцене вообще не понятно. Хотя потом дошел, что теперь отсчет координат объекта класса SharZloi идет относительно объекта класса Shar, ведь мы именно в этот класс добавляем.А мне ведь надо координаты относительно сцены.
Значит, чтобы координаты для обоих объектов классов были одинаковы относительно сцены, то надо добавлять их только в класс Main. Верно я понял?
Можно делать перерасчет относительно любого контейнера, смотрите в сторону globalToLocal и localToGlobal
DZHETIGAPA
05.01.2011, 02:38
Вот возникло еще одно непонимание. прошу помощи.
Добавил еще один маленький шарик SharSmall, который удаляется и заново добавляется на сцену в случае столкновения.
Вот код двух классов:
package
{
import flash.display.*;
import flash.events.*;
import com.greensock.*;
public class SharSmall extends XYRandom
{
private var rad:Number;
public function SharSmall():void
{
this.addEventListener(Event.ADDED_TO_STAGE, added);
}
private function added(e:Event):void
{
TweenMax.to(this, 0.5, { x:this.x + 40, yoyo:true, repeat: -1 } );
addEventListener(Event.ENTER_FRAME, onFrame);
rad = this.width / 2;
}
private function onFrame(e:Event):void
{
if (this.x <= rad) this.x = rad;
if (this.x >= stage.stageWidth -rad) this.x = stage.stageWidth -rad;
trace("STAGE="+stage.stageWidth)
}
}
}
SWF файл компилируется во Flash CS3, но при каждом столкновении пишет ошибку:
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at SharSmall/::onFrame()
при этом продолжается работа, но при каждом столкновении прога тормозит все больше. Ошибка возникает именно при столкновении объектов. То есть если нет столкновения, то и нет ошибки.
Если вместо stage.stageWidth ставлю просто значение 550, то все работает без проблем.
Вот основной класс, где происходит обработка столкновения объектов.
package
{
import flash.display.*;
import flash.events.*;
import com.greensock.*;
import CircleCollision;
import flash.ui.Mouse;
public class Main extends Sprite
{
private var hit1:CircleCollision;
private var hit2:CircleCollision;
private var shar:Shar;
private var zloi:SharZloi;
private var small:SharSmall;
public function Main():void
{
shar= new Shar();
addChild(shar);
zloi = new SharZloi();
addChild(zloi);
small = new SharSmall();
addChild(small);
Mouse.hide();
stage.addEventListener(Event.ENTER_FRAME, onFrame)
}
private function onFrame(e:Event):void
{
hit1 = new CircleCollision(zloi as DisplayObject, shar as DisplayObject);
addChild(hit1);
if (hit1.Collision)
{
trace("BOOM")
}
hit2 = new CircleCollision(shar as DisplayObject, small as DisplayObject);
addChild(hit2);
if (hit2.Collision) //именно тут происходит проверка столкновения.
{
this.removeChild(small);
small = new SharSmall();
this.addChild(small);
}
}
}
}
Жду вашей помощи.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.