Пятница, 24 ноября 2017, 01:24

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
Страница 1 из 11
Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker Studio » instance_nearest (Очередь из ближних)
instance_nearest
MrSlapДата: Понедельник, 23 октября 2017, 00:35 | Сообщение # 1
почетный гость
Сейчас нет на сайте
Ребята. помогите сделать что-то а-ля цепная молния. Соль в том, чтобы она цепляла каждого следующего ближайшего и не могла вернуться ни к одному из уже задетых.
Код

var inst, xx;
xx = x;
x -= 10000;
inst = instance_nearest(xx, y, object_index);
if inst != id
    {
    draw_line(x, y, inst.x, inst.y);
    }
x += 10000;


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


Создаю интерактивную повесть.

Сообщение отредактировал MrSlap - Понедельник, 23 октября 2017, 00:35
ASH2Дата: Вторник, 24 октября 2017, 16:06 | Сообщение # 2
участник
Сейчас нет на сайте
MrSlap, что-то мне подсказывает, что подобное у тебя не получится сделать с помощью instance_nearest, так как он берёт только 1-ый ближайший экземпляр.
Думаю, надо обxодить все экземпляры и просчитывать расстояние. А со списком - да, лучше его использовать, чтобы хранить в нём id объектов, в которых уже был, чтобы не повторяться


Карсон и Питееерс!!!
MrSlapДата: Вторник, 24 октября 2017, 21:31 | Сообщение # 3
почетный гость
Сейчас нет на сайте
ASH2, я уже пробовал шестью разными способами. Но где-то я что-то упускаю... Может реально при запуске заклинания создавать список объектов в радиусе поражения, и в порядке этого списка направлять в нужную сторону спецэффект, и при пересечении его с координатами объекта из списка, удалять его оттуда, и менять кординаты дирекшна на следующий объект в списке?...
Значит нужны instance_number и ds_list. Будем думать.


Создаю интерактивную повесть.
GrannerДата: Среда, 25 октября 2017, 09:56 | Сообщение # 4
частый гость
Сейчас нет на сайте
А если делать в объекте переменную-маркер типа "0" - еще не поражен, "1" - стал целью заклинания? И в проверке instance_nearest делать еще одну проверку по этому маркеру: если переменная 0, то молния бьет по цели и переменная становится 1, а если 1 - то не трогаем.

Лучше - быть, чем - казаться.
P.S. Прежде чем задавать вопрос - всегда просматриваю форум и справку
ASH2Дата: Среда, 25 октября 2017, 12:21 | Сообщение # 5
участник
Сейчас нет на сайте
Granner, а если он 2 раза заклинание использовать захочет? Да и смысл? instance_nearest найдёт только ближайший объект вне зависимости от маркера.

MrSlap, не до конца понял, как это поможет. В любом случае, вот тебе небольшой код для решения твоей проблемы, где arrObj - список объектов в последовательности обхода. Я предполагал, что помещаться этот код будет в Create объекта "заклинание" или "проджектайл" или что там у тебя. На текущий момент, расчёты делаются одномоментно при создании, так что если у тебя предметы двигаются или заклинание не мгновенное - нужно переписывать (но, я думаю, с этим ты справишься). Код писал тупо в блокноте, поэтому присутствуют подробные комментарии на случай, если я где-то что-то накосячил

Код

//Create
arrObj=ds_list_create(); //список с объектами, которые будем обходить

nRad=1000; // радиус, в котором ищем (ну, сейчас пусть 1000 будет)

//Координаты. Изначально - такие, как у объекта
nX=x;
nY=y;

