Помогите научиться работать с сеткой....
| |
DeadDay | Дата: Среда, 31 Декабря 2014, 12:59 | Сообщение # 1 |
New game Studio
Сейчас нет на сайте
| Всем привет. Для своей игры задумал сделать передвижение по сетке. Но работать пока не могу, так как не разобрался еще как с ней работать.
Вообщем есть пару вопросов, на которые я хотел бы посмотреть ответы.
1. Как начать работать с сеткой? 2. Как правильно её настроить? 3. Как вывести эту сетку в комнате, т.е. чтоб эта сетка отображалась. 4. Как сделать передвижение именно по этой сетке? 5. Как сделать так, чтоб сетка была только в пустом месте комнаты? т.е., если есть объект, сетка под ним не создавалась.
Заранее всем спасибо.
New Games Studio --------------------------------------------------------------------------------------- Проекты: DeadDay - Online --- Мертвый день: Выживание
|
|
| |
King | Дата: Среда, 31 Декабря 2014, 14:50 | Сообщение # 2 |
участник
Сейчас нет на сайте
| Цитата DeadDay ( ) 1. Как начать работать с сеткой? Заведи объект, который создается при создании комнаты и управляет основными ее параметрами. В нем, в событии создания: Код global.grid = mp_grid_create(left,top,hcells,vcells,cellwidth,cellheight) left, top - координаты начала сетки, то есть ее левого верхнего угла. hcells и vcells - Количество ячеек в сетке по горизонтали и вертикали соответственно. cellwidth и cellheight - это размер ячеек (например 32х32). Цитата DeadDay ( ) 2. Как правильно её настроить? В предыдущей функции. Включишь отображение сетки и ориентируясь на размеры объектов в твоей игре настроишь. Цитата DeadDay ( ) 3. Как вывести эту сетку в комнате, т.е. чтоб эта сетка отображалась. Код mp_grid_draw(global.grid) Рисует сетку в комнате. Помещать в событии рисования того же главного объекта. Жрет много ресурсов и существует только для отладки. Цитата DeadDay ( ) 4. Как сделать передвижение именно по этой сетке? Справка говорит нам Цитата mp_grid_path(id,path,xstart,ystart,xgoal,ygoal,allowdiag) вычисляет путь через сетку. path - должен указать существующий путь, который будет заменён путём, задаваемым компьютером. xstart и ystart - указывают начало пути, и xgoal и ygoal - цель. allowdiag - указывает, что допускаются диагональные перемещения вместо обычных горизонтальных и/или вертикальных. Функция Возвращает истину, если путь успешно обнаружен. (Заметьте, что путь не зависит от текущего экземпляра объекта; это путь через сетку - не путь для специфического экземпляра объекта.) Проще говоря, аргумент path - это заранее созданный тобой путь (mypath = path_add();) То есть ты создаешь пустой путь, затем с помощью mp_grid_path() перезаписываешь его, и только затем используешь как самый простой путь для объекта, с помощью функции path_start() заставляешь экземпляр объекта двигаться по вычисленному пути. Цитата DeadDay ( ) 5. Как сделать так, чтоб сетка была только в пустом месте комнаты? т.е., если есть объект, сетка под ним не создавалась. Сетка создается везде. Нельзя сделать так, чтобы она не создавалась под определенным объектом, но можно закрасить ячейку под этим объектом, то есть пометить ее как непроходимую. В этом и суть сетки. Цитирую справку снова Цитата mp_grid_add_instances(id,obj,prec) выделяет все ячейки, что пересекает экземпляр указанного объекта как запрещёные. Вы можете использовать индивидуальный экземпляр объекта, создавая obj для идентификатора экземпляра. Также Вы можете использовать ключевое слово all, чтобы указывать все экземпляры всех объектов. prec - указывает, что независимо точной проверки, столкновение должна быть осуществлено (будет работать только в том случае, если точная проверка проверена для спрайта используемого экземпляром объекта). Со статичными объектами у тебя проблем возникнуть не должно. С динамическими могут. Все сказанное актуально для 8й версии GM. Советую полистать справку, чтобы узнать больше. А так же что бы узнать принцип работы и аргументы интересующих тебя функций.
Пользуясь случаем, поздравляю всех форумчан с Новым Годом
Nothing is true, everything is permitted. Shadows Games
|
|
| |
DeadDay | Дата: Среда, 31 Декабря 2014, 15:18 | Сообщение # 3 |
New game Studio
Сейчас нет на сайте
| Ну для начало, спасибо за поздравление.
А теперь поподробнее.
Цитата hcells и vcells - Количество ячеек в сетке по горизонтали и вертикали соответственно.
Как быть, если я не знаю какое количество ячеек?
Цитата Код mp_grid_draw(global.grid) Рисует сетку в комнате. Помещать в событии рисования того же главного объекта. Жрет много ресурсов и существует только для отладки.
Тогда по другому спрошу. У меня размер ячейки 128х128..Каждая ячейка, это 1 сектор.. этот сектор можно открыть. Открытие происходит по опр. действиям и при нажатии на объект. Вопрос, можно ли как то закрепить этот объект открытия в каждую ячейку? И чтоб он открывал только ту ячейку, которую выбрал игрок.
С перемещением, тоже пока не понял. так как сам еше не проверил...
New Games Studio --------------------------------------------------------------------------------------- Проекты: DeadDay - Online --- Мертвый день: Выживание
|
|
| |
King | Дата: Среда, 31 Декабря 2014, 15:34 | Сообщение # 4 |
участник
Сейчас нет на сайте
| Цитата DeadDay ( ) Как быть, если я не знаю какое количество ячеек? Например вот так Код global.grid = mp_grid_create(0,0,room_width div 50,room_height div 50,50,50); Создает сетку по размеру комнаты с размерами ячеек 50х50 По поводу второго вопроса. Берешь делаешь все ячейки запрещенными. Затем при клике по объекту проверяешь его координаты, узнаешь какой ячейке они ответствуют и с помощью mp_grid_clear_cell(id,h,v) очищаешь ее. Точнее сказать не могу, потому как до конца не понимаю ситуации.
Nothing is true, everything is permitted. Shadows Games
|
|
| |
kukinillo777 | Дата: Среда, 31 Декабря 2014, 15:43 | Сообщение # 5 |
частый гость
Сейчас нет на сайте
| Могу помочь в ЛС. Могу даже кинуть тебе наглядный пример.
Все свои желания можно воплотить в своей игре, если руки из нужного места растут. А если и мозга работает, то и в реальности все сделаешь :)
|
|
| |
DeadDay | Дата: Среда, 31 Декабря 2014, 15:48 | Сообщение # 6 |
New game Studio
Сейчас нет на сайте
| kukinillo777, да ну давай здесь. Мало ли, может кому то тоже это надо будет....
King, просто получается очень много объектов в комнате будет, для каждой ячейки......Ты мне скажи что тебе не понятно, я попробую обьяснить поподробнее.
П.с. что с путём у меня не получается ни чего....
New Games Studio --------------------------------------------------------------------------------------- Проекты: DeadDay - Online --- Мертвый день: Выживание
|
|
| |
King | Дата: Среда, 31 Декабря 2014, 17:01 | Сообщение # 7 |
участник
Сейчас нет на сайте
| Цитата DeadDay ( ) просто получается очень много объектов в комнате будет, для каждой ячейки.. Не нужно много объектов. Если очищать нужно по клику - берешь координаты мыши во время клика, определяешь ячейку, очищаешь. Если по конкретному состоянию объекта - то же самое, координаты объекта берем, определяем ячейку, очищаем.
Цитата DeadDay ( ) П.с. что с путём у меня не получается ни чего.... Дружище, справка способна сказать куда больше чем я. Цитата В Game Maker Вы можете определять пути и задавать их, чтобы экземпляры объекта следовали заданным заранее путям. Начнем с азов. Путь - это сценарий движения. Ты рисуешь линию/кривую/что угодно с ключевыми точками. Для путей в GM есть отдельный раздел и там их можно создавать. Создал такой путь, присвоил его экземпляру объекта, указал скорость и вуаля, объект поехал по этому самому пути. Так вот в нашем случае этот самый путь задаешь не ты, а функция. Она записывает ключевые точки исходя из твоей сетки и дальше ты уже можешь присваивать этот самый сценарий движения какому угодно объекту. Итак, что делаем? 1. Создаем пустой путь. mypath = path_add()
2. Перезаписываем его так как нужно нам.
mp_grid_path(global.grid,mypath,xstart,ystart,xgoal,ygoal,allowdiag)
Где xstart - координата х с которой начать расчет пути ystart - координата y с которой начать расчет пути xgoal - целевая координата х куда нужно прийти ygoal - целевая координата y куда нужно прийти allowdiag - можно ли двигаться по диагонали. (1 - да, 0 - нет)
3. Заставить экземпляр объекта двигаться по пути
Цитата path_start(path,speed,endaction,absolute) Начинает путь для текущего экземпляра объекта. path - имя пути, который Вы хотите запустить. speed - скорость перемещения. Отрицательная скорость означает, что экземпляр объекта перемещается в обратном порядке (задом наперёд) вдоль пути. endaction - указывает, что должно случиться, когда будет достигнуто окончание пути. Следующие значения могут быть использованы:
0 : останавливает путь 1: продолжение со стартовой позиции (если путь не закрыт, мы перескакиваем на стартовую позицию) 2: продолжение из текущей позиции 3: возобновляет путь, что изменяет признак скорости
Аргумент absolute должен быть истиной или ложью. Когда истина - используются абсолютные координаты пути. Когда ложь - путь становится относительно текущего экземпляра объекта. Точнее, если скорость положительная, то стартовая точка пути будет установлена в текущей позиции, и путь будет следовать оттуда. Когда скорость является отрицательной, то завершающая точка пути будет установлена в текущей позиции, и путь оттуда будет следовать в обратном порядке.
Надеюсь, достаточно просто.
Или быть может вот kukinillo777 сможет помочь тебе.
Nothing is true, everything is permitted. Shadows Games
|
|
| |
kukinillo777 | Дата: Среда, 31 Декабря 2014, 17:50 | Сообщение # 8 |
частый гость
Сейчас нет на сайте
| Блин, не могу на ноуте найти пример. Завтра если сильно после НГ не выпью напишу новый пример.
Все свои желания можно воплотить в своей игре, если руки из нужного места растут. А если и мозга работает, то и в реальности все сделаешь :)
|
|
| |
DeadDay | Дата: Воскресенье, 04 Января 2015, 19:56 | Сообщение # 9 |
New game Studio
Сейчас нет на сайте
| Всем привет! Есть сетка: —-> на рисунке. Она будет другим размером. Это понятно. Вопрос: —> Как сделать так, чтоб объект (К примеру, от 1 до 10 шт), появился только на 1 и 2 полосе в рандомной ячейке? Если можно, то с примером. Я только начал изучать этут не понятную для меня сетку. Заранее всем спасибо за помощь. И если можно, то не флудить. Нужна реальная помощь!
New Games Studio --------------------------------------------------------------------------------------- Проекты: DeadDay - Online --- Мертвый день: Выживание
|
|
| |
LunarPixel | Дата: Понедельник, 05 Января 2015, 20:49 | Сообщение # 10 |
старожил
Сейчас нет на сайте
| У тебя есть начальные координаты в которых создается сетка, есть количество ячеек и размер этих ячеек. В данном случае сетка (т.е. mp_grid) не имеет никакого значения, нужны только эти параметры. Получается как-то так:
Код obj=10; //количество создаваемых объектов gsx=0; //позиция левого верхнего угла сетки gsy=0; //позиция левого верхнего угла сетки gw=64; //ширина ячейки gh=32; //высота ячейки
Код while (obj>0) //пока есть, что создавать, выполняем следующий код { x1=irandom(8); //берем случайную позицию по горизонтали (из количества ячеек в строке, отсчет с 0) y1=irandom(1); //берем случайную позицию по вертикали (из количества ячеек в столбце, отсчет с 0) if (!place_meeting(gsx+x1*gw/2,gsy+y1*gh/2,object)) { //проверяем, свободна ли полученная случайная позиция в комнате (центр ячейки) instance_create(gsx+x1*gw/2,gsy+y1*gh/2,object); //если свободна, создаем там объект (в центре ячейки, для этого делим ее размеры на 2) obj-=1; //и уменьшаем количество создаваемых элементов } }
Таким образом все объекты у тебя встанут по твоей сетке (само собой координаты создания объектов нужно будет подстроить под свои нужды). Далее, либо после цикла можешь использовать mp_grid_add_instances, чтобы сделать ячейки, на которые попадают объекты, непроходимыми, либо прямо в цикл после создания объекта вставить mp_grid_add_cell.
|
|
| |
DeadDay | Дата: Понедельник, 05 Января 2015, 22:28 | Сообщение # 11 |
New game Studio
Сейчас нет на сайте
| LunarPixel, спасибо большое....
New Games Studio --------------------------------------------------------------------------------------- Проекты: DeadDay - Online --- Мертвый день: Выживание
|
|
| |
|