PDA

Просмотр полной версии : Проверка курсора, за сценой, внутри сцены.


Dr_Bra
20.07.2010, 11:48
Всем привет, подскажите, как можно проверить положение курсора, внутри сцены курсор или курсор вне сцены?

Добавлено через 14 минут
я хочу сделать проверку на перетаскивание объекта, если объект отпустили за пределами сцены, объект возвращается в исходную позицию.
в ас 2.0 это было так

a_mc.onPress=function(){
startDrag(a_mc);
x0=this._x;
y0=this._y;
}

a_mc.onRelease=function(){
stopDrag();
}

a_mc.onReleaseOutside=function(){
stopDrag();
this._x=x0;
this._y=y0;
}

Wolsh
20.07.2010, 12:36
Событие Event.MOUSE_LEAVE - мышь покидает окно флэш-плеера (точнее сцену).
А onReleaseOutside не имел к этому ни малейшего отношения. Это - когда кнопку мыши ОТПУСКАЮТ не на том объекте, на котором НАЖАЛИ.

Dr_Bra
20.07.2010, 13:14
вот как можно сделать проверку, что бы объект выпущенный за сценой, возвращался назад?

package
{
import flash.display.Sprite;
import flash.events.MouseEvent;

public class DragAndDrop extends Sprite
{
private var _obj;

public function DragAndDrop()
{
_obj = new Obj();
stage.addChild(_obj);
_obj.addEventListener(MouseEvent.MOUSE_DOWN, drag);
_obj.addEventListener(MouseEvent.MOUSE_UP, drop);
}

private function drag(evt:MouseEvent):void
{
_obj.startDrag();
}

private function drop(evt:MouseEvent):void
{
_obj.stopDrag();
}
}
}

Zik.
20.07.2010, 13:25
package
{
import flash.display.Sprite;
import flash.events.MouseEvent;

public class DragAndDrop extends Sprite
{
private var _obj;
private var startX:int;
private var startY:int;

public function DragAndDrop()
{
_obj = new Obj();
stage.addChild(_obj);
_obj.addEventListener(MouseEvent.MOUSE_DOWN, drag);
_obj.addEventListener(MouseEvent.MOUSE_UP, drop);
_obj.addEventListener(Event.MOUSE_LEAVE, leaveHandler);
}
private function leaveHandler(e:Event):void {
e.target.stopDrag();
e.target.x = startX;
e.target.y = startY;
}
private function drag(evt:MouseEvent):void
{
startX = e.target.x;
startY = e.target.y;
_obj.startDrag();
}

private function drop(evt:MouseEvent):void
{
_obj.stopDrag();
}
}
}

Могут быть ошибки, ибо писал прям в форууме

