#flash #actionscript-3 #event-handling #if-statement #collision-detection
#flash #actionscript-3 #обработка событий #if-оператор #обнаружение столкновений
Вопрос:
В настоящее время я создаю игру, в которой у вас есть контроллеры, которые вы можете перемещать и соединять друг с другом линиями, и линии должны сталкиваться со всеми яйцами на экране, чтобы перейти на следующий уровень. Кроме того, всякий раз, когда яйцо сталкивается с линией, яйцо меняет свой цвет.
Дело в том, что у меня есть около 10 яиц и 7 строк, и получение условий для проверки, затронуто ли яйцо строкой, и все ли яйца затронуты строками, — это МНОГО (я имею в виду серьезно много, я уже пробовал) кода.
Это просто объединение СОТЕН условных выражений и прослушивателей событий.
У кого-нибудь есть более красивое решение? Спасибо за любые комментарии: D
Комментарии:
1. реализуются ли eggs и lines как классы?
2. нет. как мне превратить их в классы?
Ответ №1:
Вы можете использовать вложенные циклы for для проверки события enterframe. Это может поглотить процессор, поэтому убедитесь, что вы запускаете цикл только тогда, когда это необходимо.
Вот простой пример вложенного цикла:
var eggs:Array = [e0,e1,e2,e3,e4,e5,e6,e7,e8,e9];
var lines:Array = [l0,l1,l2,l3,l4,l5,l6];
var eggLen:int = eggs.length;
var lineLen:int = lines.length;
var egg:MovieClip;
var line:MovieClip;
addEventListener(Event.ENTER_FRAME, enterFrameHandler);
function enterFrameHandler(e:Event):void {
EggLoop:for (var i:int = 0; i<eggLen; i ) {
egg = eggs[i];
LineLoop:for (var j:int = 0; j<lineLen; j ) {
line = lines[j];
if (egg.hitTestObject(line)) {
trace("Egg: " egg " just hit Line: " line);
break LineLoop;
// if you want to break the entire loop use:
// break EggLoop;
}
}
}
}
Комментарии:
1. var eggs:Array = [e0, e1,e2,e3, e4,e5, e6,e7,e8,e9]; var lines:Array = [l0,l1,l2,l3,l4,l5,l6]; var eggLen:int = яйца. длина; var lineLen:int = строки. длина; каковы все эти имена (в переменных / массивах)? нужно ли мне что-нибудь изменить, чтобы это заработало?
2. Это будут имена экземпляров ваших яиц и строк. Я просто придумал имена в качестве примера. Если вы замените имена в массиве на фактические имена ваших экземпляров, это должно быть достойно тестирования. Переменные ‘eggLen’ и ‘lineLen’ — это просто ссылки на длину массива. Эти ссылки используются в цикле, поэтому Flash не будет вычислять длину для каждого события enterframe. Это поможет производительности.
3. Теперь я собираюсь использовать его для приложений AIR3.0 для iPhone и Android. Будет ли это ДЕЙСТВИТЕЛЬНО потреблять процессор и, что более важно, батарею?
4. И еще: если бы я хотел издать звук при ударе по яйцу, но только один раз, как я могу это сделать (я имею в виду, что трассировка (), которую вы туда добавляете, просто продолжается вечно …). И как я могу проверить, все ли яйца сталкиваются с линиями? Кстати, спасибо вам за вашу помощь!
5. Цикл не такой уж интенсивный, но на всякий случай я бы убивал его в любое время, когда вам не нужно запускать hitTest. Что касается звука, я не знаю, какова концепция игры, поэтому я не уверен, заканчивается ли игра, когда первое яйцо попадает в первую строку … или в первую строку, в которую попадает любое яйцо. В любом случае, похоже, вы могли бы использовать условные обозначения и / или другой массив для хранения объектов «попадания». Если объект находится в массиве «попадание», просто пропустите его.