использование hitTestPoint () с объектом сцены для создания границ объекта - PullRequest
1 голос
/ 15 декабря 2011

Я пытаюсь создать границу для объекта игрока, управляемого с помощью клавиш со стрелками, в моей игре, используя высоту и ширину основной сцены. Например, одна контрольная точка находится на верхнем крае ограничительной рамки объекта игрока, так что, когда голова объекта игрока касается верхнего края сцены, игрок больше не может двигаться на север. Объект проигрывателя вручную создается в центре сцены с помощью редактора сцены 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 Ответ

2 голосов
/ 15 декабря 2011

Использование объекта сцены с флагом формы, установленным в 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;
}

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

...