Как предотвратить попадание краев мувиклипов, которые расширяют сцену, в границы сцены в AS3?

У меня есть фоновое изображение, которое расширяет сцену сверху и снизу, это положение контролируется нажатиями клавиш, которые анимируют изображение. Я хочу остановить край изображения вверху или внизу сцены в зависимости от того, в какую сторону движется изображение. Я хочу, чтобы это применялось к слоям «layers_mc» и «bg_img».

Вот мой код

import flash.events.KeyboardEvent;
import fl.transitions.Tween;
import fl.transitions.easing.*;

stop();

var isUpPressed:Boolean = false;
var isDownPressed:Boolean = false;
var tweenDown:Tween;
var tweenUp:Tween;

stage.addEventListener(KeyboardEvent.KEY_DOWN,onKeyboardDown);
stage.addEventListener(KeyboardEvent.KEY_UP,onKeyboardUp);
stage.addEventListener(KeyboardEvent.KEY_DOWN,onKeyboardDown2);
stage.addEventListener(KeyboardEvent.KEY_UP,onKeyboardUp2);

    function onKeyboardDown(e:KeyboardEvent):void
    {
        if (e.keyCode == Keyboard.DOWN)
        {
            isDownPressed = true;
        }

        if (e.keyCode == Keyboard.UP)
        {
            isUpPressed = true;
        }
    }

    function onKeyboardUp(e:KeyboardEvent):void
    {
        if (e.keyCode == Keyboard.DOWN)
        {
            isDownPressed = false;
        }

        if (e.keyCode == Keyboard.UP)
        {
            isUpPressed = false;
        }
    }

    stage.addEventListener(Event.ENTER_FRAME,loop);

    function loop(event:Event):void
    {

    var posit:Number = layers_mc.y;
    var xDown:Number = layers_mc.y - 200;
    var xUp:Number = layers_mc.y + 200;

        if (isDownPressed)
        {
            tweenDown = new Tween(layers_mc, "y", Regular.easeOut, posit, xDown, 2, true);                
            trace(layers_mc.y);
        }

        if (isUpPressed)
        {
            tweenUp = new Tween(layers_mc, "y", Regular.easeOut, posit, xUp, 2, true);
            trace(layers_mc.y);
        }
    }

     function onKeyboardDown2(e:KeyboardEvent):void
    {
        if (e.keyCode == Keyboard.DOWN)
        {
            isDownPressed = true;
        }

        if (e.keyCode == Keyboard.UP)
        {
            isUpPressed = true;
        }
    }

    function onKeyboardUp2(e:KeyboardEvent):void
    {
        if (e.keyCode == Keyboard.DOWN)
        {
            isDownPressed = false;
        }

        if (e.keyCode == Keyboard.UP)
        {
            isUpPressed = false;
        }
    }

    stage.addEventListener(Event.ENTER_FRAME,loop2);

    function loop2(event:Event):void
    {

    var posit2:Number = bg_img.y;
    var xDown2:Number = bg_img.y - 50;
    var xUp2:Number = bg_img.y + 50;

        if (isDownPressed)
        {
            tweenDown = new Tween(bg_img, "y", Regular.easeOut, posit2, xDown2, 2, true);                
            trace(bg_img.y);
        }

        if (isUpPressed)
        {
            tweenUp = new Tween(bg_img, "y", Regular.easeOut, posit2, xUp2, 2, true);
            trace(bg_img.y);
        }
    }

ОБНОВЛЕНИЕ: это помогло

var posit:Number = layers_mc.y;
var xDown:Number = Math.max(-618.5, layers_mc.y - 200, stage.stageHeight - layers_mc.height); 
var xUp:Number = Math.min(500, layers_mc.y + 200);

person Ceejay1705    schedule 05.05.2015    source источник


Ответы (1)


Похоже, вы хотите ограничить объект, чтобы вы не могли прокручивать его до точки, где виден его край?

В этом случае вам нужно очистить свое значение, чтобы оно не вышло за пределы этой точки.

Итак, для перемещения объекта вниз вместо простого вычитания 200, как здесь:

var xDown:Number = layers_mc.y - 200;

Сделайте значение больше, -y перед тем, как край станет видимым, или текущее значение меньше 200.

var xDown:Number = Math.max(layers_mc.y - 200, stage.stageHeight -layers_mc.height);

Если вы возьмете высоту сцены (или любые другие видимые границы), а затем вычтете высоту вашего дочернего объекта, это даст вам самую верхнюю точку, в которой может находиться ваш объект, и при этом его край будет внизу сцены.

Итак, вам нужно убедиться, что все ваши значения соответствуют этим правилам: (используя операторы if или Math.max/min и т. д.)

Наименьшая допустимая точка y: stage.stageHeight - object.height;

Максимальная допустимая точка Y: 0

И наоборот, если вы также выполняли панорамирование влево и вправо:

Наименьшая допустимая точка x: stage.stageWidth - object.width

Максимальная допустимая точка x: 0

Таким образом, ваш код будет выглядеть примерно так:

var xDown:Number = Math.max(layers_mc.y - 200, stage.stageWidth - layers_mc.height)); //make sure the value doesn't go less than stageWidth - layer height
var xUp:Number = Math.min(0, layers_mc.y + 200); //make sure the value doesn't go above 0
person BadFeelingAboutThis    schedule 05.05.2015