| 
	
		
		
			| Поиск и перебор объектов. |  |  |  | 
| Sholar | Дата: Четверг, 17 Июня 2010, 11:36 | Сообщение # 1 |  |   Draw With Me Сейчас нет на сайте | Доброго времени суток... помогите как можно сделать поиск, и присвоение объектов. Объясню поподробнее. Есть объект, противник, есть группа, нейтралы, в этой группе находиться 2+ объектов, посредством Parent. Противник должен производить поиск и захватывать в таргет ближайшего противника, после чего в скрипте проверки, должны проверятся, какой он, нейтрал или свой, количество жизней, и состояние объекта, тем самым осуществляя перебор объектов (если в области работы противника находица 2+ нейтрала). на данный момент я имею код не законченный... сопственно вот   Code  if P_ONATK<=0{ if instance_exists(O_HUMAN){if abs(x-TARGET.x)<400 and abs(y-TARGET.y)<400{
 if TARGET=self{TARGET=instance_nearest(x,y,O_HUMAN)}
 if TARGET.P_DEATH=0{
 P_BULLET=instance_create(x,y-82,O_BULLET_DARK_TOWER1);
 P_BULLET.direction=point_direction(x,y-82,TARGET.x,TARGET.y-16)
 P_BULLET.speed=16
 P_ONATK=1}}
 else{TARGET=self}
 }}
В этом скрипте, происходит поиск цели в радиусе 400 пкс, и первый попавший объект ХУМАН, если он жив, будет захвачен в таргет, и будет вести огонь пока не убьёт. Но вот после смерти, таргет не поменяется, пока кто то из объектов группы ХУМАН не подойдёт ближе чем объект который был до этого в таргете... надеюсь вы меня поняли, жду помощи. Зарание спс.
 Использую ГМ8
 
 https://vk.com/g_sholar
 
 
 Сообщение отредактировал DrawPlayer - Четверг, 17 Июня 2010, 11:38 |  |  |  |  |  | 
| Made_In_USSR | Дата: Четверг, 17 Июня 2010, 12:23 | Сообщение # 2 |  | заслуженный участник Сейчас нет на сайте | Quote (DrawPlayer) Но вот после смерти, таргет не поменяется, пока кто то из объектов группы ХУМАН не подойдёт ближе чем объект который был до этого в таргете... надеюсь вы меня поняли, жду помощи.
 Code else { TARGET=self
 P_ONATK=0}
первое что пришло на ум.
 
 Новичкам изучающим GML кликать сюда.
 Много примеров, исходников, библиотек и вообще всего что вам только может пригодиться. Автор портала, прости меня за ссылку, наболело =)
 |  |  |  |  |  | 
| Sholar | Дата: Четверг, 17 Июня 2010, 12:37 | Сообщение # 3 |  |   Draw With Me Сейчас нет на сайте | Не работает... атака он не стреляет, но при поиске, находит труп, но т.к. атака = 0 (т.к. не стрелять) и таргет селф, он просто стоит, и ждёт кого по ближе с переменной DEATH = 1 
 https://vk.com/g_sholar
 |  |  |  |  |  | 
| Made_In_USSR | Дата: Четверг, 17 Июня 2010, 12:49 | Сообщение # 4 |  | заслуженный участник Сейчас нет на сайте | А ты врагов после смерти уничтожай, а на их месте создавай трупы другим обьектом, не реагирующим на скрипт. Добавлено (17.06.2010, 12:49)---------------------------------------------
 какой код у тебя переключает переменную p_death, процитируй.
 
 Новичкам изучающим GML кликать сюда.
 Много примеров, исходников, библиотек и вообще всего что вам только может пригодиться. Автор портала, прости меня за ссылку, наболело =)
 |  |  |  |  |  | 
| Sholar | Дата: Четверг, 17 Июня 2010, 13:05 | Сообщение # 5 |  |   Draw With Me Сейчас нет на сайте | Quote какой код у тебя переключает переменную p_death, процитируй.Простой, в объекте стоит условие:
 
 Code  if P_HP<=0 {P_DEATH=1}  Quote А ты врагов после смерти уничтожай, а на их месте создавай трупы другим обьектом, не реагирующим на скрипт.Есть как вариант, но тогда нужно переделать много вещей. На данный момент стремлюсь к такому плану.
 ЗЫ. в нейтралах может оказаться и игрок, а после смерти и уничтожения его, много что навернётся (интерфейс, привязки к нему и т.п.) поэтому ищу вариант обойтись без удаления объекта.
 
 https://vk.com/g_sholar
 |  |  |  |  |  | 
