Захват цели и объединение объектов
| |
MrSlap | Дата: Воскресенье, 03 Августа 2014, 00:08 | Сообщение # 1 |
почетный гость
Сейчас нет на сайте
| Здравствуйте, рукастые форумчане. Доброго времени суток. У меня две фичи, которые я никак не могу реализовать:
1. Как сделать выбор определенного объекта (захват цели)?
2. Как сделать, стак объектов?
|
|
| |
миха | Дата: Воскресенье, 03 Августа 2014, 22:13 | Сообщение # 2 |
почти ветеран
Сейчас нет на сайте
| Ну по идее можно циклом перебрать все эти объекты и закинуть в массив, я его назвал select. Код не проверял, но попробуй. При наличии массива с идами объектов, реализовать переключение, думаю, не проблема
for (i=0;i<instance_number(объект);i++) { select[i]=instance_find(объект, i) }Добавлено (03.08.2014, 22:13) --------------------------------------------- По второму: когда объект берешь мышью - удаляй его и отрисовывай draw'ом на мыши его спрайт, храни название объекта, который на мыши, в какой нибудь переменной. При клике по второму предмету сравнивай название объекта, по которому кликнули с переменной, в которой хранится имя объекта на мыши. Если истина - обнуляй переменную, снимай отрисовку, добавляй кол-во к объекту, на котором кликнул
|
|
| |
MrSlap | Дата: Вторник, 05 Августа 2014, 20:13 | Сообщение # 3 |
почетный гость
Сейчас нет на сайте
| миха, спасибо, попробую этот цикл, похоже, это то, что нужно. Насчёт второго - не получится. Объект, будучи брошенным из инвентаря в случайную точку вокруг персонажа, может упасть на такой же объект. Мышь в геймплее не участвует )
Создаю интерактивную повесть.
|
|
| |
system | Дата: Вторник, 05 Августа 2014, 20:33 | Сообщение # 4 |
заслуженный участник
Сейчас нет на сайте
| с гмл не знаком, но думаю для создания стака тебе нужна переменная, изначально равна 0 и вот сколько штук этого обьекта тебе надо взять, столько к этой переменной прибавляется, а в инвинтаре (или где там стак твой будет) просто отрисовуешь спрайт вместе с текстом, который равен значению переменной. В общем как-то так но вполне вероятно что для гмл это не подойдет...
Сообщение отредактировал system - Вторник, 05 Августа 2014, 20:44 |
|
| |
миха | Дата: Вторник, 05 Августа 2014, 20:49 | Сообщение # 5 |
почти ветеран
Сейчас нет на сайте
| system, почему ж не пойдет?) так и надо делать, просто проблема в другом) MrSlap, скорее всего, придется в третьем объекте это прописывать... Например, циклом, как тот, который выше, пробираем все экземпляры предмета (а лучше родителя всех предметов) и проверяем наличие на их x,y подобного объекта. Если да, грохаем один из объектов, например первый, который у нас нашелся циклом, а второму кол-во прибавляем. Сам код напишешь?
|
|
| |
system | Дата: Вторник, 05 Августа 2014, 20:55 | Сообщение # 6 |
заслуженный участник
Сейчас нет на сайте
| миха, ну я в своей жизни ни одной строчки не написал, логику понял по Construct classic) и написал процесс, как бы я там это реализовал
|
|
| |
MrSlap | Дата: Вторник, 05 Августа 2014, 23:22 | Сообщение # 7 |
почетный гость
Сейчас нет на сайте
| миха, да, с кодом справлюсь, идея ясна. Будем попробовать. Добавлено (05.08.2014, 23:22) --------------------------------------------- миха, instance_number выдаёт все объекты в комнате. То есть, если код выделяет мне один предмет и я не буду переключать таргет, то подойдя к другому предмету в другом конце комнаты, таргет всё равно покажет тот предмет, что был зафиксирован ранее. Как бы мне выделить в массив ТОЛЬКО предметы, находящиеся в радиусе.
Я думал сделать так:
Код for (i=0; i<instance_number(obj_items); i+=1) { if keyboard_check_pressed(key[8]) { number+=1 if number>i number=0 } if distance_to_object(obj_items)<300 { select[i]=instance_find(obj_items, i) with select[i] { showNAME=false } with select[number] { showNAME=true }
} else { for (i=0; i<instance_number(obj_items); i+=1) { with select[i] { showNAME=false } } } }
но при нажатии клавиши переменная number просто принимает последнее значение. Где-то, может быть, не хватает выхода из цикла.
Создаю интерактивную повесть.
|
|
| |
миха | Дата: Вторник, 05 Августа 2014, 23:56 | Сообщение # 8 |
почти ветеран
Сейчас нет на сайте
| MrSlap, а я бы на твоем месте просто массив отсортировал по дальности. Это можно сделать классическим способом. Надеюсь, я ничего не путаю, попробуй. for (i=instance_number(obj_items)-1;i>=0;i-=1) { for (j=0;j<=i;j++) { if distance_to_object(select[j])>distance_to_object(select[j+1]) { TempVar=select[j] select[j]=select[j+1] select[j+1]=TempVar } } }
Это, если я не напутал что то в коде, ибо спать пора, отсортирует твой массив селект так, что объекты, до которых меньшее расстояние - будут в начале, чем больше - тем дальше. При переключении между объектами можно смотреть следующую строку массива, смерять расстояние до объекта из нее, и, если он совсем далеко, перекидывать снова на нулевой, самый ближний объект. Как то так
|
|
| |
MrSlap | Дата: Среда, 06 Августа 2014, 20:09 | Сообщение # 9 |
почетный гость
Сейчас нет на сайте
| миха, что-то я никак не пойму, куда встраивать этот код. И что в итоге из себя представляет TempVar...
Создаю интерактивную повесть.
|
|
| |
миха | Дата: Среда, 06 Августа 2014, 22:11 | Сообщение # 10 |
почти ветеран
Сейчас нет на сайте
| MrSlap, TempVar - временная переменная. Я ее использую чтобы просто поменять местами значения из select[j] и select[j+1]. А код этот сорирует массив так, что чем ближе к игроку объект, тем ближе к началу массива его ид. скорее всего, сразу после того кода, который я описывал до этого. Цитата for (i=0;i<instance_number(объект);i++) { select[i]=instance_find(объект, i) } этим мы собрали все объекты в массив, и тут же сортируем Цитата for (i=instance_number(obj_items)-1;i>=0;i-=1) { for (j=0;j<=i;j++) { if distance_to_object(select[j])>distance_to_object(select[j+1]) { TempVar=select[j] select[j]=select[j+1] select[j+1]=TempVar } } }
|
|
| |
MrSlap | Дата: Суббота, 16 Августа 2014, 19:55 | Сообщение # 11 |
почетный гость
Сейчас нет на сайте
| миха, ошибка вылезает, не нравится ему массив... Толи я совсем глупый...
Push :: Execution Error - Variable Index [0,18] out of range [1,18] - -1.select(100061,18) at gml_Object_obj_hero_Step_0 (line 118) - if distance_to_object(select[j])>distance_to_object(select[j+1])
Создаю интерактивную повесть.
|
|
| |
миха | Дата: Суббота, 16 Августа 2014, 21:48 | Сообщение # 12 |
почти ветеран
Сейчас нет на сайте
| Цитата for (i=instance_number(obj_items)-1;i>=0;i-=1) Замени -1 на -2
|
|
| |
|