Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 11.05.2012, 01:38
Tetraeon вне форума Посмотреть профиль Отправить личное сообщение для Tetraeon Найти все сообщения от Tetraeon
  № 1  
Ответить с цитированием
Tetraeon

Регистрация: May 2012
Сообщений: 166
Question Значение 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;
					}
				}
			}
}
Видите ли вы тут ошибку? и как бы вы сделали?

Старый 11.05.2012, 02:19
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 2  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
Видите ли вы тут ошибку?
Вижу лишнюю скобку.
Цитата:
и как бы вы сделали?
Убрал бы лишнюю скобку.
Про true не понял. В коде никаких true не наблюдается.

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

Старый 11.05.2012, 08:32
Tetraeon вне форума Посмотреть профиль Отправить личное сообщение для Tetraeon Найти все сообщения от Tetraeon
  № 3  
Ответить с цитированием
Tetraeon

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


Последний раз редактировалось Tetraeon; 11.05.2012 в 09:05.
Старый 11.05.2012, 11:03
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 4  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Во-первых, не надо шустрить массивы каждый раз, когда Вам нужен элемент. На протяжении огромного куска кода Вы работаете с одним и тем же элементом, и каждый раз заставляете плеер искать массив и искать элемент в нем. Когда можно просто сохранить ссылку на этот элемент в начале витка цикла.
Код 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;
			}
		}
	}
}
__________________
Reality.getBounds(this);

Старый 11.05.2012, 11:36
Tetraeon вне форума Посмотреть профиль Отправить личное сообщение для Tetraeon Найти все сообщения от Tetraeon
  № 5  
Ответить с цитированием
Tetraeon

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


Последний раз редактировалось Tetraeon; 11.05.2012 в 12:50.
Старый 11.05.2012, 13:05
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 6  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Как-то странно они догоняют героя, что он становится от них дальше, чем был, не находите?
Вообще, по поводу "agree", дистанция обнаружения всегда должна быть меньше дистанции преследования обнаруженного, по логике вещей. Когда герой привлек внимание и враг знает, что здесь герой, он более внимателен к его местоположению, да?)) В то время как из состояния "не замечен" герой может подкрасться к врагу почти вплотную, пока тот его увидит. Но увидев, уже сможет видеть его и на гораздо большей дистанции.
__________________
Reality.getBounds(this);

Старый 11.05.2012, 13:25
Tetraeon вне форума Посмотреть профиль Отправить личное сообщение для Tetraeon Найти все сообщения от Tetraeon
  № 7  
Ответить с цитированием
Tetraeon

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

Старый 11.05.2012, 13:50
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 8  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Ну я бы, во-первых, сделал у героя дистанцию "явного присутствия". То есть дистанция, на которой герой однозначно виден и шумит. Эту дистанцию можно править бонусами к "скрытности" например. А у врагов может быть своя дистанция, соответствующая их слуху и остроте зрения, причем в двух состояниях — normal и agree. И сравнивать эти дистанции по факту. Первый контакт по normal, а когда враг возбужден и начал погоню — по agree.
Я извиняюсь, но это не тонкости. Без этого "ядро" будет таким как сейчас.
__________________
Reality.getBounds(this);

Старый 11.05.2012, 15:14
Tetraeon вне форума Посмотреть профиль Отправить личное сообщение для Tetraeon Найти все сообщения от Tetraeon
  № 9  
Ответить с цитированием
Tetraeon

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


Последний раз редактировалось Tetraeon; 11.05.2012 в 15:30.
Старый 11.05.2012, 18:48
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 10  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
А что заставило Вас делать хиттестами? Есть точка в которой герой, есть координаты (точки) врагов. Есть метод у класса Point, вычисляющий дистанцию. Разве не удобнее задавать все эти параметры числами и вычислять математически, а не визуально?
Кроме того, обычно игроделы рекомендуют пользоваться сеткой/ячейками для оптимизации, чтобы не проверять гоблинов соседнего королевства, находящегося за морем. Да и еще много зачем))
__________________
Reality.getBounds(this);

Создать новую тему Ответ Часовой пояс GMT +4, время: 21:09.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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