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 он же ищет по порядку добавления в комнату. то есть полёт снаряда в принципе не предсказуем.
Создаю интерактивную повесть.
|
|
| |
|