Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 27.02.2011, 21:45
fish_r вне форума Посмотреть профиль Отправить личное сообщение для fish_r Посетить домашнюю страницу fish_r Найти все сообщения от fish_r
  № 1  
Ответить с цитированием
fish_r
 
Аватар для fish_r

блогер
Регистрация: Jan 2011
Сообщений: 1,162
Записей в блоге: 4
По умолчанию Позиционирование увеличивающегося MovieClip-а

Увеличиваю MovieClip размерами больше сцены (окна) приложения. При этом мувик произвольно смещён относительно центра сцены, но важно, чтобы пропорции смещения не изменялись. То есть:




Где прямоугольник без заливки - сцена, окно приложения. Желтый прямоугольник - мувик. Точка "А" находится на мувиклипе, в данный момент в центре окна приложения. Важно чтобы при увеличении мувика точка "А" так и оставалась в центре сцены.

Как я это делаю:
Вычисляю смещение левой стороны мувиклипа относительно окна
Код AS3:
var leftShoulderX:Number = Math.abs(oldX / (oldWidth - this.stage.stageWidth));
var leftShoulderY:Number = Math.abs(oldY / (oldHeight - this.stage.stageHeight));
где old'ы это соотв. параметры мувика до его масштабирования, а leftShoulder'сы степень смещения относительно сцены.

Позиционирую
Код AS3:
_pictMovie.x = (this.stage.stageWidth - _pictMovie.width) * leftShoulderX;
_pictMovie.y = (this.stage.stageHeight - _pictMovie.height) * leftShoulderY;
где _pictMovie.x/y - имя мувика, а leftShouldrX/Y степень смещения относительно центра окна при-
ложения.

Теоретически все выглядит правильно, пересчет в ручную дает погрешность в 1, 2 пиксела на 5000, в данном случае это вполне приемлемо. Но правктически мувик в окне "едет" при увеличении вправо и вниз на 100-200 пикс. Что я делаю не так? Замылил уже мозг, мне надо чтобы кто то свежим взглядом глянул .
Изображения
 

Старый 27.02.2011, 22:06
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 2  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,282
как раз для таких случаев у DisplayObject есть методы globalToLocal, localToGlobal.
Делается так:
1) Есть мувик с именем mc.
2) Получаем координаты его центра до начала скейла в системе координат его парента:
Код AS3:
var p1:Point=new Point(0,0);
p1=mc.localToGlobal(p1);
p1=mc.parent.globalToLocal(p1);
3) Скейлим и снова вычисляем координаты центра:
Код AS3:
var p2:Point=new Point(0,0);
p2=mc.localToGlobal(p2);
p2=mc.parent.globalToLocal(p2);
4) Если (p1.x!=p2.x || p1.y!=p2.y) корректируем положение мувика
Код AS3:
var delta:Point=new Point(p2.x-p1.x,p2.y-p1.y);
mc.x+=delta.x;
mc.y+=delta.y;
код писал из головы поэтому может потребуется поменять знаки у delta.

UPD: если мувик лежит непосредственно на стейдже, то можно сэкономить и вычислять координаты центра мувика в системе координат стейджа. Тогда не надо дважды вызывать достаточно ресурсоемкую операцию globalToLocal


Последний раз редактировалось undefined; 27.02.2011 в 22:40.
Старый 27.02.2011, 23:00
fish_r вне форума Посмотреть профиль Отправить личное сообщение для fish_r Посетить домашнюю страницу fish_r Найти все сообщения от fish_r
  № 3  
Ответить с цитированием
fish_r
 
Аватар для fish_r

блогер
Регистрация: Jan 2011
Сообщений: 1,162
Записей в блоге: 4
Цитата:
Сообщение от undefined Посмотреть сообщение
как раз для таких случаев у DisplayObject есть методы globalToLocal, localToGlobal.
Эти методы не для этого.

Цитата:
Сообщение от undefined Посмотреть сообщение
2) Получаем координаты его центра до начала скейла в системе координат его парента:...
Так вы получаете не координаты его центра, а координаты его левого верхнего угла ,если конечно это не окружность (а это не окружность), у которой точка регистрации в центре.


Цитата:
Сообщение от undefined Посмотреть сообщение
...
и да - мувик лежит на сцене и его лок. координаты совпадают с его глоб. координатами.

Старый 27.02.2011, 23:21
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 4  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,282
Цитата:
Так вы получаете не координаты его центра, а координаты его левого верхнего угла ,если конечно это не окружность (а это не окружность), у которой точка регистрации в центре.
ты путаешь localToGlobal c getRect. localToGlobal(new Point(0,0)) вернет как раз координаты центра, точнее того черного крестика который видно при редактировании символа в flash ide.
В твоем случае коррдинаты в new Point(0,0) надо заменить на координаты точки A относительно mc.

