PDA

Просмотр полной версии : Вращение вокруг оси.


Reijii
19.07.2006, 14:11
Доброго дня всем,

Помогите с проблемой пожалуйста, не получается повернуть загружаемую картинку относительно ее центра (таким же способом, все вращалось нормально во Flash 8 / AS 2), вернее как сейчас оно вращает, но координаты сбиваются.

<mx:Rotation /> который есть в MXML и которому можно задать OriginX, OriginY, не хочет вращать объекты у которых нет метода move :(

Вот код который вставляю в функцию loadComplete на событие Event.COMPLETE, для Loader.


var data:BitmapData = new BitmapData(evt.target.loader.content.bitmapData.width, evt.target.loader.content.bitmapData.height, true, 0x00FFFFFF);
//
data.draw(evt.target.loader.content.bitmapData, null, null, null, null, true);
//
var bitmap:Bitmap = new Bitmap(data, "auto", true);
//
currentTarget.target.addChild(bitmap);
//
var scaleDX:Number = 1;
var scaleDY:Number = 1;
//
if (width != undefined && height != undefined)
{
scaleDX = width / data.width;;
scaleDY = height / data.height;
}
//
bitmap.scaleX = scaleDX;
bitmap.scaleY = scaleDY;
//
if (x != undefined && y != undefined)
{
bitmap.x = x - (data.width * scaleDX) / 2;
bitmap.y = y - (data.height * scaleDY) / 2;
}
//
Bitmap.prototype.rot = function (angle:Number, dx:Number, dy:Number):void
{
var radAngle = angle * (Math.PI / 180);
var x = Math.cos (radAngle) * dx - Math.sin (radAngle) * dy;
var y = Math.sin (radAngle) * dx + Math.cos (radAngle) * dy;
this.rotation = angle;
trace(dx, x, dy, y, dx - x, dy - y);
this.x = dx - x;
this.y = dy - y;
};
//
if (rotation != undefined)
{
Object(bitmap).rot(rotation, bitmap.x + data.width * scaleDX / 2, bitmap.y + data.height * scaleDY / 2);
}

silin
19.07.2006, 16:24
не въехал, что там у тебя в коде происходит ( и какое это имеет отношение к вопросу..)
имхо, все просто: кладем битмап в спрайт со смещением (чтоб центр картинки попал в {x:0,y:0} спрайта) и поворачиваем уже его..
function loadComplete(e:Event):void{
var b:Bitmap=Bitmap(e.target.content);
var s:Sprite=new Sprite();
s.addChild(b);
b.x=-b.width/2;
b.y=-b.height/2;
s.rotation=45;
addChild(s);
}

Reijii
19.07.2006, 16:44
Происходит следующеее
изменяется размер подгруженного изображения под нужное, потом ставится куда нужно, потом вращается.

самое интерестное что я сделал только что так (currentTarget - Объект содержащий данные о нужных x,y, width, height, target (куда грузим) :

private function loadComplete(evt:Event):void
{
//
var matrix:Matrix = new Matrix();
var data:BitmapData = new BitmapData( evt.target.loader.content.bitmapData.width, evt.target.loader.content.bitmapData.height, true, 0x00000000 );
//
var scaleDX:Number = 1;
var scaleDY:Number = 1;
//
if (currentTarget.w != undefined && currentTarget.h != undefined)
{
scaleDX = currentTarget.w / data.width;;
scaleDY = currentTarget.h / data.height;
}
//
matrix.scale(scaleDX, scaleDY);
//
data.draw(evt.target.loader.content.bitmapData, matrix, null, null, null, true);
//
var bitmap:Bitmap = new Bitmap(data, "auto", true);
currentTarget.target.addChild(bitmap);
//
if (currentTarget.x != undefined && currentTarget.y != undefined)
{
bitmap.x = currentTarget.x - (data.width * scaleDX) / 2;
bitmap.y = currentTarget.y - (data.height * scaleDY) / 2;
}
//
Bitmap.prototype.rot = function (angle:Number, dx:Number, dy:Number):void
{
this.rotation = angle;
};
//
if (currentTarget.rotation != undefined)
{
Object(bitmap).rot( parseInt(currentTarget.rotation), bitmap.x + data.width * scaleDX / 2, bitmap.y + data.height * scaleDY / 2 );
}
//
}


и все заработало :(

silin
19.07.2006, 18:00
затейливо..
по мне так слишком: имхо дешевле подвигать/повращать Bitmap в классе, расширяющем Sprite, чем заморачиваться трансформацией BitmapData:
private function loadComplete(e:Event):void{
var b:Bitmap=Bitmap(e.target.content);
var s:MySprite=new MySprite(b,currentTarget);
}
///////////////////
class MySprite extends Sprite{
public function MySprite(b:Bitmap,ct:Object){
b.width=ct.w;
b.height=ct.h;
b.x=-b.width/2;
b.y=-b.height/2;
rotation=ct.rotation;
x=ct.x;
y=ct.y;
addChild(b);
ct.target.addChild(this);
}
}