Dr_Bra
20.07.2010, 14:20
а есть ли альтернатива событию onReleaseOutside в as 3.0, поскольку вышепреведенные варианты никак не подошли(

Zik.
20.07.2010, 14:23
Вам нужно именно, чтобы при отпускании мыши смотрелось наличие курсора на сцене?

Dr_Bra
20.07.2010, 14:24
не совсем, главное что бы перетаскиваемый объект возвращался в исходную позицию, если этот объект был "брошен" за сценой флэшки

Zik.
20.07.2010, 14:36
Не понял, каким чудесным образом у вас LEAVE_MOUSE стал MouseEvent

Nirth
20.07.2010, 14:48
protected var mouseLeft:Boolean = false;

protected function init():void
{
stage.addEventListener( Event.MOUSE_LEAVE, mouseLeave );
}

protected function mouseLeave( event:Event ):void
{
mouseLeft = true;
stage.addEventListener( MouseEvent.MOUSE_MOVE, mouseMove );
}

protected function mouseMove( event:MouseEvent ):void
{
mouseLeft = false;
stage.removeEventListener( MouseEvent.MOUSE_MOVE, mouseMove );
}

Dr_Bra
20.07.2010, 14:53
Но все таки, onReleaseOutside, больше подходит, попробуйте перетащить желтый круг за сцену и бросить его, вот такой же (http://***********/18600293) эффект нужно получить

Mur4ik
20.07.2010, 15:42
В чем проблема то и какой именно код у Вас не работает?

В момент отпускания мыши проверяйте координаты объекта или мыши, если координаты находится за пределами сцены (а размеры сцены известны), возвращайте объект на место.

Wolsh
20.07.2010, 17:31
Координаты мыши за пределами сцены? ммм..

Mur4ik
20.07.2010, 20:34
Координаты мыши за пределами сцены? ммм..

А что смущает то?

package
{
import flash.display.*;
import flash.events.*;
import flash.geom.*;
import flash.text.*;

public class TestMouseCoord extends Sprite
{
private var _tfInfo:TextField;
private var _square:Sprite;
private var _squareStartPoint:Point;

public function TestMouseCoord()
{
if (stage) initInstance();
else addEventListener(Event.ADDED_TO_STAGE, initInstance);
}

private function initInstance(event:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, initInstance);

_squareStartPoint = new Point(50, 50);

_square = new Sprite();
_square.graphics.beginFill(0xCC0000);
_square.graphics.drawRect(0, 0, 50, 50);
_square.graphics.endFill();
_square.x = _square.y = 150;
addChild(_square);

_tfInfo = new TextField();
_tfInfo.autoSize = TextFieldAutoSize.LEFT;
_tfInfo.defaultTextFormat = new TextFormat("Arial", 12, 0x000000);
_tfInfo.x = _tfInfo.y = 10;
addChild(_tfInfo);

_square.addEventListener(MouseEvent.MOUSE_DOWN, square_mouseDownHandler);
}

private function square_mouseDownHandler(event:MouseEvent):void
{
_square.removeEventListener(Event.ENTER_FRAME, moveSquareBack);

stage.addEventListener(MouseEvent.MOUSE_MOVE, stage_mouseMoveHandler);
stage.addEventListener(MouseEvent.MOUSE_UP, stage_mouseUpHandler);
}

private function stage_mouseUpHandler(event:MouseEvent):void
{
stage.removeEventListener(MouseEvent.MOUSE_MOVE, stage_mouseMoveHandler);
stage.removeEventListener(MouseEvent.MOUSE_UP, stage_mouseUpHandler);

if ( !new Rectangle(0, 0, stage.stageWidth, stage.stageHeight).containsPoint(new Point(mouseX, mouseY)) )
{
_square.addEventListener(Event.ENTER_FRAME, moveSquareBack);
}
}

private function stage_mouseMoveHandler(event:MouseEvent):void
{
_tfInfo.text = "mouse:\t[ " + mouseX + " | " + mouseY + " ]" + "\nstage:\t" + stage.stageWidth + "x" + stage.stageHeight;

_square.x = mouseX;
_square.y = mouseY;

event.updateAfterEvent();
}

private function moveSquareBack(event:Event):void
{
if (_square.x == _squareStartPoint.x && _square.y == _squareStartPoint.y)
{
_square.removeEventListener(Event.ENTER_FRAME, moveSquareBack);
}
else
{
_square.x += (_squareStartPoint.x - _square.x) * .25;
_square.y += (_squareStartPoint.y - _square.y) * .25;
}
}
}
}

Sylon
30.11.2010, 04:33
Координаты мыши за пределами сцены? ммм..В IE флешка никогда не получает кординаты за пределами сцены. Также в IEшаке, если мышь выведена за пределы флешки при нажатой кнопке, при выходе не возникает ни каких событий - также и при отпускании кнопки за пределами. Проблема решается достаточно нудно и криво с использованием жаваскрипта. Если жаваскрипт недоступен, проблема не решается вовсе. Во всех остальных браузерах нормально работают Event.MOUSE_LEAVE при отжатой кнопке - или MouseEvent.MOUSE_OUT, MouseEvent.MOUSE_MOVE, MouseEvent.MOUSE_UP при перетаскивании за пределы сцены.