Flash AS3:将鼠标保持在一定范围内

时间:2012-03-19 08:30:28

标签: actionscript-3 flash-cs5

因为我们无法直接修改mouseX和mouseY的位置,所以这个对我项目的开发至关重要(对我而言)是一个非常棘手的问题 - 它们是只读变量。

基本上,我想做的是让一个玩家能够在特定实例处于活动状态时仅在某个三角形区域内移动鼠标。后一点我可以管理得很好,但是我在限制鼠标移动方面遇到了麻烦 - 或者鼠标明显移动。

这是我到目前为止所做的事情: 1.将库moveclip分配给Event.ENTER_FRAME事件中的mouseX和mouseY位置 - 尽管我承认应该将其移动到Mouse.MOUSE_MOVE。 (这没关系) 2.使用Corey O'Neils碰撞检测套件,使用十字准线/光标对区域的边界实例进行命中测试。 3.适当地偏移光标,然后将标准布尔值设置为false,这样光标就不会一遍又一遍地反射回光标。

我的问题是,我不确定再次允许鼠标移动的最佳方法是什么。任何人都可以给我一些关于最佳方法的提示,或者如果有必要,请指出另一个限制鼠标移动方向的方向吗?

对于它的价值,这是为了阻止用户在自上而下(ish)射击游戏中使用角色瞄准一个不切实际的方向。

对于那些不熟悉Corey O'Neil的碰撞检测套件的人,我相信它只是一个预先构建的位图(或可能是矢量)碰撞测试设置 - 我可能是错的。我不确定它是如何工作的细节,只是它的基本实现。

这是我到目前为止关于鼠标移动的代码:

import flash.ui.Mouse;
import flash.events.event
import com.coreyoneil.collision.CollisionList;
Mouse.hide();
var c:crosshair = new crosshair();
addchild(c);
var myCollisionList:CollisionList;
myCollisionList = new CollisionList(c); //sets up detection for the object c
myCollisionList.addItem(mcB); // adds mcB to the list of objects to check c's hittest with

function aim(e:Event) {
    var collisions:Array = myCollisionList.checkCollisions();
    if (collisions.length>0) 
    {
        hashit = true; // tells the program that the mouse has collided with a boundary
        c.x += 1;
        c.y += 1;
    }
    else
    {
        if (hashit == false)
        {
            c.x = mouseX;
            c.y = mouseY;
        }
    }
}

代码块道歉,但我认为最好显示所有相关代码 - 由于鼠标X和Y位置的只读性质,我不确定这个问题的复杂性。

另外,我正在寻找一种可能不会笨重的解决方案 - 也就是说,只要鼠标回到该区域,鼠标移动就会像原来一样平滑,光标仍然会在哪里匹配鼠标位置(意思是,光标始终与鼠标相关,如果鼠标离开边界,则不会改变位置。)

有人可以给我一些指示吗?很抱歉这个问题很长。我认为可能有一点可以让我的头脑在这里,对AS3来说相对较新 - 但我仍然觉得这是一个我可以过去的问题,如果你们中的一个能够向我展示正确的方向并帮助我完成这两个逻辑事情略有编程。

这是我的阶段图,以澄清边界区域等。 A diagram of my stage to clarify further http://i40.tinypic.com/2csfivm.png

非常感谢您提前提供任何帮助,我真的非常感激!

干杯,哈利。

2 个答案:

答案 0 :(得分:0)

此处的解决方法可能是隐藏系统鼠标光标并向舞台添加定制光标动画片段。

使用附加到舞台的MOUSE_MOVE事件侦听器,设置定制光标movieclip以匹配stage.mouseX和stage.mouseY值,并测试movieclip是否在边界之外。如果是这样,请将其设置回您的范围内。

答案 1 :(得分:0)

如何尝试getObjectsUnderPoint,它返回特定点下的对象数组。 如果您的三角形对象在数组中,则光标必须位于其上方。

var pt:Point = new Point(c.x, c.y);
var objects:Array = stage.getObjectsUnderPoint(pt);

if (objects.indexOf(triangleObject) > -1) {
trace("still within bounds");
}