| Made_In_USSR | Дата: Четверг, 17 Июня 2010, 13:21 | Сообщение # 6 |  | заслуженный участник Сейчас нет на сайте | Quote (DrawPlayer) if P_ONATK<=0{ if instance_exists(O_HUMAN){if abs(x-TARGET.x)<400 and abs(y-TARGET.y)<400Проблема вот здесь! Опять же методом тыка. Меняй target.x и target.y на object_name.x и object_name.y.
 Эта строчка пыталась найти ближайшую цель, вместо того чтобы искать ближайший инстанс. Ну мне так кажется
   
 Новичкам изучающим GML кликать сюда.
 Много примеров, исходников, библиотек и вообще всего что вам только может пригодиться. Автор портала, прости меня за ссылку, наболело =)
 |  |  |  |  |  | 
| Sholar | Дата: Четверг, 17 Июня 2010, 13:35 | Сообщение # 7 |  |   Draw With Me Сейчас нет на сайте | ТАРГЕТ это переменная в которой идёт захват, т.к. если нейтрал подошёл на 400, враг взял в таргет, и что бы если другой нейтрал не подошёл ближе, и не поменялся таргет, я сделал присвоение цели для противника, с условием в радиусе 400 и он жив... ЗЫ менял на ХУМАН в строке проверки, всё также, только стреляет всего по ближайшему противнику, а такой задумки небыло...
  ЗЫ я тут думаю может както через масив всё сделать... допустим все (число) объектов ХУМАН, определять через масив, и в масиве, делать перебор объектов, по критериям... но вот как это воплотить я не знаю... 
 https://vk.com/g_sholar
 |  |  |  |  |  | 
| NeZnayu | Дата: Четверг, 17 Июня 2010, 13:41 | Сообщение # 8 |  | __танцуй!__ Сейчас нет на сайте | with enemy {if distance_to_object(player)<400
 player.count+=1}
 
 CombatForce - 2d TDS долгожданный релиз
 Noobster - самый простой конструктор игр в мире
 LaLaLaLAMA! - игра не про Ламу
 |  |  |  |  |  | 
| Sholar | Дата: Четверг, 17 Июня 2010, 14:29 | Сообщение # 9 |  |   Draw With Me Сейчас нет на сайте | Quote with enemy {if distance_to_object(player)<400
 player.count+=1}
 а поподробнее можно... как я понял к объекту противк, идёт сравнение, и увеличивает значение...ммм.. поподробнее...
 
 https://vk.com/g_sholar
 |  |  |  |  |  | 
| Made_In_USSR | Дата: Четверг, 17 Июня 2010, 15:29 | Сообщение # 10 |  | заслуженный участник Сейчас нет на сайте | Quote (DrawPlayer) TARGET=instance_nearest(x,y,O_HUMAN)Тут не очень понятно. Цель выбирается вне зависимости от того, жива она или нет. Нужно условие при котором исключается из перебора мертвая цель.
 Добавлено (17.06.2010, 15:29)---------------------------------------------
 А вот для этого как раз нужен массив, который содержит айди живых инстансов. Из них будет вестись перебор ближайшего к обьекту инстанса после чего следует его захват и атака.
 
 Новичкам изучающим GML кликать сюда.
 Много примеров, исходников, библиотек и вообще всего что вам только может пригодиться. Автор портала, прости меня за ссылку, наболело =)
 |  |  |  |  |  | 
| NeZnayu | Дата: Четверг, 17 Июня 2010, 15:48 | Сообщение # 11 |  | __танцуй!__ Сейчас нет на сайте | Ребят, сори я сейчас с телефона, чуть позже подробно все опишу. Точно могу сказать что массив не нужен. Просто перебирать надо в объекте противника, а не в герое. 
 CombatForce - 2d TDS долгожданный релиз
 Noobster - самый простой конструктор игр в мире
 LaLaLaLAMA! - игра не про Ламу
 |  |  |  |  |  | 
