Перевидите с русского на гмский

  Вход на форум   логин       пароль   Забыли пароль? Регистрация
On-line:  

Раздел: 
Game Maker Форум / Вопросы и Ответы (Для Начинающих) / Перевидите с русского на гмский

Страницы: 1 2 Next>> новая тема

Автор Сообщение

гроссмейстер
Группа: Сообщество GM
Сообщений: 226
Добавлено: 18-12-2006 19:06
Мне надо чтоб при нажатии на один обьект он летел к ближайшему, и у которого full=false.Как это сделать?

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)
}
возможно ошибаюсь

гроссмейстер
Группа: Сообщество 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);
}

popww
Группа: Администраторы
Сообщений: 736
Добавлено: 19-12-2006 14:07
Блин Я такую фигню наговорил

popww
Группа: Администраторы
Сообщений: 736
Добавлено: 20-12-2006 11:14
ммм... наврядли использование списков является оптимальным решением для такой простой ситуации

гроссмейстер
Группа: Сообщество 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];
}
}

гроссмейстер
Группа: Сообщество GM
Сообщений: 226
Добавлено: 20-12-2006 20:58
А что дает такая хрень как with??

гроссмейстер
Группа: Сообщество GM
Сообщений: 130
Добавлено: 21-12-2006 00:21
Работа с переменнымы объекта напрямую. Т.е.
player.x=10;
player.y=100;

это тоже самое что
with (player) {
x=10;
y=100;
}

гроссмейстер
Группа: Сообщество GM
Сообщений: 130
Добавлено: 21-12-2006 00:24
Вернее даже не только с переменными. Например чтобы при обработке события Step объекта Player удалить объект Enemy нужно написать
with (Enemy) instance_destroy();

Володька
Группа: Сообщество GM
Сообщений: 1648
Добавлено: 21-12-2006 00:28
короче, with(obj1) {код} засталяет объект obj1 выполнять код в фигурных скобках.

Тут могла быть ваша реклама
Группа: Сообщество GM
Сообщений: 1014
Добавлено: 23-12-2006 22:49
К тому же главное преимущество, что если написать
with(obj) {код}//obj= имя или индификатор объекта
то код примениться ко всем образцам объекта. Например так можно узнать какой из образцов объекта самый близкий, короче говоря сильная конструкция заменяющая цикл

магистр
Группа: Сообщество GM
Сообщений: 443
Добавлено: 24-12-2006 22:47
нене, как-то сложно сделано. есть более простое решение, я более чем уверен. счас попробую, но перебор всех объектов и сравнивание расстояния это что-то не то.

Тут могла быть ваша реклама
Группа: Сообщество GM
Сообщений: 1014
Добавлено: 24-12-2006 22:50
Я просто пример привёл, для чего его можно использовать, какой первый в голову пришёл. Само собой можно проще.

магистр
Группа: Сообщество GM
Сообщений: 443
Добавлено: 25-12-2006 01:46
я про основную проблему, а не про with

кстати получилось. жаль нельзя сделать элегантное такое решение - смотрим ближайший объект, если full = true - смотрим ближайший к нему объект.. Но, как оказалось, ближайший образец такого же объекта это и есть сам проверяющий, проще говоря для obj1 с id 100001 ближайшим obj1 будет именно он сам, несмотря на другие 100002,3,4и т.д. А кстати если ставить слова noone или other, у меян вообще значение id возвращается -4. Наверное, это когда невозможно найти ближайший.

Короче, сделать так не вышло, но вышло с деактивацией, правда это уже накладывает некоторые ограничения на использование, но вариант наиболее быстрый:

do
{
someid=instance_nearest(x,y,obj0);
full=someid.full
if someid.full=false
{
instance_deactivate_object(someid);
}
}
until (full=true);
show_message(string(someid));

instance_activate_all();


комментарии дам если непонятно


магистр
Группа: Сообщество GM
Сообщений: 443
Добавлено: 25-12-2006 01:54
да, думаю непонятно. Это код в объекте, который и ищет ближайший объект obj0 с переменной full=true. Работает так: находим ближайший obj0, если его full = false, деактивируем его, и снова ищем ближайший obj0. Касаемо ограничения - если не будет ниодного объекта со значением full=true, игра будет висеть. А хотя хз, щас проверю что будет.
Проверил. Скажет, что неизвестная переменная full. И правильно скажет. В общем так! Это решение наиболее правильное и нет никаких ограничений. Код подправлю:

do
{
someid=instance_nearest(x,y,obj0);
if !instance_exists(someid) { someid=id; break; }
full=someid.full
if someid.full=false
{
instance_deactivate_object(someid);
}
}
until (full=true);
show_message(string(someid));

instance_activate_object(obj0);

магистр
Группа: Сообщество GM
Сообщений: 443
Добавлено: 25-12-2006 01:56
ваще вот) пример 7кб

магистр
Группа: Сообщество GM
Сообщений: 320
Добавлено: 25-12-2006 10:54
instance_nearest(x,y,obj0); итак перебирает ВСЕ объекты )))) да ещё используешь её несколько раз!

думаю один перебор типа

for(все нжные объекты )
{
если объект ближе предыдущего и фулл=1, запоминаем объект

}
будет быстрее всего.
Тем более мы не коллизии проверяем а расстояние между точками, что довольно быстро.

вот и всё. Даже код ломает писать)

магистр
Группа: Сообщество GM
Сообщений: 443
Добавлено: 25-12-2006 11:03
что это значит? инстанс_ниарест дает нам id ближайшего объекта obj0 к точке (x,y). ДАЖЕ Если у него фулл не такой как нам нужен, он ВСЕ РАВНО будет ближайшим. Как перейти к следующему объекту? Я не смог найти такого, поэтому решил деактивировать не нужные на время. Фраза "если объект ближе предыдущего" как будет выглядеть по твоему на гмл?

гроссмейстер
Группа: Сообщество GM
Сообщений: 130
Добавлено: 25-12-2006 11:40
DreamRunner, вообще-то именно этот код я и написал немного выше...

магистр
Группа: Сообщество GM
Сообщений: 320
Добавлено: 25-12-2006 11:56
инстанс_ниарест дает нам id ближайшего объекта obj0 к точке (x,y).

а ты думаешь он заранее знает какой ближайший? :) он тоже перебирает внутри себя все объекты и выдаёт один.

Фраза "если объект ближе предыдущего" как будет выглядеть по твоему на гмл?

я про этот кусок:

pd=point_distance(x,y,instance_id[i].x,instance_id[i].y);
if (pd<min) {
min=pd;
oid=instance_id[i];
}


DreamRunner, вообще-то именно этот код я и написал немного выше...

именно. это кстати очень похоже на пример из хелпа :) Собственно подобный вопрос там и разбирается.

Страницы: 1 2 Next>> новая тема
Раздел: 
Game Maker Форум / Вопросы и Ответы (Для Начинающих) / Перевидите с русского на гмский

Отвечать на темы в данном разделе могут только зарегистрированные пользователи

Отвечать на темы могут только зарегистрированные пользователи

KXK.RU