repeat(nCount)// nCount - сколько раз максимально можем прыгать по объектам
{
nMin=nRad;//ставим минимальное растояние - радиусом, чтобы дальше не искало
idObj=-1;//пока никакой объект мы не нашли
with (Object)//Обходим все объекты Object
{
  if (ds_list_find_index(other.arrObj, id)==-1) //если данного объекта нет в списке...
  {
   nDist=point_distance(other.nX, other.nY, x, y); //считаем расстояние
   if (nDist<other.nMin) //Если расстояние меньше минимума на текущий момент
   {
    other.nMin=nDist;//обновляем минимум
    other.idObj=id;//Записываем в переменную id объекта
   }
  }
}
if (idObj==-1)//если мы не нашли объектов поблизости..
{
  break; //то и не фиг дальше искать
}
//иначе
ds_list_add(arrObj,idObj);// добавляем его id в список
nX=idObj.x;//обновляем координаты, чтобы следующий ближайший объект считался от предыдущего, а не от первого
nY=idObj.y;
}
}


Карсон и Питееерс!!!

Сообщение отредактировал ASH2 - Среда, 25 октября 2017, 12:26
MrSlapДата: Суббота, 28 октября 2017, 14:53 | Сообщение # 6
почетный гость
Сейчас нет на сайте
ASH2, так. Спасибо. Если список просчитывается на репите в момент создания, значит, что закл полетит только в точку последнего значения, высчетанного репитом. А если поместить в столкновение с объектом, тогда, в случае, если ближайший нужный объект будет находиться по направлению ЗА текущим, то он просто не пролетит насквозь, так как события столкновения останавливают движение объекта.
Ну, и кстати, летит он далеко не в ближний объект, наверняка как раз после всех рассчётов.
Чего-то я не до конца понимаю как дата списки работают.

Или я просто тупее, чем думал )))


Создаю интерактивную повесть.
ASH2Дата: Вторник, 31 октября 2017, 13:24 | Сообщение # 7
участник
Сейчас нет на сайте
MrSlap, я думаю, что тебе надо почитать как работают списки...

ds_list_add(arrObj,idObj);- объект добавляется в список, arrObj - получается списком с объектами, где 0 - это ближайший, 1 - следующий за ближайшим, 2 - следующий за следующим за ближайшим и так до nCount-1...
nX,nY - это не координаты, куда лететь надо, это, так сказать, промежуточные значения для расчёта. Координаты куда лететь получаешь по координатам объекта назначения (как я и говорил, объекты все в списке)

На всякий случай: доступ к элементам списка осуществляется через прямую черту, т.е. arrObj[|0] - первый элемент списка, arrObj[|1] - второй элемент списка и т.д.


Карсон и Питееерс!!!
MrSlapДата: Вторник, 31 октября 2017, 15:04 | Сообщение # 8
почетный гость
Сейчас нет на сайте
ASH2, всё! Я понял. Вроде очевидно, но не мог взять в толк! Ща замутим! Спасибо!
Кстати, а очищать ds_list не надо по завершению программы? Типа как с партиклами и эмиттерами?


Создаю интерактивную повесть.
ASH2Дата: Вторник, 31 октября 2017, 15:37 | Сообщение # 9
участник
Сейчас нет на сайте
MrSlap, Вот тут в разделе "Как работают функции создания"

Карсон и Питееерс!!!
MrSlapДата: Вторник, 14 ноября 2017, 19:19 | Сообщение # 10
почетный гость
Сейчас нет на сайте
ASH2, значит я был прав, насчёт очистки и удаления списка. А точно никак не применить это правило к nearest? типа искать ближайшего к номеру в списке, кроме самого себя? Это вроде звучит логично. Просто непонятно, как исключить самого себя. Даже офф. справка GMS говорит, что надо перед выбором instance_nearest убрать сам экземпляр объекта кординатно на -10000, чтобы функция его не обнаружила. Кривулина какая-то. Потому что по instance find он же ищет по порядку добавления в комнату. то есть полёт снаряда в принципе не предсказуем.

Создаю интерактивную повесть.
Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker Studio » instance_nearest (Очередь из ближних)
Страница 1 из 11
Поиск:

Все права сохранены. GcUp.ru © 2008-2017 Рейтинг