Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Вращение относительно центра с draw() (http://www.flasher.ru/forum/showthread.php?t=185424)

uglan 12.10.2012 11:15

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

Если присвоить смещение bitmap относительно этой точки все станет как надо, но при повороте такая конструкция повернется относительно опять таки своей регистрационной точки а не точки назначения:
http://support.kurchenko.ru/2.png

Если сместить оригинальный спрайт относительно точки регистрации в центр то поворот и расположение(без принудительного смещения) заработают как надо, но тогда draw будет рисовать только часть картинки.
http://support.kurchenko.ru/3.png
Смещение по матрице внутри 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);

Как объединить два этих подхода чтобы получилось правильная отрисовка и поворот?
Спасибо!

Волгоградец 12.10.2012 11:40

Для того, чтобы отрисовать спрайт с поворотом, нужна битмапдата, большая по размеру, чем спрайт. Но я вижу, что ты поворачиваешь битмап и это у него точка регистрации находится в координатах 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);


Isfet 12.10.2012 12:02

Цитата:

вложить эту битмапу в какой-нибудь контейнер со смещением и поворачивать этот контейнер
Код 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);


caseyryan 12.10.2012 12:31

Цитата:

Сообщение от Волгоградец (Сообщение 1099593)
Для того, чтобы отрисовать спрайт с поворотом, нужна битмапдата, большая по размеру, чем спрайт. Но я вижу, что ты поворачиваешь битмап и это у него точка регистрации находится в координатах 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

А ты в курсе, что когда ты вызываешь
Код AS3:

sprite.transform.matrix

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

caseyryan 12.10.2012 15:55

Цитата:

Сообщение от Волгоградец (Сообщение 1099613)
А ты в курсе, что когда ты вызываешь
Код AS3:

sprite.transform.matrix

ты каждый раз создаешь новую матрицу?

да в курсе, ничего страшного

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

uglan 12.10.2012 23:20

Цитата:

Сообщение от Волгоградец (Сообщение 1099593)
Для того, чтобы отрисовать спрайт с поворотом, нужна битмапдата, большая по размеру, чем спрайт. Но я вижу, что ты поворачиваешь битмап и это у него точка регистрации находится в координатах 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);


Что-то все равно не так... http://support.kurchenko.ru/4.png Картинка так и крутится вокруг регистрационной точки. И какие-то артефакты добавились...

Добавлено через 6 минут
Цитата:

Сообщение от Isfet (Сообщение 1099595)
Код 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);


Этот принцип работает, спасибо! Но я сознательно пытался не пользоваться контейнерами вроде спрайтов или мувиклипов, т.к. объектов предполагается достаточно большое количество, а эти структуры в больших объемах очень сильно влияют на производительность. Есть какой-нибудь аналогичный способ средствами битмап?

gagaga 14.10.2012 12:49

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


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

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