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

AlliAS 01.08.2011 04:37

Вращение круга мышью с регулируемой скоростью
 
Здравствуйте.

Необходимо реализовать реалистичное вращение круга мышью, причем так, чтобы "тугость" (скорость) этого вращения можно было регулировать, и чтобы вращение происходило в направлении движения мыши.
Вот код который есть сейчас, но он не позволяет регулировать скорость, да и вращение происходит слишком резко

Код AS3:

package
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.geom.Matrix;
 
        public class Spinner extends Sprite
        {
                static public const STAGE_WIDTH:int = 800;
                static public const STAGE_HEIGHT:int = 600;
 
                private var $mover:Sprite;
                private var $lastX:Number;
                private var $lastY:Number;
 
                public function Spinner()
                {
                        $mover = new Sprite();
 
                        var mx:Matrix = new Matrix();
                        mx.createGradientBox(STAGE_HEIGHT / 2, STAGE_HEIGHT / 2, Math.PI / 2);
                        $mover.graphics.beginGradientFill('linear', [0xFF0000, 0x0000FF], [1, 1], [0, 255], mx);
                        $mover.graphics.drawCircle(0, 0, STAGE_HEIGHT / 2);
                        $mover.graphics.endFill();
 
                        $mover.x = STAGE_WIDTH / 2;
                        $mover.y = STAGE_HEIGHT / 2;
                        this.addChild($mover);
 
                        this.addEventListener(Event.ADDED_TO_STAGE, thisAddedToStageHandler);                       
                }
 
                private function thisAddedToStageHandler(e:Event):void
                {
                        this.removeEventListener(Event.ADDED_TO_STAGE, thisAddedToStageHandler);
                        stage.addEventListener(MouseEvent.MOUSE_DOWN, moverMouseDownHandler);
                        stage.addEventListener(MouseEvent.MOUSE_UP, moverMouseUpHandler);
                }
 
                private function moverMouseDownHandler(e:MouseEvent):void
                {
                        $mover.addEventListener(MouseEvent.MOUSE_MOVE, moverMouseMoveHandler);
                }
 
                private function moverMouseUpHandler(e:MouseEvent):void
                {
                        $mover.removeEventListener(MouseEvent.MOUSE_MOVE, moverMouseMoveHandler);
                }
 
                private function moverMouseMoveHandler(e:MouseEvent):void
                {
                        var thisX:Number = stage.mouseX - $mover.x;
                        var thisY:Number = stage.mouseY - $mover.y;
                        $mover.rotation = Math.atan2($lastY - thisY, $lastX - thisX) * 180 / Math.PI;
                        $lastX = thisX;
                        $lastY = thisY;
                }
 
        }
 
}

Подскажите что нужно добавить.

alatar 01.08.2011 11:57

Код AS3:

private var speed:Number = .5;
...
$mover.rotation = (Math.atan2($lastY - thisY, $lastX - thisX) * 180 / Math.PI)*speed;


AlliAS 01.08.2011 13:45

Спасибо. Работает. Правда если скорость меньше 1, то круг не прокручивается полностью, что можно с этим сделать?

alatar 01.08.2011 13:56

Упс.
Код AS3:

private var step:Number = .5; //шаг в градусах +/-
...
$mover.rotation += step;

Если нужны ограничения, добавить проверки

AlliAS 01.08.2011 14:17

Увы, не дошло (

Код AS3:

private var step:Number = .5; //шаг в градусах +/-
...
var thisX:Number = stage.mouseX - $mover.x;
                        var thisY:Number = stage.mouseY - $mover.y;
                        $mover.rotation = (Math.atan2(thisY, thisX) * 180 / Math.PI) * $speed;
                        $mover.rotation += step;

Так нужно?

alatar 01.08.2011 14:43

вот это:
Код AS3:

$mover.rotation = (Math.atan2(thisY, thisX) * 180 / Math.PI) * $speed;

не нужно.

-De- 01.08.2011 14:53

Там всё не оч. весело %)
По-моему шаг считается чуток не так (лучше не предыдущее положение мыши запоминать, а предыдущий угол). И если шаг по модулю больше пи, то добавлять/отнимать 2*пи, чтоб стал меньше пи по модулю. А то переход между пи и -пи - не весёлый.

AlliAS 01.08.2011 15:58

Да, шаг использовать удобнее, только теперь возник вопрос как определить направление в котором движется курсор мыши (по часовой или против часовой стрелки), чтобы знать прибавлять ли шаг или отнимать?

GBee 01.08.2011 16:38

Цитата:

Да, шаг использовать удобнее, только теперь возник вопрос как определить направление в котором движется курсор мыши (по часовой или против часовой стрелки), чтобы знать прибавлять ли шаг или отнимать?
Обычно смотрят только дельту по Y. Или по Х

Пример

-De- 01.08.2011 21:48

Код AS3:

package
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.geom.Matrix;
 
        public class Main extends Sprite
        {
                static public const STAGE_WIDTH:int = 800;
                static public const STAGE_HEIGHT:int = 600;
 
                private var $mover:Sprite;
                private var prevPhi:Number;
                private var $rotation:Number;
 
                public function Main()
                {
                        $mover = new Sprite();
 
                        var mx:Matrix = new Matrix();
                        mx.createGradientBox(STAGE_HEIGHT / 2, STAGE_HEIGHT / 2, Math.PI / 2);
                        $mover.graphics.beginGradientFill('linear', [0xFF0000, 0x0000FF], [1, 1], [0, 255], mx);
                        $mover.graphics.drawCircle(0, 0, STAGE_HEIGHT / 2);
                        $mover.graphics.endFill();
 
                        $mover.x = STAGE_WIDTH / 2;
                        $mover.y = STAGE_HEIGHT / 2;
                        this.addChild($mover);
 
                        this.addEventListener(Event.ADDED_TO_STAGE, thisAddedToStageHandler);                       
                }
 
                private function thisAddedToStageHandler(e:Event):void
                {
                        this.removeEventListener(Event.ADDED_TO_STAGE, thisAddedToStageHandler);
                        stage.addEventListener(MouseEvent.MOUSE_DOWN, moverMouseDownHandler);
                        stage.addEventListener(MouseEvent.MOUSE_UP, moverMouseUpHandler);
                }
 
                private function moverMouseDownHandler(e:MouseEvent):void
                {
                        prevPhi = Math.atan2(stage.mouseY - $mover.y, stage.mouseX - $mover.x);
                        $rotation = $mover.rotation;
                        $mover.addEventListener(MouseEvent.MOUSE_MOVE, moverMouseMoveHandler);
                }
 
                private function moverMouseUpHandler(e:MouseEvent):void
                {
                        $mover.removeEventListener(MouseEvent.MOUSE_MOVE, moverMouseMoveHandler);
                }
 
                private function moverMouseMoveHandler(e:MouseEvent):void
                {
                        const speed:Number = 0.3;
                        var phi:Number = Math.atan2(stage.mouseY - $mover.y, stage.mouseX - $mover.x);
                        var step:Number = phi - prevPhi;
                        if (step > Math.PI)
                                step -= 2 * Math.PI;
                        else if (step < -Math.PI)
                                step += 2 * Math.PI;
 
                        //тут можно делать с шагом что угодно
                        step *= speed;
 
                        $rotation += step * 180 / Math.PI;
 
                        prevPhi = phi;
 
                        $mover.rotation = $rotation;
                }
 
        }
 
}



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

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