Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Значение true для элементов массива (http://www.flasher.ru/forum/showthread.php?t=179268)

Tetraeon 11.05.2012 01:38

Значение true для элементов массива
 
Как правильно присвоить значение true для элементов массива которые удовлетворяют условию и соответственно сформировать новый массив из этих элементов?
Вот мой вариант, но он работает не корректно... неизвестно почему.
Код AS3:

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;
                                        }
                                }
                        }
}

Видите ли вы тут ошибку? и как бы вы сделали?

Wolsh 11.05.2012 02:19

Цитата:

Видите ли вы тут ошибку?
Вижу лишнюю скобку.
Цитата:

и как бы вы сделали?
Убрал бы лишнюю скобку.
Про true не понял. В коде никаких true не наблюдается.

Добавлено через 5 минут
Непонятно, почему цикл построен на массиве enemys, а условия внутри пытаются работать с массивом temp.
Что, в temp столько же элементов, как и в enemys? (в английском вообще-то enemies)
Тогда зачем вообще этот temp?

Tetraeon 11.05.2012 08:32

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

Wolsh 11.05.2012 11:03

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

var enemy:MovieClip = enemies[i];

Затем Вы добавили enemy в какой-то массив temp. Я не знаю зачем. Так же совершенно непонятно происходящее дальше — Вы забываете про enemy и вытаскиваете кого-то из массива temp. Вытаскиваете, если он там есть конечно, что маловероятно. Почему маловероятно? Ну вот у Вас массив enemies, и в нем, допустим, 50 зомби. Начинаем цикл. Вы берете зомби с индексом "0", проверяете хиттестом, и он не попадает в обзор. И не будет добавлен в temp. Однако, несмотря на это, Вы уверенно берете какой-то несуществующий temp[0] и начинаете сравнивать его Х и Y с координатами героя. Вообще-то здесь плеер уже выдал ошибку.
Если Вам так нужен массив видящих героя врагов, надо создать его в одном цикле. Затем надо провести второй цикл, уже обходя этот новый массив temp, с учетом его размера, а не массива всех врагов.
Мне же кажется, что никакой temp вообще Вам не нужен. Вы проходите по массиву врагов, и все враги, видящие героя, устремляются к нему.
Для этого вся ваша батарея if'ов должна помещаться внутри первого условия — хиттеста. Это и есть ваш "тру". Если enemy (т.е. enemies[i]) попал в обзор, то ЕГО координаты и меняем, устремляя его к герою. И никакого tempa для этого не надо — вот он, видящий враг, прямо здесь, в блоке условия.

Добавлено через 8 минут
Код AS3:

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;
                        }
                }
        }
}


Tetraeon 11.05.2012 11:36

Этот код и был с самого начала до того как я начал туда 2й массив впихивать, только для того чтобы враги не переставали преследовать героя, как только он выйдет из их радиуса "obzor'а" моя ошибка что не пояснил зачем мне true, прошу прощения.
Пока желаемый результат не достигнут... враги останавливаются и буксуют, когда герой убегает.

Wolsh 11.05.2012 13:05

Как-то странно они догоняют героя, что он становится от них дальше, чем был, не находите?
Вообще, по поводу "agree", дистанция обнаружения всегда должна быть меньше дистанции преследования обнаруженного, по логике вещей. Когда герой привлек внимание и враг знает, что здесь герой, он более внимателен к его местоположению, да?)) В то время как из состояния "не замечен" герой может подкрасться к врагу почти вплотную, пока тот его увидит. Но увидев, уже сможет видеть его и на гораздо большей дистанции.

Tetraeon 11.05.2012 13:25

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

Wolsh 11.05.2012 13:50

Ну я бы, во-первых, сделал у героя дистанцию "явного присутствия". То есть дистанция, на которой герой однозначно виден и шумит. Эту дистанцию можно править бонусами к "скрытности" например. А у врагов может быть своя дистанция, соответствующая их слуху и остроте зрения, причем в двух состояниях — normal и agree. И сравнивать эти дистанции по факту. Первый контакт по normal, а когда враг возбужден и начал погоню — по agree.
Я извиняюсь, но это не тонкости. Без этого "ядро" будет таким как сейчас.

Tetraeon 11.05.2012 15:14

Так и так нужно будит сделать отдельный массив для врагов с таким состоянием... т.е. я пока не вижу другого варианта кроме как для каждой разновидности врага сделать отдельный массив (один враг знает что герой есть и модификатор его поля (Scale x и y увеличены), а другой не знает и вообще дрыхнит где нибудь в кустах))) и его поля вообще нет.. ладно если бы он был в 1 экземпляре но их будит много, не спящих конечно, иначе это было бы, какое то сонное царство))) Если конечно нет более универсального метода. Задумка вообще отличается от того что есть сейчас... по задумке должен быть полукруг перед врагом (поле зрения), а сейчас просто круг присобаченный в центр врага... думаю со временем все будит) Интересно не сильно ли это будит напряжно для компа.. обрабатывать столько массивов... если он уже сейчас тормозит неизвестно почему.

Wolsh 11.05.2012 18:48

А что заставило Вас делать хиттестами? Есть точка в которой герой, есть координаты (точки) врагов. Есть метод у класса Point, вычисляющий дистанцию. Разве не удобнее задавать все эти параметры числами и вычислять математически, а не визуально?
Кроме того, обычно игроделы рекомендуют пользоваться сеткой/ячейками для оптимизации, чтобы не проверять гоблинов соседнего королевства, находящегося за морем. Да и еще много зачем))


Часовой пояс GMT +4, время: 23:00.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.