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

deep70 24.12.2010 01:07

Координаты клипа - слушатель мыши
 
Здравствуйте.
Вопрос скорее по алгебре, чем по AS3, но все же рядом...
Итак есть слушатель MOUSE_MOVE - слушает область размером с весь stage
Самое простое - привязать к курсору клип:
Код AS3:

mc.x=mouseX;

мне понадобилось инвертировать управление - решил так:
Код AS3:

mc.x=mouseX*(-1)+stage.width;

т.о. курсор мыши и mc встречаются на половине stage.width
а вот дальше... в общем мне нужно, чтобы координаты клипа зависели еще и от тех координат, что были у него на момент попадания мыши на область stage.
Например, мышь покинула область прослушивания при mouseX==300, и mc остановился в координате mc.x==150
Когда мышь вернулась на область прослушивания при mouseX==200, то mc и курсор должны встретиться уже в другой координате (200-150)/2 и там встречаться (а также расходиться вокруг этой координаты) до тех пор пока мышь не отвалит за край stage.

Wolsh 24.12.2010 02:13

Давайте Вы еще разок подумаете и еще разок опишите чего хотите. Ибо я, например, с трудом себе представляю как мышь на координате х=200 встретится с клипом, который в координате х=150 - в точке х=25, при инверсии(!). Удачи.

Dukobpa3 24.12.2010 02:19

Не совсем понял задачу, но в любом случае мне кажется можно оперировать исключительно дельтой.
Т.е. не присваивать иксу мувиклипа какое-то статичное значение каждый раз, а делать что-то типа:
Код AS3:

mc.x += stage.width - (mouseX - prevMouseX)
 
//или
 
mc.x -= mouseX - prevMouseX

С такой структурой нам пофиг будет где клип находится, законы для него будут одинаковые в любой точке и любой момент времени.

Ну там проверки еще навесить чтоб мувиклип за екран не улетел.

Wolsh 24.12.2010 02:25

Не знаю.. я так понял что речь идет о "центре" вокруг которого действует инверсия. Когда мышь заходит в область, определяем новый центр - точку между мышью и клипом, и дальше вокруг нее пляшем, то есть мышь приближается к центру - клип приближается, мышь удаляется от центра - клип удаляется.

Dukobpa3 24.12.2010 02:30

Если так, то тогда считать уж никак не от stage.width а от какого-то lastFixedMcPos.

Wolsh 24.12.2010 03:03

Вложений: 1
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.display.StageAlign;
        import flash.display.StageScaleMode;
        import flash.events.MouseEvent;
/* * * * * * * * * *
*                  *
*  @author wolsh  *
*                  *
\* * * * * * * * * */

        public class Main extends Sprite
        {
                private var _mc                        :Sprite = new Sprite();
                private var _center                :Sprite = new Sprite();
                private var _floor                :Sprite = new Sprite();
                private var _centerX        :Number;
                private var _centerY        :Number;
 
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        stage.align = StageAlign.TOP_LEFT;
            stage.scaleMode = StageScaleMode.NO_SCALE;
                        stage.showDefaultContextMenu = false;
                        // entry point
                        _floor.graphics.beginFill(0xEEEEEE);
                        _floor.graphics.drawRect(0, 0, 400, 400);
                        this.addChild(_floor);
                        _floor.x = _floor.y = 100;
 
                        _center.graphics.beginFill(0x00FF00);
                        _center.graphics.drawCircle(0, 0, 2);
                        _center.x = _center.y = 200;
                        _floor.addChild(_center);
 
                        _mc.graphics.beginFill(0x000000);
                        _mc.graphics.drawCircle(0, 0, 5);
                        _mc.x = _mc.y = 200;
                        _floor.addChild(_mc);
 
                        _floor.addEventListener(MouseEvent.ROLL_OVER, onRollOver);
                        _floor.addEventListener(MouseEvent.ROLL_OUT, onRollOut);
                }
 
                private function onRollOut(event:MouseEvent):void
                {
                        stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMove);
                }
 
                private function onRollOver(event:MouseEvent):void
                {
                        _centerX = _floor.mouseX - (_floor.mouseX - _mc.x) / 2;
                        _centerY = _floor.mouseY - (_floor.mouseY - _mc.y) / 2;
                        _center.x = _centerX;
                        _center.y = _centerY;
                        stage.addEventListener(MouseEvent.MOUSE_MOVE, onMove);
                }
 
                private function onMove(event:MouseEvent):void
                {
                        _mc.x = Math.max(0, Math.min(_centerX - (_floor.mouseX - _centerX), 400));
                        _mc.y = Math.max(0, Math.min(_centerY - (_floor.mouseY - _centerY), 400));
                        event.updateAfterEvent();
                }
 
        }
 
}


