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

Inet_PC 08.02.2009 01:08

Поворот спрайта мышью
 
Нужно по нажатию на угол спрайта и удерживании мыши поварачивать спрайт в зависимости от текущей позиции мыши. Ну в общем как в фотошопе при FreeTransform картинка поворачиваеться так и мне нужно. Точка поворота цент (хотябы) лучшеб чтоб любая:)
Вот...
Код AS3:

public function AObject()
{       
        aRBox.addChild(aRPicture);
 
        addChild(aSprite);//спрайт который нужно поворачивать
        addChild(aRBox);//кнопочка в углу спрайта
 
        Active = isActive;
 
        aRBox.addEventListener(MouseEvent.MOUSE_DOWN, goRotate);
 
 
}
private function goRotate(event:MouseEvent):void
{
        isRotating = true;
 
        stage.addEventListener(MouseEvent.MOUSE_UP  , stopRotate);
        stage.addEventListener(MouseEvent.MOUSE_MOVE, onRotate  );
}
private function onRotate(event:MouseEvent):void
{
        if (!isRotating) {return}
 
        var midX:Number = aSprite.x + (aSprite.width / 2);
        var midY:Number = aSprite.y + (aSprite.height / 2);
 
        var dx:Number = stage.mouseX - aSprite.x;
        var dy:Number = stage.mouseY - aSprite.y;
 
        var Angle : Number = Math.atan2(dy, dx);
        Angle = (Angle*180/Math.PI);
        trace(Angle);
 
        rotateAround(midX, midY, Angle);
        event.updateAfterEvent();
}
private function stopRotate(event:MouseEvent):void
{
        isRotating = false;
 
        stage.removeEventListener(MouseEvent.MOUSE_UP  , stopRotate);
        stage.removeEventListener(MouseEvent.MOUSE_MOVE, onRotate  );
}
protected function rotateAround(offsetX:Number,offsetY:Number,toDegrees:Number):void
{
        var relDegrees:Number = toDegrees - (this.rotation % 360);
        var relRadians:Number = Math.PI * relDegrees / 180;
        var M:Matrix = new Matrix(1, 0, 0, 1, 0, 0);
        M.rotate(relRadians);
        var AC:Point = new Point(offsetX, offsetY);
        AC = this.localToGlobal(AC);
        AC = this.parent.globalToLocal(AC);
        var AB:Point = new Point(this.x, this.y);
        var CB:Point = AB.subtract(AC);
        CB = M.transformPoint(CB);
        AB = AC.add(CB);
        trace(this.rotation);
        this.rotation = toDegrees;
        this.x = AB.x;
        this.y = AB.y;
}

Плиз помогите уже дня три маюся:wacko:а она переворачиваеться как хочет а не как мне надо

Добавлено через 6 минут
Или вот еще функция для поворота
Код AS3:

function rotateAroundCenter (ob:*, angleDegrees, point:Point) 
{
        var m:Matrix=ob.transform.matrix;
        m.tx -= point.x;
        m.ty -= point.y;
        m.rotate (angleDegrees*(Math.PI/180));
        m.tx += point.x;
        m.ty += point.y;
        ob.transform.matrix=m;
}

Но с ней тоже ниче не выходит. У мну складывается впечатление что я неправильно нахожу угол... но чет все перепробовал и иинет перерыл. Хелп ми плиз

ramshteks 08.02.2009 01:38

ну вникать мне лень, до минимума сведите код, до такого на каком вы можете предсказать что будет дальше, а уже потом развивайте код. Вполне возможно все дело в функции atan, я в свое время писал нечто похожее, суть в том что он не найдет именно тот угол который вы ищите, я так думаю, проследите верно ли находит. Возможно необходимо сделать поправку в зависимости от того где находится курсор, или что там у вас.

так вот как я находил, по теореме синусов, потом уже понял что мой подход нерационален, смотрите часть вделенную красным

Цитата:

public static function GetDistance(x_1:Number,y_1:Number,x_2:Number,y_2:Number):Number {
return Math.sqrt(Math.pow(x_1 - x_2,2) + Math.pow(y_1 - y_2,2));
}
public static function GetAngle(x_1:Number,y_1:Number,x_2:Number,y_2:Number):Number {
var angle:Number=Math.asin((y_1 - y_2)/GetDistance(x_1,y_1,x_2,y_2))*IN_DEG;
if (x_1<x_2) {
angle=180-angle;
} else if (y_1<y_2) {
angle=360+angle;
}

return angle;
}
еще возможно стоит запоминать предыдущий угол на который поворачивали и прежде чем применять матрицу трансформации делать поправку.


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

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