Поиск и перебор объектов.
| |
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
|
|
| |
|