1

我试图在我的游戏中使用主舞台的高度和宽度为玩家对象创建一个边界,用箭头键控制。例如,一个测试点位于玩家对象的边界框的顶部边缘,这样当玩家对象的头部接触到舞台的顶部边缘时,玩家就不能再向北移动了。播放器对象通过使用 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;
            }
        }
    }
}
4

1 回答 1

2

使用 shape 标志设置为 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;
}

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

于 2011-12-15T07:53:42.933 回答