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

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

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

Регистрация: Mar 2003
Адрес: moscow
Сообщений: 102
Отправить сообщение для uglan с помощью ICQ Отправить сообщение для uglan с помощью Skype™
Tools Вращение относительно центра с draw()

Привет!
Есть проблема с поворотом объекта относительно центра при использовании draw() c BitmapData.
В первом случае спрайт в библиотеке имеет регистрационную точку 0,0; Рисуется впринципе нормально, но на сцену переносится в точку x,y(создается при клике) без какого либо смещения


Если присвоить смещение bitmap относительно этой точки все станет как надо, но при повороте такая конструкция повернется относительно опять таки своей регистрационной точки а не точки назначения:


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

Смещение по матрице внутри BitmapData ничего не дает. Вот код:

Код AS3:
var tmp:RockSpr = new RockSpr();
var bd:BitmapData = new BitmapData(tmp.width, tmp.height);
var bm:Bitmap = new Bitmap(bd);
bm.x = e.stageX;
bm.y = e.stageY;
bm.rotation = 45;
addChild(bm);
Как объединить два этих подхода чтобы получилось правильная отрисовка и поворот?
Спасибо!
__________________
uglan

Старый 12.10.2012, 11:40
Волгоградец вне форума Посмотреть профиль Отправить личное сообщение для Волгоградец Найти все сообщения от Волгоградец
  № 2  
Ответить с цитированием
Волгоградец
 
Аватар для Волгоградец

блогер
Регистрация: Sep 2007
Адрес: Гамбург
Сообщений: 1,648
Записей в блоге: 12
Для того, чтобы отрисовать спрайт с поворотом, нужна битмапдата, большая по размеру, чем спрайт. Но я вижу, что ты поворачиваешь битмап и это у него точка регистрации находится в координатах 0, 0. Самый простой вариант - вложить эту битмапу в какой-нибудь контейнер со смещением и поворачивать этот контейнер. Правильный вариант - заюзать матрицу, что-то типа такого:

Код AS3:
var bd:BitmapData = new BitmapData(200, 50, false, 0x000000);
var bm:Bitmap = new Bitmap(bd);
 
var m:Matrix = new Matrix();
m.translate(-bd.width * 0.5, - bd.height * 0.5);
m.rotate(Math.PI / 4);
m.translate(e.stageX, e.stageY);
bm.transform.matrix = m;
 
addChild(bm);

Старый 12.10.2012, 12:02
Isfet вне форума Посмотреть профиль Отправить личное сообщение для Isfet Найти все сообщения от Isfet
  № 3  
Ответить с цитированием
Isfet

Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
Цитата:
вложить эту битмапу в какой-нибудь контейнер со смещением и поворачивать этот контейнер
Код AS3:
import flash.display.SpreadMethod;
import flash.display.Sprite;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.MouseEvent;
 
var spr:Sprite = new Sprite();
var tmp:RockSpr = new RockSpr();
var bd:BitmapData = new BitmapData(tmp.width, tmp.height);
var bm:Bitmap = new Bitmap(bd);
bd.draw(tmp);
bm.x = -bm.width*0.5;
bm.y = -bm.height*0.5;
spr.x = 100;
spr.y = 100;
spr.addChild(bm);
 
addChild(spr);
function rotatiOnByClick(e:MouseEvent){
	spr.rotation += 10;
}
spr.addEventListener(MouseEvent.CLICK,rotatiOnByClick);

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Сообщение от Волгоградец Посмотреть сообщение
Для того, чтобы отрисовать спрайт с поворотом, нужна битмапдата, большая по размеру, чем спрайт. Но я вижу, что ты поворачиваешь битмап и это у него точка регистрации находится в координатах 0, 0. Самый простой вариант - вложить эту битмапу в какой-нибудь контейнер со смещением и поворачивать этот контейнер. Правильный вариант - заюзать матрицу, что-то типа такого:

Код AS3:
var bd:BitmapData = new BitmapData(200, 50, false, 0x000000);
var bm:Bitmap = new Bitmap(bd);
 
var m:Matrix = new Matrix();
m.translate(-bd.width * 0.5, - bd.height * 0.5);
m.rotate(Math.PI / 4);
m.translate(e.stageX, e.stageY);
bm.transform.matrix = m;
 
