|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Aug 2007
Сообщений: 168
|
Вращение круга мышью с регулируемой скоростью
Здравствуйте.
Необходимо реализовать реалистичное вращение круга мышью, причем так, чтобы "тугость" (скорость) этого вращения можно было регулировать, и чтобы вращение происходило в направлении движения мыши. Вот код который есть сейчас, но он не позволяет регулировать скорость, да и вращение происходит слишком резко 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; } } } |
|
|||||
Регистрация: Aug 2007
Сообщений: 168
|
Спасибо. Работает. Правда если скорость меньше 1, то круг не прокручивается полностью, что можно с этим сделать?
|
|
|||||
Регистрация: Aug 2007
Сообщений: 168
|
Увы, не дошло (
Так нужно? |
|
|||||
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Там всё не оч. весело %)
По-моему шаг считается чуток не так (лучше не предыдущее положение мыши запоминать, а предыдущий угол). И если шаг по модулю больше пи, то добавлять/отнимать 2*пи, чтоб стал меньше пи по модулю. А то переход между пи и -пи - не весёлый.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
Регистрация: Aug 2007
Сообщений: 168
|
Да, шаг использовать удобнее, только теперь возник вопрос как определить направление в котором движется курсор мыши (по часовой или против часовой стрелки), чтобы знать прибавлять ли шаг или отнимать?
|
|
|||||
Цитата:
Пример
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку. |
|
|||||
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
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; } } }
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. Последний раз редактировалось -De-; 01.08.2011 в 22:11. |
Часовой пояс GMT +4, время: 20:10. |
|
« Предыдущая тема | Следующая тема » |
|
|