2016-02-08 14 views
1

Я создаю игру с перетаскиванием, используя AS3, я хочу проверить, не находится ли за пределами Movieclip вне экрана, чтобы перемещать вид сзади и позволить пользователю выбирать, где бросить его.Проверьте, когда часть MovieClip покидает сцену

I can not test, если учетные данные MovieClip больше, чем на этапе (scaleMode = NO_SCALE) Ширина/Высота, потому что есть часть сцены, которая скрыта за окном браузера.

Это тот же аспект, что и MOUSE_LEAVE, на этот раз он должен быть для MovieClips, я попытался увидеть код за MOUSE_LEAVE, но я не смог его достичь.

Thank you.

Основной класс

[SWF(width='800', height='800',backgroundColor='#CC99FF', frameRate='60')] 
public class DragTest extends Sprite 
{ 
    public function DragTest() 
    { 
     addChild(new World(this)); 

     this.stage.scaleMode = "noScale"; 
     this.stage.align = "TL"; 

     this.graphics.lineStyle(5,0x555555,0.5); 
     this.graphics.drawRect(0,0,800,800); 
    } 
} 

МИР КЛАСС

public class World extends Container // Container from my SWC 
{ 
    private var _display:Sprite; 
    private var _dragPt:Point; 
    private var _dragedObject:MovieClip; 

    public function World(display:Sprite) 
    { 
     super(); 

     _display = display; 

     myMC.addEventListener(MouseEvent.MOUSE_DOWN, onPickUp, false, 0, true); 

     display.stage.addEventListener(MouseEvent.MOUSE_UP, onDrop, false, 0, true); 
     display.stage.addEventListener(Event.MOUSE_LEAVE, onMouseLeave, false, 0, true); 
    } 

    protected function onMouseLeave(event:Event):void 
    { 
     trace("Mouse Is Leaving The Stage"); 

    } 

    protected function onDrop(e:MouseEvent):void 
    { 
     _display.stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMoveObject); 

    } 

    private function onPickUp(e:MouseEvent) 
    { 
     _dragedObject = e.currentTarget as MovieClip; 

     _display.stage.addEventListener(MouseEvent.MOUSE_MOVE, onMoveObject, false, 0, true); 
    } 

    protected function onMoveObject(e:MouseEvent):void 
    { 
     var point:Point = new Point(_display.stage.mouseX, _display.stage.mouseY); 

      (_dragedObject as MovieClip).x = point.x; 
      (_dragedObject as MovieClip).y = point.y;   
    } 
} 

Ниже приведен пример: Simple Code

+0

Просто так это не другое ** [Проблема X/Y] (http://meta.stackexchange.com/a/66378) **. Ваш вопрос больше о том, как перетащить Flash-содержимое из одного окна браузера в другое? Я смущен тем, что «Этап скрыт за окном браузера», а также говорит: «... находится за пределами экрана, чтобы переместить View позади и позволить пользователю выбрать, куда его отбросить». –

+0

На самом деле это не перетаскивание из одного окна в другое, сцена иногда скрывается за браузером, потому что я использую noScale, поэтому, когда вы уменьшаете размер окна, часть сцены не отображается, что я пытаюсь сделать обнаруживает, когда мувиклип прикасается к показующим краям сцены, чтобы обнаружить, когда он собирается уйти, он отлично работает с MOUSE_LEAVE, я просто хочу сделать это с помощью MC. –

+0

** [Этот ответ] (http://stackoverflow.com/a/6050299/2057709) ** не помогает? Поместите небольшой примерный пример кода, как вы это делаете, который может быть «исправлен». Обычно для перетаскивания я просто использую функцию «enterframe», которая говорит, когда кнопка мыши удерживается, а затем «myMC.x = stage.mouseX;» таким образом MC следует за мышью, и, возможно, вы также можете применить метод «Mouse_Leave» ... –

ответ

1

Самый простой подход, вероятно, будет использовать getBounds(stage) и сравнить с stageWidth и stageHeight:

var bounds:Rectangle = _draggedObject.getBounds(stage); 
if (bounds.left < 0) { 
    // left part of object is off-screen 
} else if (bounds.right > stage.stageWidth) { 
    // right part of object is off-screen 
} 
if (bounds.top < 0) { 
    // top part of object is offscreen 
} else if (bounds.bottom > stage.stageHeight) { 
    // bottom part of object is off-screen 
} 

Вы можете переместить display в каждом из этих случаев.

+0

Это отлично работает, если окно браузера> окно сцены, если уменьшить размер окна, чтобы оно было меньше, чем на сцене, оно не будет работать, в противоположность MOUSE_LEAVE, которое работает в обоих случаях. –

+0

Сделайте размер сцены таким же, как размер окна, вставив его со 100% шириной и высотой 100%. – Aaron

+0

Да, я уже это делаю, но размер SWF уже установлен с использованием метатега SWF, добавляя к этому NO_SCALE, хотя я меняю размер окна, этап не меняется :). –

0

Вы можете попытаться создать невидимую зону, которая немного меньше вашей сцены.

Итак, вы можете добавить событие MOUSE_LEAVE в зону, и когда ваша мышь покинет эту зону, вы сможете делать то, что хотите.

Check the example here.

+0

Я понимаю, что вы имеете в виду, но как я должен знать ширину/высоту этой зоны, что замечательно в MOUSE_LEAVE, она обнаруживает зону, отображаемую браузером, без необходимости внешнего интерфейса, потому что это будет тяжело, если оно будет называться постоянно. –