【问题标题】:Check when a part of the MovieClip leaves the Stage检查电影剪辑的一部分何时离开舞台
【发布时间】:2016-05-17 23:37:04
【问题描述】:

我正在使用 AS3 创建拖放游戏,我想检查 Movieclip 的一部分何时在屏幕外以将视图移到后面并让用户选择放置它的位置。

我无法测试 MovieClip 凭据是否大于舞台 (scaleMode = NO_SCALE) 宽度/高度,因为舞台的一部分隐藏在浏览器窗口后面。

这与 MOUSE_LEAVE 相同,只是这次必须用于 MovieClips,我试图查看 MOUSE_LEAVE 背后的代码,但无法访问。

谢谢。

主类

[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

【问题讨论】:

  • 所以这不是另一个 X/Y Problem。您的问题是否更多关于如何将 Flash 内容从一个浏览器窗口拖到另一个浏览器窗口?我对“舞台隐藏在浏览器窗口后面”感到困惑,并且还说“......在屏幕之外将视图移到后面并让用户选择放置它的位置。”
  • 实际上它不是从一个窗口拖动到另一个窗口,舞台有时隐藏在浏览器后面,因为我使用的是 noScale 所以当你减小窗口的大小时,舞台的一部分没有显示,我想要做的是检测一个movieclip何时触及舞台的显示边界,检测它何时即将离开,它与MOUSE_LEAVE配合得很好,我只想用MC来做。
  • This answer 没用?放置一个小的可测试示例代码,说明您如何做到这一点,可以“修复”。通常我只使用enterframe 函数来拖动鼠标按钮,然后myMC.x = stage.mouseX; 这样MC 跟随鼠标,也许你也可以应用Mouse_Leave 方法...
  • @ZouhairElamraniAbouElassad 您使用NO_SCALE这一事实非常重要,请将其添加到您的问题中,并附上拖动影片剪辑的代码示例。
  • 好的,我将尝试举一个简单的例子,它是一个使用 As3isolib 的等距地图,但重要的是独立于该库的拖动效果,我会用一个例子回来。

标签: actionscript-3 flash mouseevent movieclip stage


【解决方案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。

【讨论】:

  • 如果浏览器窗口 > 舞台窗口,这很好用,如果将窗口的大小减小到比舞台更小,它将无法正常工作,而 MOUSE_LEAVE 对这两种情况都有效。
  • 通过以 100% 宽度和 100% 高度嵌入舞台,使舞台大小与窗口大小相同。
  • 是的,我已经这样做了,但是使用 SWF 元标记也已经设置了 SWF 大小,添加到 NO_SCALE,即使我更改了窗口大小,舞台也不会改变: )。
  • 无论您将 SWF 元标记大小设置为多少,舞台都可以根据嵌入的 HTML 更改大小。这就是NO_SCALE 的重点,因此舞台可以 改变大小而无需缩放内容。你的嵌入代码是什么样的?
  • 老兄,你明白了,我注意到嵌入代码没有 100% 的宽度和高度,我以为它有,现在有了这些参数,我可以将我的 MovieClip 拖放到舞台的边界,非常感谢它的工作:)。
【解决方案2】:

您可以尝试创建一个比您的舞台小一点的隐形区域。

因此您可以将MOUSE_LEAVE 事件添加到该区域,当您的鼠标离开该区域时,您可以做任何您想做的事情。

Check the example here.

【讨论】:

  • 我明白你的意思,但是我应该怎么知道那个区域的宽度/高度,MOUSE_LEAVE 有什么好处它可以检测浏览器显示的区域而不需要外部接口,因为那样会如果它被永久调用,它会很重。
【解决方案3】:

针对 Aaron Beall 的回应:

为了获得更有趣的效果,如果您想等到影片剪辑完全离开舞台,您可以交换您在对象上检查的边界

var bounds:Rectangle = object.getBounds(stage);
if (bounds.right < 0) {
    // do thing
} else if (bounds.left > stage.stageWidth) {
    // do thing
}
if (bounds.bottom < 0) {
    // do thing
} else if (bounds.top > stage.stageHeight) {
    // do thing
}

如果 import flash.geom.Rectangle; 在类中,请确保已导入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多