Цитата:
и да - мувик лежит на сцене и его лок. координаты совпадают с его глоб. координатами.
ну да, но локальные координаты точки A неизменны, а вот глобальные меняются из-за меняющегося масштаба мувика.


Последний раз редактировалось undefined; 27.02.2011 в 23:38.
Старый 27.02.2011, 23:56
mikhailk вне форума Посмотреть профиль Отправить личное сообщение для mikhailk Найти все сообщения от mikhailk
  № 5  
Ответить с цитированием
mikhailk
 
Аватар для mikhailk

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
Цитата:
Где прямоугольник без заливки - сцена, окно приложения. Желтый прямоугольник - мувик. Точка "А" находится на мувиклипе, в данный момент в центре окна приложения. Важно чтобы при увеличении мувика точка "А" так и оставалась в центре сцены.
Можно положить все в спрайт с таким смещением, чтобы точка А была у него в точке 0,0.
Спрайт спозиционировать на сцене так, чтобы точка А была в нужном месте.
После этого при применении скалирования к спрайту точка А двигаться не будет, а все, что лежит в спрайте, будет равномерно скалироваться относительно нее.

Старый 28.02.2011, 00:06
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 6  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,282
тоже неплохой вариант
сам последнее время пытаюсь всю графику внутри символов выравнивать так, чтоб точка (0,0) была в геометрическом центре символа. Тогда при изменение размера стейджа надо просто пропорционально изменить координаты мувиков и не надо вызывать гетеры width и height. Работает не всегда, но достаточно часто.

Старый 28.02.2011, 00:16
fish_r вне форума Посмотреть профиль Отправить личное сообщение для fish_r Посетить домашнюю страницу fish_r Найти все сообщения от fish_r
  № 7  
Ответить с цитированием
fish_r
 
Аватар для fish_r

блогер
Регистрация: Jan 2011
Сообщений: 1,162
Записей в блоге: 4
А, понял! я вас немного в заблуждение ввел этой точкой "А". Дело в том, что точка "А" это не объект, точкой "А" , здесь, я обозначаю место которое сейчас находится в центре сцены, и это место всегда должно оставаться в центре. Спрайт не подходит, так как я заранее не знаю, где именно будет точка "А". Ближайший аналог, такой системы, который приходит на ум - карты гугла и яндекса, или средство просм. изображений в винде.

Добавлено через 6 минут
Цитата:
Сообщение от undefined Посмотреть сообщение
ты путаешь localToGlobal c getRect. localToGlobal(new Point(0,0)) вернет как раз координаты центра, точнее того черного крестика который видно при редактировании символа в flash ide...
Ну да, а черный крестик показывает точку регистрации, которая у символов обычно в верхнем левом углу, а не в центре, так, что ничего я не путаю.

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

Старый 28.02.2011, 00:31
mikhailk вне форума Посмотреть профиль Отправить личное сообщение для mikhailk Найти все сообщения от mikhailk
  № 8  
Ответить с цитированием
mikhailk
 
Аватар для mikhailk

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
Цитата:
Ну да, а черный крестик показывает точку регистрации, которая у символов обычно в верхнем левом углу, а не в центре, так, что ничего я не путаю
Точка регистрации может быть и в центре.

Старый 28.02.2011, 00:34
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 9  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,282
Цитата:
не вижу разницы между выявлением отношения координат центра и края к координатам другого объекта
Тоже не вижу.
Идея в том, что, зная какая точка мувиклипа должна быть в центре стейджа, независимо от точки регистрации, можно пригвоздить эту точку к стейджу, надо только узнать какую точку внутри мувика надо приклеить. Это моментально делается с помощью панели properties.

Старый 28.02.2011, 00:44
fish_r вне форума Посмотреть профиль Отправить личное сообщение для fish_r Посетить домашнюю страницу fish_r Найти все сообщения от fish_r
  № 10  
Ответить с цитированием
fish_r
 
Аватар для fish_r

блогер
Регистрация: Jan 2011
Сообщений: 1,162
Записей в блоге: 4
Цитата:
Сообщение от mikhailk Посмотреть сообщение
Точка регистрации может быть и в центре.
Если вы сами ее измените, или если это окружность... К чему это замечание?

Добавлено через 2 минуты
Цитата:
Сообщение от undefined Посмотреть сообщение
Идея в том, что, зная какая точка мувиклипа должна быть в центре стейджа....
Да, не знаем мы где эта точка, она будет выбрана пользователем. Я не баннер делаю , какие пропертис?

Создать новую тему Ответ Часовой пояс GMT +4, время: 16:20.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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