|
[ На главную ] -- [ Список участников ] -- [ Правила форума ] -- [ Зарегистрироваться ] |
On-line: |
Game Maker Форум / Вопросы и Ответы (Для Начинающих) / Перевидите с русского на гмский |
Страницы: 1 2 Next>> |
Автор | Сообщение | ||
notna1 гроссмейстер Группа: Сообщество GM Сообщений: 226 |
Добавлено: 18-12-2006 19:06 | ||
Мне надо чтоб при нажатии на один обьект он летел к ближайшему, и у которого full=false.Как это сделать? | |||
DG Soft popww Группа: Администраторы Сообщений: 736 |
Добавлено: 18-12-2006 19:16 | ||
obj=instance_nearest(mouse_x,mouse_y,all) with(obj) if(full==false) { obj2=instance_nearest(x,y,all) move_tr..._point(obj2.x,obj2.y,10) } возможно ошибаюсь |
|||
Xelat гроссмейстер Группа: Сообщество GM Сообщений: 130 |
Добавлено: 18-12-2006 21:33 | ||
Ошибаешься, потому что этот код проверит только один ближайший объект! Ему же надо несколько сложнее. вобщем ладно, напишу как это делается: В событие Mouse Left Pressed объекта oe=collision_circle(x,y,radius,all,true,true); if (oe>0) { objs=ds_list_create(); while (oe>0) { if (oe.full==false) { move_towards_point(oe.x,oe.y,5); break; } else { ds_list_add(objs,oe.id); instance_deactivate_object(oe.id); } oe=collision_circle(x,y,radius,all,true,true); } while (!ds_list_empty(objs)) { instance_activate_object(ds_list_find_value(objs,0)); ds_list_delete(objs,0); } ds_list_destroy(objs); } |
|||
DG Soft popww Группа: Администраторы Сообщений: 736 |
Добавлено: 19-12-2006 14:07 | ||
Блин Я такую фигню наговорил | |||
DG Soft popww Группа: Администраторы Сообщений: 736 |
Добавлено: 20-12-2006 11:14 | ||
ммм... наврядли использование списков является оптимальным решением для такой простой ситуации | |||
Xelat гроссмейстер Группа: Сообщество GM Сообщений: 130 |
Добавлено: 20-12-2006 13:36 | ||
Ну хорошо, можно перебрать все объекты в комнате, и у каждого проверять full и расстояние, и запоминать айди при наименьшем расстоянии. Просто при моём методе это удобно, когда не надо проверять абсолютно все объекты, а только в определённом радиусе. Вот пожалста, второй вариант кода, с перебором всех объектов. n=instance_count; min=$ffffffff; oid=-1; for (i=0;i<n;i+=1) { if (instance_id[i].full!=false) continue; if (instance_id[i]==id) continue; pd=point_distance(x,y,instance_id[i].x,instance_id[i].y); if (pd<min) { min=pd; oid=instance_id[i]; } } |
|||
notna1 гроссмейстер Группа: Сообщество GM Сообщений: 226 |
Добавлено: 20-12-2006 20:58 | ||
А что дает такая хрень как with?? |
|||
Xelat гроссмейстер Группа: Сообщество GM Сообщений: 130 |
Добавлено: 21-12-2006 00:21 | ||
Работа с переменнымы объекта напрямую. Т.е. player.x=10; player.y=100; это тоже самое что with (player) { x=10; y=100; } |
|||
Xelat гроссмейстер Группа: Сообщество GM Сообщений: 130 |
Добавлено: 21-12-2006 00:24 | ||
Вернее даже не только с переменными. Например чтобы при обработке события Step объекта Player удалить объект Enemy нужно написать with (Enemy) instance_destroy(); |
|||
Nka Володька Группа: Сообщество GM Сообщений: 1648 |
Добавлено: 21-12-2006 00:28 | ||
короче, with(obj1) {код} засталяет объект obj1 выполнять код в фигурных скобках. | |||
Ka1miK Тут могла быть ваша реклама Группа: Сообщество GM Сообщений: 1014 |
Добавлено: 23-12-2006 22:49 | ||
К тому же главное преимущество, что если написать with(obj) {код}//obj= имя или индификатор объекта то код примениться ко всем образцам объекта. Например так можно узнать какой из образцов объекта самый близкий, короче говоря сильная конструкция заменяющая цикл |
|||
splean магистр Группа: Сообщество GM Сообщений: 443 |
Добавлено: 24-12-2006 22:47 | ||
нене, как-то сложно сделано. есть более простое решение, я более чем уверен. счас попробую, но перебор всех объектов и сравнивание расстояния это что-то не то. | |||
Ka1miK Тут могла быть ваша реклама Группа: Сообщество GM Сообщений: 1014 |
Добавлено: 24-12-2006 22:50 | ||
Я просто пример привёл, для чего его можно использовать, какой первый в голову пришёл. Само собой можно проще. |
|||
splean магистр Группа: Сообщество GM Сообщений: 443 |
Добавлено: 25-12-2006 01:46 | ||
я про основную проблему, а не про with кстати получилось. жаль нельзя сделать элегантное такое решение - смотрим ближайший объект, если full = true - смотрим ближайший к нему объект.. Но, как оказалось, ближайший образец такого же объекта это и есть сам проверяющий, проще говоря для obj1 с id 100001 ближайшим obj1 будет именно он сам, несмотря на другие 100002,3,4и т.д. А кстати если ставить слова noone или other, у меян вообще значение id возвращается -4. Наверное, это когда невозможно найти ближайший. Короче, сделать так не вышло, но вышло с деактивацией, правда это уже накладывает некоторые ограничения на использование, но вариант наиболее быстрый:
комментарии дам если непонятно |
|||
splean магистр Группа: Сообщество GM Сообщений: 443 |
Добавлено: 25-12-2006 01:54 | ||
да, думаю непонятно. Это код в объекте, который и ищет ближайший объект obj0 с переменной full=true. Работает так: находим ближайший obj0, если его full = false, деактивируем его, и снова ищем ближайший obj0. Касаемо ограничения - если не будет ниодного объекта со значением full=true, игра будет висеть. А хотя хз, щас проверю что будет. Проверил. Скажет, что неизвестная переменная full. И правильно скажет. В общем так! Это решение наиболее правильное и нет никаких ограничений. Код подправлю:
|
|||
splean магистр Группа: Сообщество GM Сообщений: 443 |
Добавлено: 25-12-2006 01:56 | ||
ваще вот) пример 7кб | |||
DreamRunner магистр Группа: Сообщество GM Сообщений: 320 |
Добавлено: 25-12-2006 10:54 | ||
instance_nearest(x,y,obj0); итак перебирает ВСЕ объекты )))) да ещё используешь её несколько раз! думаю один перебор типа for(все нжные объекты ) { если объект ближе предыдущего и фулл=1, запоминаем объект } будет быстрее всего. Тем более мы не коллизии проверяем а расстояние между точками, что довольно быстро. вот и всё. Даже код ломает писать) |
|||
splean магистр Группа: Сообщество GM Сообщений: 443 |
Добавлено: 25-12-2006 11:03 | ||
что это значит? инстанс_ниарест дает нам id ближайшего объекта obj0 к точке (x,y). ДАЖЕ Если у него фулл не такой как нам нужен, он ВСЕ РАВНО будет ближайшим. Как перейти к следующему объекту? Я не смог найти такого, поэтому решил деактивировать не нужные на время. Фраза "если объект ближе предыдущего" как будет выглядеть по твоему на гмл? | |||
Xelat гроссмейстер Группа: Сообщество GM Сообщений: 130 |
Добавлено: 25-12-2006 11:40 | ||
DreamRunner, вообще-то именно этот код я и написал немного выше... | |||
DreamRunner магистр Группа: Сообщество GM Сообщений: 320 |
Добавлено: 25-12-2006 11:56 | ||
а ты думаешь он заранее знает какой ближайший? :) он тоже перебирает внутри себя все объекты и выдаёт один.
я про этот кусок: pd=point_distance(x,y,instance_id[i].x,instance_id[i].y); if (pd<min) { min=pd; oid=instance_id[i]; }
именно. это кстати очень похоже на пример из хелпа :) Собственно подобный вопрос там и разбирается. |
Страницы: 1 2 Next>> |
Game Maker Форум / Вопросы и Ответы (Для Начинающих) / Перевидите с русского на гмский |