| Sholar | Дата: Пятница, 18 Июня 2010, 07:56 | Сообщение # 12 |  |   Draw With Me Сейчас нет на сайте | Code TARGET=instance_nearest(x,y,O_HUMAN) ...
 if TARGET.P_DEATH=0{
 Условие есть, но не на выбор цели а на стрельбу противника...    Code Ребят, сори я сейчас с телефона, чуть позже подробно все опишу. Точно могу сказать что массив не нужен. Просто перебирать надо в объекте противника, а не в герое. на противнике, т.к. он же будет вести огонь, следовательно все сравнения должны быть в нём... как мне кажется
 
 https://vk.com/g_sholar
 |  |  |  |  |  | 
| Decedent | Дата: Пятница, 18 Июня 2010, 11:15 | Сообщение # 13 |  | почетный гость Сейчас нет на сайте | Quote (DrawPlayer) Условие есть, но не на выбор цели а на стрельбу противника...Обьясню. Сейчас происходит следующее: сперва выбирается цель в радиусе (живая или мертвая). После этого выполняется проверка жива ли цель, а уже после, если она жива — открывается огонь.
 А должно быть следующее. Определяется обьект в радиусе, выполняется проверка, живая цель или нет. После этого выполняется выбор цели (если удовлетворяет условие) и открывается огонь, если цель выбрана. В противном случае (если не удовлетворяет условие) продолжить выбор цели пока условие не выполнится.
 
 Quote (DrawPlayer) на противнике, т.к. он же будет вести огонь, следовательно все сравнения должны быть в нём... как мне кажетсяСравнения могут быть в любом обьекте, можно использовать невидимый обьект контроллер к примеру. Хотя могут возникнуть проблемы с адресацией. Что имел ввиду NeZnayu я не понял. Ждем. Мне тоже не лишним будет глянуть что к чему (у меня похожая система боевки).
 |  |  |  |  |  | 
| NeZnayu | Дата: Пятница, 18 Июня 2010, 13:56 | Сообщение # 14 |  | __танцуй!__ Сейчас нет на сайте | Так, признаюсь - я запутался. Можете пожалуйста еще раз цель сформулировать.
 Нужно чтобы противник выбирал ближайшего нейтрала в радиусе 400 и атаковал его?
 
 CombatForce - 2d TDS долгожданный релиз
 Noobster - самый простой конструктор игр в мире
 LaLaLaLAMA! - игра не про Ламу
 |  |  |  |  |  | 
| Decedent | Дата: Пятница, 18 Июня 2010, 20:35 | Сообщение # 15 |  | почетный гость Сейчас нет на сайте | Quote (NeZnayu) Нужно чтобы противник выбирал ближайшего нейтрала в радиусе 400 и атаковал его?Не противник, — персонаж которым управляем. Выбирал ближайшего живого нейтрала (того у которого dead=0).
 
 
 Сообщение отредактировал Decedent - Пятница, 18 Июня 2010, 20:37 |  |  |  |  |  | 
| NeZnayu | Дата: Пятница, 18 Июня 2010, 21:51 | Сообщение # 16 |  | __танцуй!__ Сейчас нет на сайте | В объекте врага:  //Определяем расстояние до игрока dist=distance_to_object(player)
 //Определяем ближайшего врага
 nearest_enemy=instance_nearest(x,y,enemy)
  //Если не мертв if dead!=true
 {
 //Если расстояние до игрока меньше 400
 if dist<400
 {
 //Если расстояние до игрока меньше чем расстояние от ближайшего врага до игрока
 if point_distance(x,y,player.x,player.y)<point_distance(nearest_enemy.x,nearest_enemy.y,player.x,player.y)
 {
 //Передаем игроку идентификатор для атаки
 player.atack=id
 }
 }
 }
 
 CombatForce - 2d TDS долгожданный релиз
 Noobster - самый простой конструктор игр в мире
 LaLaLaLAMA! - игра не про Ламу
 |  |  |  |  |  | 
| Sholar | Дата: Суббота, 19 Июня 2010, 15:29 | Сообщение # 17 |  |   Draw With Me Сейчас нет на сайте | Quote В объекте врага:   //Определяем расстояние до игрока   dist=distance_to_object(player)   //Определяем ближайшего врага   nearest_enemy=instance_nearest(x,y,enemy)   //Если не мертв if dead!=true
 {
 //Если расстояние до игрока меньше 400
 if dist<400
 {
 //Если расстояние до игрока меньше чем расстояние от ближайшего врага до игрока
 if point_distance(x,y,player.x,player.y)<point_distance(nearest_enemy.x,nearest_enemy.y,player.x,player.y)
 {
 //Передаем игроку идентификатор для атаки
 player.atack=id
 }
 }
 }
+1 Спс.
 Добавлено (19.06.2010, 15:29)---------------------------------------------
 
 Quote В объекте врага:   //Определяем расстояние до игрока   dist=distance_to_object(player)   //Определяем ближайшего врага   nearest_enemy=instance_nearest(x,y,enemy)   //Если не мертв if dead!=true
 {
 //Если расстояние до игрока меньше 400
 if dist<400
 {
 //Если расстояние до игрока меньше чем расстояние от ближайшего врага до игрока
 if point_distance(x,y,player.x,player.y)<point_distance(nearest_enemy.x,nearest_enemy.y,player.x,player.y)
 {
 //Передаем игроку идентификатор для атаки
 player.atack=id
 }
 }
 }
+1 Спс.
 
 https://vk.com/g_sholar
 |  |  |  |  |  
 |