|
|
|||||
Регистрация: May 2012
Сообщений: 166
|
Значение true для элементов массива
Как правильно присвоить значение true для элементов массива которые удовлетворяют условию и соответственно сформировать новый массив из этих элементов?
Вот мой вариант, но он работает не корректно... неизвестно почему. public function goblinAgr (e:Event): void { for (var i:Number=0; i < enemys.length; i++) { if (hero.hitTestObject(enemys[i].obzor)) { temp.push(enemys[i]); } if (temp[i].x > hero.x) { temp[i].x -=HeroSpeedE; temp[i].gotoAndStop(1); } if (temp[i].y > hero.y) { temp[i].y -=HeroSpeedE; } if (temp[i].x < hero.x) { temp[i].x +=HeroSpeedE; temp[i].gotoAndStop(3); } if (temp[i].y < hero.y) { temp[i].y +=HeroSpeedE; } } } } |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Цитата:
Цитата:
Про true не понял. В коде никаких true не наблюдается. Добавлено через 5 минут Непонятно, почему цикл построен на массиве enemys, а условия внутри пытаются работать с массивом temp. Что, в temp столько же элементов, как и в enemys? (в английском вообще-то enemies) Тогда зачем вообще этот temp?
__________________
Reality.getBounds(this); |
|
|||||
Регистрация: May 2012
Сообщений: 166
|
true нету потому что я не знаю как его туда внедрить для каждого элемента массива прошедшего проверку по условию, вместо этого задумка состоит в том чтобы перегнать элементы одного массива прошедших условие в другой. Без скобки тоже не фурычит.
(этот код нужен в игре чтобы определить увидели ли враги главного героя и соответственно начинают за ним гнаться, в данный момент с этим кодом они не гонятся а влетают в него и начинаются тормаза=)) Последний раз редактировалось Tetraeon; 11.05.2012 в 09:05. |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Во-первых, не надо шустрить массивы каждый раз, когда Вам нужен элемент. На протяжении огромного куска кода Вы работаете с одним и тем же элементом, и каждый раз заставляете плеер искать массив и искать элемент в нем. Когда можно просто сохранить ссылку на этот элемент в начале витка цикла.
Затем Вы добавили enemy в какой-то массив temp. Я не знаю зачем. Так же совершенно непонятно происходящее дальше — Вы забываете про enemy и вытаскиваете кого-то из массива temp. Вытаскиваете, если он там есть конечно, что маловероятно. Почему маловероятно? Ну вот у Вас массив enemies, и в нем, допустим, 50 зомби. Начинаем цикл. Вы берете зомби с индексом "0", проверяете хиттестом, и он не попадает в обзор. И не будет добавлен в temp. Однако, несмотря на это, Вы уверенно берете какой-то несуществующий temp[0] и начинаете сравнивать его Х и Y с координатами героя. Вообще-то здесь плеер уже выдал ошибку. Если Вам так нужен массив видящих героя врагов, надо создать его в одном цикле. Затем надо провести второй цикл, уже обходя этот новый массив temp, с учетом его размера, а не массива всех врагов. Мне же кажется, что никакой temp вообще Вам не нужен. Вы проходите по массиву врагов, и все враги, видящие героя, устремляются к нему. Для этого вся ваша батарея if'ов должна помещаться внутри первого условия — хиттеста. Это и есть ваш "тру". Если enemy (т.е. enemies[i]) попал в обзор, то ЕГО координаты и меняем, устремляя его к герою. И никакого tempa для этого не надо — вот он, видящий враг, прямо здесь, в блоке условия. Добавлено через 8 минут public function goblinAgr (e:Event): void { for (var i:Number=0; i < enemys.length; i++) { var enemy:MovieClip = enemys[i] as MovieClip; if (hero.hitTestObject(enemy.obzor)) { if (enemy.x > hero.x) { enemy.x -= HeroSpeedE; enemy.gotoAndStop(1); } if (enemy.y > hero.y) { enemy.y -= HeroSpeedE; } if (enemy.x < hero.x) { enemy.x += HeroSpeedE; enemy.gotoAndStop(3); } if (enemy.y < hero.y) { enemy.y += HeroSpeedE; } } } }
__________________
Reality.getBounds(this); |
|
|||||
Регистрация: May 2012
Сообщений: 166
|
Этот код и был с самого начала до того как я начал туда 2й массив впихивать, только для того чтобы враги не переставали преследовать героя, как только он выйдет из их радиуса "obzor'а" моя ошибка что не пояснил зачем мне true, прошу прощения.
Пока желаемый результат не достигнут... враги останавливаются и буксуют, когда герой убегает. Последний раз редактировалось Tetraeon; 11.05.2012 в 12:50. |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Как-то странно они догоняют героя, что он становится от них дальше, чем был, не находите?
Вообще, по поводу "agree", дистанция обнаружения всегда должна быть меньше дистанции преследования обнаруженного, по логике вещей. Когда герой привлек внимание и враг знает, что здесь герой, он более внимателен к его местоположению, да?)) В то время как из состояния "не замечен" герой может подкрасться к врагу почти вплотную, пока тот его увидит. Но увидев, уже сможет видеть его и на гораздо большей дистанции.
__________________
Reality.getBounds(this); |
|
|||||
Регистрация: May 2012
Сообщений: 166
|
Внедрение всех тонкостей этой ситуации очень увлекательное занятие и у меня тоже были идеи такого рода, но пока я просто учусь и апгрейдом займусь когда будит хотя бы более менее рабочее ядро.. иначе боюсь запутаюсь =)
|
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Ну я бы, во-первых, сделал у героя дистанцию "явного присутствия". То есть дистанция, на которой герой однозначно виден и шумит. Эту дистанцию можно править бонусами к "скрытности" например. А у врагов может быть своя дистанция, соответствующая их слуху и остроте зрения, причем в двух состояниях — normal и agree. И сравнивать эти дистанции по факту. Первый контакт по normal, а когда враг возбужден и начал погоню — по agree.
Я извиняюсь, но это не тонкости. Без этого "ядро" будет таким как сейчас.
__________________
Reality.getBounds(this); |
|
|||||
Регистрация: May 2012
Сообщений: 166
|
Так и так нужно будит сделать отдельный массив для врагов с таким состоянием... т.е. я пока не вижу другого варианта кроме как для каждой разновидности врага сделать отдельный массив (один враг знает что герой есть и модификатор его поля (Scale x и y увеличены), а другой не знает и вообще дрыхнит где нибудь в кустах))) и его поля вообще нет.. ладно если бы он был в 1 экземпляре но их будит много, не спящих конечно, иначе это было бы, какое то сонное царство))) Если конечно нет более универсального метода. Задумка вообще отличается от того что есть сейчас... по задумке должен быть полукруг перед врагом (поле зрения), а сейчас просто круг присобаченный в центр врага... думаю со временем все будит) Интересно не сильно ли это будит напряжно для компа.. обрабатывать столько массивов... если он уже сейчас тормозит неизвестно почему.
Последний раз редактировалось Tetraeon; 11.05.2012 в 15:30. |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
А что заставило Вас делать хиттестами? Есть точка в которой герой, есть координаты (точки) врагов. Есть метод у класса Point, вычисляющий дистанцию. Разве не удобнее задавать все эти параметры числами и вычислять математически, а не визуально?
Кроме того, обычно игроделы рекомендуют пользоваться сеткой/ячейками для оптимизации, чтобы не проверять гоблинов соседнего королевства, находящегося за морем. Да и еще много зачем))
__________________
Reality.getBounds(this); |
Часовой пояс GMT +4, время: 21:09. |
|
« Предыдущая тема | Следующая тема » |
|
|