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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 21.03.2011, 14:55
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 1  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
По умолчанию поворот картинки по 90 градусам

Есть контейнер, в нем постоянно находится только 1 чайлд - картинка. Картинка постоянно позиционируется по центру контейнера, когда с ней производят какие нибудь манипуляции. Есть задача, нужно по нажатию кнопки поворачивать эту саму картинку на += 90 градусов.

Вопрос такой, можно ли как то воспользоваться матрицами или еще чем, чтобы свернуть точку кручения в центр, тогда бы вопросов не было. Покажите пожалуйста пример, если можно. П.с. конструкция должна остаться такой КОнетйнер - внутри крутимая картинка. Координаты контейнера и применение к нему матриц недопустимо. Тоесть работать можно только с 1 чайлд-картинкой. И да пока не забыл, после применения кручения, нужно вернуть координату x и y в левый верхний угол соотв.

Если матрицами воспользоваться сложно, или просто не получится в данной задаче, можно обойтись формулами, подстаривать координаты после поворота сразу в зависимости от ширины и высоты, создавая иллюзию кручения через центр. Поскольку с формулами у меня тоже проблемы, если кто делал - покажите пожалуйста пример. Спасибо

Старый 21.03.2011, 15:17
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 2  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Матрицами это делается в три хода: сдвинул > повернул > поставил на место
__________________
Поймай яблоко 2!

Старый 21.03.2011, 15:23
Александр Мостовой вне форума Посмотреть профиль Отправить личное сообщение для Александр Мостовой Посетить домашнюю страницу Александр Мостовой Найти все сообщения от Александр Мостовой
  № 3  
Ответить с цитированием
Александр Мостовой
 
Аватар для Александр Мостовой

Регистрация: Sep 2001
Адрес: Харьков
Сообщений: 305
Отправить сообщение для Александр Мостовой с помощью ICQ Отправить сообщение для Александр Мостовой с помощью Skype™
Да

http://help.adobe.com/en_US/FlashPla...ansformer.html

методы
rotateAroundExternalPoint
rotateAroundInternalPoint

Добавлено через 4 минуты
Поставить конейтер на начало его элементов можно при помощи getRect или getBounds и соответственно localToGlobal методов дисплэйобжекта
__________________
...

Старый 21.03.2011, 16:32
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 4  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
@Александр Мостовой

А можете показать примерчик поворотов?

Допустим контейнер есть _cont , а картинка внутри _image . А то мне несовсем понятно как должны работать методы rotateAround...*

Старый 21.03.2011, 16:42
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 5  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Код AS3:
package ru.wolsh.display.utils 
{
    import flash.display.DisplayObject;
/* * * * * * * * * *
*                  *
*  @author wolsh   *
*                  *
*  v. 21.10.2010   *
*                  *
\* * * * * * * * * */
    public function centerRotate (object:DisplayObject, angle:Number) : void
    {
        var rad:Number = Math.PI / 180;
        // return object to default
        var currentAngle:Number = object.rotation * rad;
        object.rotation = 0;
        var oX:Number = object.width  / 2;
        var oY:Number = object.height / 2;
        var oS:Number = Math.sin(currentAngle);
        var oC:Number = 1 - Math.cos(currentAngle);
        object.x -= oX * oC + oY * oS;
        object.y -= oY * oC - oX * oS;
        // rotate object
        var r:Number = angle * rad;
        var s:Number = Math.sin(r);
        var c:Number = 1 - Math.cos(r);
        object.rotation = angle;
        object.x += oX * c + oY * s;
        object.y += oY * c - oX * s;
    }
 
}
__________________
Reality.getBounds(this);


Последний раз редактировалось Wolsh; 21.03.2011 в 23:47.
Старый 21.03.2011, 16:59
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 6  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Wolsh спасибо большое. буду разбираться

Добавлено через 44 минуты
Wolsh что то косячит немного, или я не верно делаю

Код AS3:
function click(e:Event) {
 
centerRotate ( sprite , n )
 
n += 90
 
}
При первом повороте нормально, при втором уже нет, а при третьем вообще улетает неясно куда

Добавлено через 2 часа 9 минут
Решено. Вот аналог вашего класса
Код AS3:
private var _startPoint:Point = new Point(0,0);
public static function set externalPoint(p:Point) {
  _startPoint = p; // если крутим по центру передаем суда половину ширины и высоты
} 
public static function rotateUserPoint (obj:DisplayObject , angle:int):void 
		{
 
			obj.transform.matrix = new Matrix();
 
			var mat:Matrix = obj.transform.matrix;
 
			MatrixTransformer.rotateAroundInternalPoint(mat, _startPoint.x, _startPoint.y, angle);
 
			obj.transform.matrix = mat;
 
		}
Пример
Код AS3:
var n:int = 0;
RotationClass.externalPoint = new Point(sprite.width/2, sprite.height/2);
sprite.addEventListener(Event.ENTER_FRAME , go)
 
function go(e:Event) {
    RotationClass.rotateUserPoint ( e.currentTarget , n )
    n += 2;
}

Старый 21.03.2011, 23:46
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 7  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
А, блин) Не с того проекта дернул класс, сорри. Там не было возврата в дефолт, это было в отдельном методе)).
Исправил код наверху на универсальный. Ну или, если нравятся матрицы, используйте их.

По Вашему коду - зачем статический метод для установки точки? Не лучше ли передавать точку в метод поворота, ведь она индивидуальна для каждого объекта, который Вы будете вращать? И почему set externalPoint(), если вращение методом rotateAroundInternalPoint() ? "Чтоб никто не догадался"?
__________________
Reality.getBounds(this);


Последний раз редактировалось Wolsh; 21.03.2011 в 23:54.
Старый 21.03.2011, 23:59
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 8  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Wolsh ага чтоб никто не догадался)) Вопрос такой раз уж начал я делать все матрицами, как вернуть изначальную матрицу? Тоесть была матрица (1,0,0,1,100,100) допустим и угол был 0 градусов . Теперь я хочу повернуть объект на 90 градусов при этом после поворота сделать так, что бы матрица на объекте была такой, что поворот = 0, х и y координата = верхней левой точке?. Спасибо

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
х и y координата всегда в верхней левой точке, выражаясь вашим языком.
То есть чтобы изменилось положение НАЧАЛА системы координат внутри спрайта относительно его содержимого (я правильно понял о чем речь?) надо переместить это содержимое в новые координаты. В случае детишек все решаемо математикой, но если это собственная графика спрайта (нарисованная в нем Графиксом), ее только перерисовывать.
__________________
Reality.getBounds(this);

Старый 22.03.2011, 00:10
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 10  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Wolsh я поясню. Вот был объект ( не нарисованный , а битмап) и стоял в 100-100. Я его повернул на 90 градусов. проверяю координаты пишет что x и y находятся теперь в правом верхнем углу, и это логично ведь прошел поворот и объект сменил матрицу. Вот я и спрашиваю как сделать, чтобы поворот прошел, но х и у снова находились в левом верхнем углу. Спасибо

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

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

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


 


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


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