使用带有舞台对象的hitTestPoint()来创建对象边界

时间:2011-12-15 06:58:16

标签: flash actionscript-3 controls boundary

我正在尝试使用主舞台的高度和宽度在我的游戏中使用箭头键控制玩家对象的边界。例如,一个测试点位于玩家对象的边界框的顶部边缘,这样当玩家对象的头部接触到舞台的顶部边缘时,玩家就不能再向北移动了。使用Flash舞台编辑器手动将播放器对象实例化到舞台的中心,以便在程序启动之前从中心开始。

问题是,在程序开始时,我不能再使用箭头键向上或向下移动玩家对象,但我仍然可以向左或向右移动它。目的是让玩家向北移动,直到玩家对象的头部接触主舞台的上边缘。这是代码:

package 
{
        public class Main_Playground extends MovieClip
        {
        var vx:int;
        var vy:int;

        public function Main_Playground()
        {
            init();
        }
        function init():void
        {
            //initialize variables
            vx = 0;
            vy = 0;

            //Add event listeners
            stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
            stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
            addEventListener(Event.ENTER_FRAME, onEnterFrame);
        }

        function onKeyDown(event:KeyboardEvent):void
        {
            if (event.keyCode == Keyboard.LEFT)
            {
                vx = -5;
            }
            else if (event.keyCode == Keyboard.RIGHT)
            {
                vx = 5;
            }
            else if (event.keyCode == Keyboard.UP)
            {
                vy = -5;
            }
            else if (event.keyCode == Keyboard.DOWN)
            {
                vy = 5;
            }
        }
        function onKeyUp(event:KeyboardEvent):void
        {
            if (event.keyCode == Keyboard.LEFT || event.keyCode == Keyboard.RIGHT)
            {
                vx = 0;
            }
            else if (event.keyCode == Keyboard.DOWN || event.keyCode == Keyboard.UP)
            {
                vy = 0;
            }
        }
        function onEnterFrame(event:Event):void
        {
            //Move the player
            player.x += vx;
            player.y += vy;

            //determine top boundary
            if (! stage.hitTestPoint(player.x, (player.y-(player.height/2)), true ) ){
                player.y -= vy;
            }
        }
    }
}

1 个答案:

答案 0 :(得分:2)

使用形状标志设置为true的舞台对象将产生错误:如果舞台上呈现的任何实际像素点击该点(可能会返回false,则测试,除非您有对象在可见舞台区域之外,恰好在指定的位置。)

当然,您可以将其设置为false并再次尝试(这样可以更好地工作,但仍会留下您正在针对舞台上呈现的所有内容的边界框进行测试的问题,而不是实际舞台区域),但我可以建议一种不同的方法吗?

效率更高,特别是因为你的精灵可能比舞台小得多,以测试玩家对舞台边界的边界框:

function onEnterFrame (ev:Event) : void {
    player.x += vx;
    player.y += vy;

    var playerBounds:Rectangle = player.getBounds(stage);
    if (playerBounds.left < 0 || playerBounds.right > stage.stageWidth) player.x -= vx;
    if (playerBounds.top < 0 || playerBounds.bottom > stage.stageHeight) player.y -= vy;
}

当然,玩家必须在启动时位于可见舞台区域内,并且您可能必须将焦点设置到舞台上以确保捕获键盘事件。