addChild(bm);
Создание матрицы в этом коде - излишество. Не обязательно это делать, так как у спрайта уже есть матрица и можно использовать ее. Т.е. при врисовке спрайта, содержащего в себе растровую картинку, достаточно добавить в качестве параметра draw матрицу, автоматически созданную для спрайта.
Код AS3:
bitmapData.draw(sprite, sprite.transform.matrix);
Она уже будет содержать необходимые настройки. Если спрайт был повернут, то и ротейт матрицы будет соответствующим

Старый 12.10.2012, 13:01
Волгоградец вне форума Посмотреть профиль Отправить личное сообщение для Волгоградец Найти все сообщения от Волгоградец
  № 5  
Ответить с цитированием
Волгоградец
 
Аватар для Волгоградец

блогер
Регистрация: Sep 2007
Адрес: Гамбург
Сообщений: 1,648
Записей в блоге: 12
А ты в курсе, что когда ты вызываешь
Код AS3:
sprite.transform.matrix
ты каждый раз создаешь новую матрицу?
И к тому же, как использовать готовую, если это не та матрица, которая нужна...

Старый 12.10.2012, 15:55
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 6  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Сообщение от Волгоградец Посмотреть сообщение
А ты в курсе, что когда ты вызываешь
Код AS3:
sprite.transform.matrix
ты каждый раз создаешь новую матрицу?
да в курсе, ничего страшного

можно, положить картинку в спрайт, и все будет проще

Старый 12.10.2012, 23:20
uglan вне форума Посмотреть профиль Отправить личное сообщение для uglan Посетить домашнюю страницу uglan Найти все сообщения от uglan
  № 7  
Ответить с цитированием
uglan

Регистрация: Mar 2003
Адрес: moscow
Сообщений: 102
Отправить сообщение для uglan с помощью ICQ Отправить сообщение для uglan с помощью Skype™
Цитата:
Сообщение от Волгоградец Посмотреть сообщение
Для того, чтобы отрисовать спрайт с поворотом, нужна битмапдата, большая по размеру, чем спрайт. Но я вижу, что ты поворачиваешь битмап и это у него точка регистрации находится в координатах 0, 0. Самый простой вариант - вложить эту битмапу в какой-нибудь контейнер со смещением и поворачивать этот контейнер. Правильный вариант - заюзать матрицу, что-то типа такого:

Код AS3:
var bd:BitmapData = new BitmapData(200, 50, false, 0x000000);
var bm:Bitmap = new Bitmap(bd);
 
var m:Matrix = new Matrix();
m.translate(-bd.width * 0.5, - bd.height * 0.5);
m.rotate(Math.PI / 4);
m.translate(e.stageX, e.stageY);
bm.transform.matrix = m;
 
addChild(bm);
Что-то все равно не так... Картинка так и крутится вокруг регистрационной точки. И какие-то артефакты добавились...

Добавлено через 6 минут
Цитата:
Сообщение от Isfet Посмотреть сообщение
Код AS3:
import flash.display.SpreadMethod;
import flash.display.Sprite;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.MouseEvent;
 
var spr:Sprite = new Sprite();
var tmp:RockSpr = new RockSpr();
var bd:BitmapData = new BitmapData(tmp.width, tmp.height);
var bm:Bitmap = new Bitmap(bd);
bd.draw(tmp);
bm.x = -bm.width*0.5;
bm.y = -bm.height*0.5;
spr.x = 100;
spr.y = 100;
spr.addChild(bm);
 
addChild(spr);
function rotatiOnByClick(e:MouseEvent){
	spr.rotation += 10;
}
spr.addEventListener(MouseEvent.CLICK,rotatiOnByClick);
Этот принцип работает, спасибо! Но я сознательно пытался не пользоваться контейнерами вроде спрайтов или мувиклипов, т.к. объектов предполагается достаточно большое количество, а эти структуры в больших объемах очень сильно влияют на производительность. Есть какой-нибудь аналогичный способ средствами битмап?
__________________
uglan

Старый 14.10.2012, 12:49
gagaga вне форума Посмотреть профиль Отправить личное сообщение для gagaga Найти все сообщения от gagaga
  № 8  
Ответить с цитированием
gagaga
[+1 22.04.13]
[+1 06.03.13]

Регистрация: Apr 2012
Сообщений: 239
самый правильный способ - использование матрицы преобразования. Все остальные способы более медленные... правильно, что не используете контейнеры, они только тормозят

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

Теги
bitmapdata , draw , Registration Point
Опции темы
Опции просмотра

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

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


 


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


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