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

1q2w3e4r5t6 12.07.2011 21:18

Поворот объекта в зависимости от положения курсора мыши на экране
 
Добрый вечер.
Наверное каждый из вас играл в игры, где нужно с помощью пушки разрушить, например, замок. Так вот в таких играх угол выстрела и его сила определялась положением курсора в приложении (выше курсор - больше угол, дальше курсор от пушки - сильнее выстрел). Хочу сделать подобное, но не получается.
Код AS3:

package Game
{
        import flash.display.Sprite;
        import flash.events.MouseEvent;
 
        public final class Cannon extends Sprite
        {
                private var cannon:Sprite;
                public function Cannon()
                {
                        super();
                        cannon = new Sprite();
                        cannon.graphics.beginFill(0x000000, 1);
                        cannon.graphics.drawRect(10,485,50,10);
                        cannon.graphics.drawCircle(10,490,10);
                        this.addChild(cannon);
                        this.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveListener);
                }
 
                private function mouseMoveListener(e:MouseEvent):void
                {
                        this.rotation = Math.atan(e.stageY/e.stageX)*180/Math.PI;
                        trace(Math.atan(e.stageY/e.stageX)*180/Math.PI)
                }
        }
}

Делаю так: поворачиваю пушку на угол а=arctg(y/x), где x и y - координаты мыши в окне приложения. Но прикол в том, что ничего не поворачивается (иногда даже исчезает...). Подскажите, как правильно сделать?)

PS и как задать точку, относительно которой происходит вращение?

i.o. 12.07.2011 21:26

Геометрия. Векторы. Загляните в соседнюю тему..

goodguy 12.07.2011 21:29

Код AS3:

rotation = Math.atan2(stage.mouseY - this.y, stage.mouseX - this.x) * 180 / Math.PI;


1q2w3e4r5t6 12.07.2011 22:03

Цитата:

Сообщение от goodguy (Сообщение 1011203)
Код AS3:

rotation = Math.atan2(stage.mouseY - this.y, stage.mouseX - this.x) * 180 / Math.PI;


Не, не работает... Курсор вожу по экрану, а в отладке координаты не отображаются.

Heavy 12.07.2011 22:12

Листенер должен слушать движение на cannon или всетаки на stage?
А формула goodguy точно рабочая.

goodguy 12.07.2011 22:16

+1. Строчка взята из рабочего кода.

1q2w3e4r5t6 12.07.2011 22:49

Не я не знаю на кого. Просто нужно чтобы когда по окну водишь мышью, в след за ней крутилась моя пушка. Как это сделать?
И еще: как задать точку, относительно которой происходит вращение? Метод есть какой?

saikspaik 12.07.2011 23:01

Делаешь
Код AS3:

stage.addEventListener

, и в это слушатель добавляешь код который привел goodguy, только изменяешь rotation своей пушки. То есть
Код AS3:

cannon.rotation = Math.atan2(stage.mouseY - this.y, stage.mouseX - this.x) * 180 / Math.PI;

Вроде ж все предельно ясно.

1q2w3e4r5t6 12.07.2011 23:19

Спасибо, с этим разобрался что куда и как) А точку поворота как задать-то? Да, у меня сейчас моя пушка крутится, но относительно левого верхнего угла окна (точка 0.0). А мне нужна точка (10, 490)!

i.o. 12.07.2011 23:22

Цитата:

Вроде ж все предельно ясно.
Ну вот для некоторых не ясно, что (10, 490) нужно подставить вместо this.x и this.y

1q2w3e4r5t6 12.07.2011 23:27

stage.mouseY - this.y, stage.mouseX - this.x - это длины катетов. Причем здесь точка поворота??
Она у меня вращается относительно (0,0), даже если подставить значения, хотя это и так ясно.

i.o. 12.07.2011 23:37

Цитата:

tage.mouseY - this.y, stage.mouseX - this.x - это длины катетов. Причем здесь точка поворота??
Ну раз не при чем, то все замечательно и в чем вопрос?
Цитата:

Она у меня вращается относительно (0,0), даже если подставить значения, хотя это и так ясно
А у меня относительно той, что указал. Что я делаю не так?

1q2w3e4r5t6 12.07.2011 23:45

Хаха)) Мистика. Ладно, может у меня руки кривые:
Код AS3:

package
{
        import Game.Cannon;
        import Game.Projectile;
 
        import flash.display.Sprite;
        import flash.events.MouseEvent;
 
        [SWF (height="500", width="1000")]
        public class main extends Sprite //Главный файл
        {
                private var cannon:Cannon
                private var projectile:Projectile;
                private var cannonAngle:Number;
                public function main()
                {
                        cannon = new Cannon();
                        stage.addChild(cannon);
                        stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveListener);
                        stage.addEventListener(MouseEvent.CLICK, clickMoveListener);
                }
 
                private function mouseMoveListener(e:MouseEvent):void
                {
                        cannon.rotation = Math.atan2(stage.mouseY - 490, stage.mouseX - 10) * 180 / Math.PI;
                        cannonAngle = Math.atan2(stage.mouseY - 490, stage.mouseX - 10) * 180 / Math.PI;
                //        trace(stage.mouseX, stage.mouseY);
                }
 
                private function clickMoveListener(e:MouseEvent):void
                {
                        //projectile = new Projectile();
                }
 
        }
}

Код AS3:

package Game
{
        import flash.display.Sprite;
        import flash.events.MouseEvent;
 
        public final class Cannon extends Sprite //Моя пушка ;)
        {
                private var cannon:Sprite;
                public function Cannon()
                {
                        super();
                        cannon = new Sprite();
                        cannon.graphics.beginFill(0x000000, 1);
                        cannon.graphics.drawRect(10,485,50,10);
                        cannon.graphics.drawCircle(10,490,10);
                        this.addChild(cannon);
                }
 
        }
}


i.o. 12.07.2011 23:49

проблема здесь
Код AS3:

cannon.graphics.beginFill(0x000000, 1);
cannon.graphics.drawRect(10,485,50,10);
cannon.graphics.drawCircle(10,490,10);


1q2w3e4r5t6 12.07.2011 23:51

Поясни пожалуйста...

i.o. 13.07.2011 00:02

Цитата:

Поясни пожалуйста...
Ах да, ошибься ведь..
Вот, только в этих двух:
Код AS3:

cannon.graphics.drawRect(10,485,50,10);
cannon.graphics.drawCircle(10,490,10);


1q2w3e4r5t6 13.07.2011 00:17

Код AS3:

cannon.graphics.drawCircle(0,0,10);
        cannon.graphics.drawRect(0,-5,50,10);

Все, исправил. Работает!

lovik 21.12.2011 18:53

Вложений: 1
Доброго дня суток вот что у меня получилось подскажите где ошибка
Код AS1/AS2:

stage.addEventListener(MouseEvent.MOUSE_MOVE, rotations);
 
function rotations (e:MouseEvent):void
{
 
        fonar_mc.rotation = Math.atan2(stage.mouseY - this.y, stage.mouseX - this.x) * 180 / Math.PI;
 
}

если посмотреть на свф фале крутится оно как то не корректно (


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

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