Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   MovieClip: точное размещение на Stage (http://www.flasher.ru/forum/showthread.php?t=202799)

Fogflasher 12.08.2013 11:30

MovieClip: точное размещение на Stage
 
Всем привет.

В библиотеке проекта создан мувиклип: Ellipse1
Он имеет аналогичное имя класса и залинкован через галочки "Export for ActionScript".
Сам стэйдж пустой.

В документ-класс помещает такой код:
Код AS3:

package
{
          import flash.display.*;
          import flash.events.*;
          import flash.text.*;
 
          public class Main extends Sprite
          {
 
                  private var item1:Ellipse1;
                  private var text1:TextField;
 
                  public function Main()
                  {
 
 
                          item1 = new Ellipse1();
                          item1.x = 200;
                          item1.y = 200;
                          addChild(item1);
 
                          text1 = new TextField();
                          text1.x = 200;
                          text1.y = 200;
                          text1.text = "O = is placed at coordinates: 200, 200";
                          text1.autoSize = TextFieldAutoSize.LEFT;
                          addChild(text1);
 
 
                  }
 
          }
 
 
}

И видим, что если буква О текста указывает на координаты 200, 200, то сам эллипс расположен иначе.

То есть, объекты из библиотеки помещаются на стэйдж не по координатам верхнего левого угла, а по координатам центра.

Возникают вопросы:

1. Как размещать объект по координатам верхнего левого угла?
Я могу предположить два варианта решения задачи:
- либо создать некую функцию и корректировать постоянно значения координат (с учётом половин ширины и высоты объекта)
- либо же, есть некое программное свойство, перезадающее центр в левый верхний угол.

2. Нужно ли с учётом п.1 при создании объекта в опции (Edit...) смещать сам объект по отношению к центру Edit-области?
Или можно всегда его создавать так, чтобы центр объекта был совмещен с центром Edit-области.

KumoKairo 12.08.2013 11:41

Вложений: 1
Для отладки текстовых полей всегда включайте
Цитата:

myLittleTextField.border = true;
тогда будет видно реальное местоположение текстового поля.

При создании новых символов (вообще говоря) выбирается точка регистрации:
Вложение 29888

Fogflasher 12.08.2013 11:50

Ааа, точка регистрации... Щас попробую, спасибо.
Но этот способ работает, если создавать на стэйдж объект, и потом конверт-ту-символ.
А вот если сразу создавать символ, то этой опции нет (или я её в упор не вижу, во Flash CS3 по крайней мере).

А чисто програмно эту точку регистрации можно перезадать? Или только на фазе создания все решается.

Wolsh 12.08.2013 11:59

Цитата:

А чисто програмно эту точку регистрации можно перезадать?
Нет.
Цитата:

если сразу создавать символ, то этой опции нет
А зачем? Точка регистрации показана в редакторе, рисуйте относительно неё.

Fogflasher 12.08.2013 12:13

А-ха, то есть это не столько центр области редактирования, сколько точка регистрации, понятно.

И если какой-то мувиклип уже создан с регистрацией по центру, то изменить это, видимо, можно только вручную, перетаскивая его в редакторе.

KumoKairo 12.08.2013 12:16

Поверье, это намного проще чем возиться с матрицами преобразований

Fogflasher 12.08.2013 12:22

Вложений: 1
KumoKairo, верю на слово : )

Кстати, нашел еще один способ:

Вложение 29890

Нужно вручную выставить X = 0 и Y = 0.

Fogflasher 15.08.2013 14:57

Уточняющий вопрос:

Подскажите, верно ли следующее рассуждение?

Функция addChild() будет срабатывать только из основного DocumentClass'a.
(конешно если он расширяет соответсвующий DOС класс).

То есть, addChild() никогда не добавит на Stage некий объект, если он находится внутри другого, неосновного класса?
Получается так, что он будет добавлять себя же в свой же экземпляр, а раз он не stage, то сделать этого не сможет.

Вывод: чтобы добавить что-то на stage из неосновного класса, нужно придумывать хитрые схемы наследований, композиций, паттернов, но на базовом нуб-уровне - этого сделать принципиально нельзя.

caseyryan 15.08.2013 15:01

Цитата:

Функция addChild() будет срабатывать только из основного DocumentClass'a (конешно если он расширяет соответсвующий DOС класс).
Не верно. Она работает в любом классе, у которого в цепочке наследования есть DisplayObjectContainer
Цитата:

То есть, addChild() никогда не добавит на Stage некий объект, если он находится внутри другого, неосновного класса?
Если я правильно понимаю: получается так, что он будет добавлять себя же в свой же экземпляр, а раз он не stage, то сделать этого не сможет.
Несколько раз перечитал, так и не понял полностью этого вопроса. Но суть все равно не верная. Не важно где находится объект, если из другого класса (где есть ссылка на этот объект и stage != null) вызвать stage.addChild(someObject); то этот someObject удалится из того контейнера в котором находится в данный момент, и добавится на stage
Цитата:

Вывод: чтобы добавить что-то на stage из неосновного класса, нужно придумывать хитрые схемы наследования и композиций, паттернов, но на базовом нуб-уровне - этого сделать принципиально нельзя.
Вывод так же не верный. Ничего сложного изобретать не нужно.

in4core 15.08.2013 15:23

Цитата:

А чисто програмно эту точку регистрации можно перезадать?
Нет.
Не правда. Создам я допустим мувиклип внутри нарисую квадрат ( 100*100) и назначу точку регистрации центр. Квадрат встанет в координаты -50 - 50. Из кода я делаю точку регистрации в левый верхний как :
mc.getChildAt(0).x = 0, y=0; // this is SHAPE
Поижее должно работать.


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

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