Dukobpa3 24.12.2010 03:41

Ну раз пошла такая пьянка:) вот и продолжение моей идеи:)
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.display.StageAlign;
        import flash.display.StageScaleMode;
        import flash.events.MouseEvent;
/** * * * * * * * *
*                  *
*  @author wolsh  *
*                  *
* * * * * * * * * */

        public class Main extends Sprite
        {
                private var _mc                        :Sprite = new Sprite();
                //private var _center                :Sprite = new Sprite();
                private var _floor                :Sprite = new Sprite();
                //private var _centerX        :Number;
                //private var _centerY        :Number;
 
                private var _lastMouseX:int;
                private var _lastMouseY:int;
 
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        stage.align = StageAlign.TOP_LEFT;
            stage.scaleMode = StageScaleMode.NO_SCALE;
                        stage.showDefaultContextMenu = false;
                        // entry point
                        _floor.graphics.beginFill(0xEEEEEE);
                        _floor.graphics.drawRect(0, 0, 400, 400);
                        this.addChild(_floor);
                        _floor.x = _floor.y = 100;
 
                        /*_center.graphics.beginFill(0x00FF00);
                        _center.graphics.drawCircle(0, 0, 2);
                        _center.x = _center.y = 200;
                        _floor.addChild(_center);*/

 
                        _mc.graphics.beginFill(0x000000);
                        _mc.graphics.drawCircle(0, 0, 5);
                        _mc.x = _mc.y = 200;
                        _floor.addChild(_mc);
 
                        _floor.addEventListener(MouseEvent.ROLL_OVER, onRollOver);
                        _floor.addEventListener(MouseEvent.ROLL_OUT, onRollOut);
                }
 
                private function onRollOut(event:MouseEvent):void
                {
                        stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMove);
                }
 
                private function onRollOver(event:MouseEvent):void
                {
                        /*_centerX = _floor.mouseX - (_floor.mouseX - _mc.x) / 2;
                        _centerY = _floor.mouseY - (_floor.mouseY - _mc.y) / 2;
                        _center.x = _centerX;
                        _center.y = _centerY;*/

 
                        _lastMouseX = mouseX;
                        _lastMouseY = mouseY;
 
                        stage.addEventListener(MouseEvent.MOUSE_MOVE, onMove);
                }
 
                private function onMove(event:MouseEvent):void
                {
                        //_mc.x = Math.max(0, Math.min(_centerX - (_floor.mouseX - _centerX), 400));
                        //_mc.y = Math.max(0, Math.min(_centerY - (_floor.mouseY - _centerY), 400));
                        var deltaX:int = _lastMouseX - mouseX;
                        var deltaY:int = _lastMouseY - mouseY;
 
                        _mc.x = _mc.x + deltaX > 400 ? 400 :
                        _mc.x + deltaX < 0 ? 0 : _mc.x + deltaX;
 
                        _mc.y = _mc.y + deltaY > 400 ? 400 :
                        _mc.y + deltaY < 0 ? 0 : _mc.y + deltaY;
 
                        _lastMouseX = mouseX;
                        _lastMouseY = mouseY;
 
                        event.updateAfterEvent();
                }
 
        }
 
}

Для сравнения оставил и предыдущий код, но закомментировал.

deep70 24.12.2010 12:46

Цитата:

Сообщение от Wolsh (Сообщение 959637)
Давайте Вы еще разок подумаете и еще разок опишите чего хотите. Ибо я, например, с трудом себе представляю как мышь на координате х=200 встретится с клипом, который в координате х=150 - в точке х=25, при инверсии(!). Удачи.

Да. Тут я напутал. :-[ к (200-150)/2 надо было прибавить mc.x.

Цитата:

Сообщение от Dukobpa3 (Сообщение 959641)
Ну раз пошла такая пьянка<.....>

Это то что нужно! Большое спасибо за участие :)

iflamberg 24.12.2010 15:41

Ну наконец на форуме появились телепаты =D
сорри за оффтоп


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

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