AS3 - остановить постоянную работу функции onEnterFrame

Хорошо, у меня есть функция CollisionTest, которая привязана к моей функции onEnterFrameHandler.

Итак, чтобы упростить внешний вид:

onEnterFrameHandler(e:Event):void{
testCollision();
}

testCollision():void{
  trace("always running");
  if(1_MC.hitTestObject(2_MC)){
    //do stuff
  }
}

Дело в том, что он всегда работает. Постоянно работает для проверки на столкновение. У меня такое ощущение, что это может быть причиной задержки в этом проекте.

Знаете ли вы хороший способ управления функцией, которая должна иметь возможность проверять событие в любое время, но не запускаться, пока событие не происходит?


person Joseph Wagner    schedule 20.08.2012    source источник
comment
Не уверен, что вы спрашиваете (не запускать, пока событие не происходит?). Есть ли необходимость проверять наличие коллизий в каждом отдельном кадре?   -  person BadFeelingAboutThis    schedule 21.08.2012
comment
Вы можете использовать класс Timer вместо ввода кадра, затем вы устанавливаете интервал, как часто вы хотите проверять. Если это то, что вы имеете в виду, дайте мне знать, и я сделаю пример в качестве ответа.   -  person BadFeelingAboutThis    schedule 21.08.2012


Ответы (3)


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

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

person Neil    schedule 22.08.2012

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

поэтому вы можете сделать это, просто добавив оператор if следующим образом:

if (doCollisionTest){testCollision();}

но это не решает, когда doCollisionTest истинно или ложно, и это сложная часть, на которую нельзя ответить из предоставленной вами информации.

person Daniel    schedule 20.08.2012

Если вам не нужно проверять каждый кадр, вы можете использовать таймер для проверки так часто, как вам нравится, например, если вы считаете, что достаточно проверять 3 раза в секунду, вы должны настроить его следующим образом. :

var timer:Timer = new Timer(333); //run 3 times a second
timer.addEventListneer(TimerEvent.TIMER, collisionTest, false, 0, true);
timer.start();

function collisionTest(e:Event = null):void {
   //do you collision stuffs
}

Затем, если по какой-либо причине вы хотите временно отключить его, используйте timer.stop() , затем снова timer.start()

person BadFeelingAboutThis    schedule 20.08.2012
comment
Однако разве это не компенсирует мои тесты на столкновение? Поскольку он проверяется только три раза в секунду, не могут ли эти пробелы вызвать проблемы? Моя программа в настоящее время работает со скоростью 30 кадров в секунду (не уверен, что это лучше всего для игры), поэтому проверка только в 10% случаев КАЖЕТСЯ немного свободной. - person Joseph Wagner; 21.08.2012
comment
Да, как только я реализовал таймер, пули иногда проходили сквозь врагов. Я ценю помощь, но для чего-то столь же точного, как тест на столкновение, я не уверен, что таймер будет лучшим... если только вы не придумаете лучший способ его использования. - person Joseph Wagner; 21.08.2012
comment
Тогда вы должны проверять тот же блок кода, который перемещает вашу пулю. Если ваша пуля не движется, не проводите тест на столкновение. Вы не дали четкого контекста в своем вопросе, поэтому это похоже на то, о чем вы спрашивали. - person BadFeelingAboutThis; 21.08.2012