Флеш-дроп и лови игру - PullRequest
       9

Флеш-дроп и лови игру

0 голосов
/ 13 марта 2019

Я занимаюсь флеш-мини-игрой, в которой персонаж должен поймать предмет, выпадающий сверху вниз. Проблемы, с которыми я сталкиваюсь, это использование таймера для этих 6 элементов в произвольно выбранном массиве и выпадающего со случайной осью X.

var PointFood:Array = [Melon1,Honey1,Worm1,Clock1,Poison1,Sling1];
//this is the array of items to drop
time = new Timer(60);
//No idea the timer is with frame or second
time.addEventListener(TimerEvent.TIMER,GenerateItem);
time.start();
function GenerateItem(event:TimerEvent):void
{
axis = Math.round(Math.random()*709.7)+44.45;
//this is the random x axis with my scene width
PointFood[i].x = axis;
PointFood[i].y = 0;
    if(PointFood[i].y < 600.95)
    {
      PointFood[i].y += 10;
    }
}
//here assign the x and y axis
function ItemType(e:Event):Number
{
    i = Math.round(Math.random()*5);
    return i;
}
//this is the random for item in array

Однако ось X будет продолжать меняться после завершения расчета. Даже те элементы, которые уже существуют на экране, их ось X также будет постоянно меняться при расчете. Любое решение для этого?

1 Ответ

2 голосов
/ 13 марта 2019

Существуют разные способы борьбы с этим. Я полагаю Дыня1 , Мед1 , ... это экземпляры ваших собственных классов. Добавьте к каждому из них публичную собственность , расположенную , например:

public var positioned:Boolean=false;

В данный момент ваша функция ItemType просто возвращает случайное целое число, основанное на количестве объектов в массиве PointFood . Давайте интегрируем проверку, если случайный объект уже позиционирован, используя его недавно добавленное свойство position:

function ItemType(e:Event):Number
        {
            var found:Boolean;

            do
            {
                found = true;
                i = Math.round(Math.random() * 5);
                if (PointFood[i].positioned)
                {
                    found = false;
                }
            } while (!found);

            return i;
        }

Наконец, измените функцию GenerateItem , чтобы учесть свойство позиционированное - таким образом, просто рандомизируйте позицию, если она false :

        function GenerateItem(event:TimerEvent):void
        {
            if (PointFood[i].positioned == false)
            {
            axis = Math.round(Math.random() * 709.7) + 44.45;
//this is the random x axis with my scene width
                PointFood[i].positioned = true;
                PointFood[i].x = axis;
                PointFood[i].y = 0;
            }
                if (PointFood[i].y < 600.95)
                {
                    PointFood[i].y += 10;
                }
        }

В качестве примечания:

time = new Timer(60);

означает, что ваш таймер срабатывает каждые 60 миллисекунд - это ожидаемое поведение? Также может быть небольшая логическая проблема с вашим кодом. Как следует из названия GenerateItem, я полагаю, что эта функция должна просто создать новый объект и инициализировать его позицию. К сожалению, похоже, что вы злоупотребляете этой функцией, чтобы выполнять основной игровой цикл. Я бы рекомендовал разделить это на две отдельные функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...