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

TanaTiX 12.09.2011 11:05

Масштабирование
 
Что-то я впал в нубство...
Код AS3:

trace(mc.width);//100
mc.rotation=45;
trace(mc.width);//91.9
mc.width=100;
trace(mc.width);//98.15

Почему в результате 2-го трэйса выводит 91.9 я еще могу понять. А вот почему последний выдает значение, отличное от 100 - не понятно.

toFL 12.09.2011 12:19

Цитата:

А вот почему последний выдает значение, отличное от 100 - не понятно.
Отличное от 100, потому что в результате присвоений, ширина не равна 100. Переформулирую: Почему происходит странная (неправильная) установка width и height, при rotation отличное от 0 (360). По существу я сам не знаю, но происходит, что-то не понятное.

ЗлОй ПрОграММер 12.09.2011 12:40

потому что вы переворачиваете всю область(прямоугольную или квадратную) mc, если повернуть квадрат на 45 градусов его длина будет больше !???

goodguy 12.09.2011 12:49

Цитата:

потому что вы переворачиваете всю область(прямоугольную или квадратную) mc, если повернуть квадрат на 45 градусов его длина будет больше !???
Гениально!
Цитата:

Почему в результате 2-го трэйса выводит 91.9 я еще могу понять.
Вообще, задание ширины и высоты - это, как бы, не задание ширины и высоты, а присвоение значения scaleX и scaleY. Попробуй переотпределить сеттеры и геттеры ширины/высоты для нужного объекта, и исползовать там целые числа

gloomyBrain 12.09.2011 12:51

Цитата:

если повернуть квадрат на 45 градусов его длина будет больше !???
У квадрата есть длина ?!?!?!

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

ЗлОй ПрОграММер 12.09.2011 23:22

1. не длина а ширина =)
2. всё же представьте квадрат повёрнутый на 45 градусов, и измерьте расстояние от крайне левого угла до крайне правого по оси X
3. представьте обычный квадрат(поворот на 0 градусов) и сделайте тоже самое
4. сравните результаты

объясняю канеш хрен пойми как, но идея сама вроде правильная

wolhw 13.09.2011 00:04

Цитата:

Сообщение от TanaTiX (Сообщение 1030602)
Почему в результате 2-го трэйса выводит 91.9 я еще могу понять. А вот почему последний выдает значение, отличное от 100 - не понятно.

скорее всего сетер задает видимую(реальную) ширину/высоту , а герет выдает ширину/высоту самого обьекта(неважно на скольно градусов он повернут)
или наоборот))

samana 13.09.2011 00:51

Ну да, получается что выдаётся ширина относительно сцены так сказать:

[IMG]http://i.***********/i7/9be1d413cae49e4e45682b57fa988971/1-2-407/40740967/heigth.jpg[/IMG]

wolhw 13.09.2011 00:55

с етим ясно, но что делает сеттер остается загадкой для меня
Код AS3:

trace("orig-->>"+mc.width,mc.height);
 
                mc.rotation=45;
                mc.width=1;
                mc.height=100;
                trace("rezz-->>"+mc.width,mc.height);

результат:
Код:

orig-->>100 100
rezz-->>85.6 85.6

на екране прямоугольник width!=1;
если же сделать height=1 а width=100 тогда на екране полоска в 1 пиксель(height==1) повернута на 45 градусов, а если поменять местами
Код AS3:

mc.height=100;
mc.width=1;

тогда width==1;

TanaTiX 13.09.2011 20:02

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

mc.alternativeWidth+=10;

Данный код должен получить значение ширины (не зависимо от значения поворота - getter) и присвоить новое значение (опять же в системе локальных координат - setter)
Собственно вся суть вопроса сводится к способу получения реальных размеров объекта. Заранее спасибо.

wolhw 13.09.2011 21:08

Цитата:

Сообщение от TanaTiX (Сообщение 1031176)
Отсюда возникает вопрос - как я могу определить реальную ширину объекта и потом поменять полученное значение, на то, которое меня интересует?
К примеру:
Код AS3:

mc.alternativeWidth+=10;

Данный код должен получить значение ширины (не зависимо от значения поворота - getter) и присвоить новое значение (опять же в системе локальных координат - setter)
Собственно вся суть вопроса сводится к способу получения реальных размеров объекта. Заранее спасибо.

может так:
Код AS3:

publiv function set alternativeWidth(num:Number):void
{
var rot:Number=mc.rotation;
mc.rotation=0;
mc.width=num;
mc.rotation=rot;
}

?

Добавлено через 1 минуту
ну тоисть разворачивать каждый рас перед трансформацыей

TanaTiX 13.09.2011 21:22

Тоже об этом думал, но больно уж криво выходит... Может есть альтернатива?

-De- 13.09.2011 23:07

Познать дзен и понять, что не бывает ширины и высоты, а есть только матрица трансформации?
А точнее - что по вашему ширина обьекта и зачем она вам?

silin 13.09.2011 23:09

>>но больно уж криво выходит...
я бы посмотрел такой еще вариант:
рабочий контент кладем в спрайт-контейнер, rotation транслируем контенту, а width\height применяем к контейнеру, никаких граблей
правда кроме оверрайда rotation, придется и всякое такое (addChild, removeChild, etc) переписывать, но это уже от конкретной задачки зависит

TanaTiX 14.09.2011 00:12

Значит либо костыль (вариант с еще одной вложенностью по сути тоже не есть тру), либо дзен. К сожалению дзен в данной ситуации невозможен...
Всем спасибо.


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

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