Вопрос - Ответ (Game Maker)
| |
BrightSpot | Дата: Четверг, 12 Июля 2012, 11:07 | Сообщение # 3401 |
заслуженный участник
Сейчас нет на сайте
| Quote (Dva_Kota) но то что они работают медленно - известный факт самый неприятный минус гм-а... очень медленная работа при не очень больших запросах(2000х2000 кубов в 3д выдают 10-15 фпс и компик далеко не слабенький)
Более мощный компьютер глючит быстрее и точнее.
|
|
| |
Dva_Kota | Дата: Четверг, 12 Июля 2012, 11:28 | Сообщение # 3402 |
заслуженный участник
Сейчас нет на сайте
| Сделал небольшой пример сравнения скорости выполнения кода в объекте, скрипта, и скрипта в скрипте, может быть кому-то интересно: скачать
Новый пример инвентаря! /20.06.2012/
Energy Wars
|
|
| |
belsen | Дата: Среда, 18 Июля 2012, 15:44 | Сообщение # 3403 |
был не раз
Сейчас нет на сайте
| Здравствуйте, хочу сделать генерацию припятствий при создании комнаты. За это будет отвечать объект obj_rocks_creator. У него в действии "Room start" прописываю такой код:
Code { repeat(random_range(35, 50)) { do { new_rock_x = random(room_width); new_rock_y = random(room_height); } until (place_meeting(new_rock_x, new_rock_y, all)) // Если в этой точке уже есть другой объект, продолжить генерацию координат instance_create(new_rock_x, new_rock_y, obj_rock); } }
Но при выполнении игра по-ходу входит в бесконечный цикл и повисает с черным экраном.
Сразу извиняюсь если вопрос нубский, начал изучать GML только сегодня
|
|
| |
GameMix | Дата: Среда, 18 Июля 2012, 15:59 | Сообщение # 3404 |
старожил
Сейчас нет на сайте
| belsen, random_range(35, 50) - функция возвращает случайное вещественное число от 35 до 50 (дробные числа в этом интервале тоже считаются). Т.е. у тебя может действие повторяться хоть раз 50. + Шанс, что у тебя будет выпадать нужная координата очень мал. Т.к. лучше генерировать такую координату, при помещении в которую спрайт объекта не будет пересекать другой. Тем более не следует использовать генерирование случайных вещественных чисел от 0 до размера комнаты, т.к. координаты объекта исчисляются в целых значениях.
Да и сам способ генерации препятствия прост, но в то же время не самый лучший для такого дела. При генерировании координат нужно исключать координаты, в которые входит спрайт созданного объекта. Но сама проблема не в скобках repeat, а в условии until и содержании скобок после do.
Steel Standoff - 2D аркада. Мои статьи
Сообщение отредактировал GameMix - Среда, 18 Июля 2012, 16:07 |
|
| |
belsen | Дата: Среда, 18 Июля 2012, 16:13 | Сообщение # 3405 |
был не раз
Сейчас нет на сайте
| Исправил для генерации целых чисел. Но симтомы те же. Вот код с комментариями, может я неправильно алгоритм использую.
Code { repeat(irandom_range(35, 50)) // Генерируется количество препятствий в комнате от 35 до 50 { do { new_rock_x = irandom(room_width); // Генерируется координата x препятствия new_rock_y = irandom(room_height); // Генерируется координата y препятствия } until (place_meeting(new_rock_x, new_rock_y, all)) // Если в этой точке уже есть другой объект, сгенерировать новые координаты instance_create(new_rock_x, new_rock_y, obj_rock); // Если в сгенерированных координатах нет другого объекта, создать в нем новый экземпляр } }
Пробовал уменьшить кол-во итераций repeat(irandom_range(1, 3)). Все равно тоже самое. Дело не в том, что он не может долго найти подходящие координаты, а скорее всего в этой строчке: until (place_meeting(new_rock_x, new_rock_y, all))
Сообщение отредактировал belsen - Среда, 18 Июля 2012, 16:18 |
|
| |
GameMix | Дата: Среда, 18 Июля 2012, 16:38 | Сообщение # 3406 |
старожил
Сейчас нет на сайте
| Как вариант - создавать дополнительную базу с координатами, а потом отсеивать из базы занятые координаты. Я так раньше делал. Довольно быстро генерировались объекты.
Steel Standoff - 2D аркада. Мои статьи
Сообщение отредактировал GameMix - Среда, 18 Июля 2012, 16:39 |
|
| |
hero564 | Дата: Среда, 18 Июля 2012, 20:02 | Сообщение # 3407 |
Made in Ukraine
Сейчас нет на сайте
| belsen, почему не сделать через for ?
|
|
| |
GameMix | Дата: Среда, 18 Июля 2012, 20:05 | Сообщение # 3408 |
старожил
Сейчас нет на сайте
| hero564, тут не в for дело, а в способе подбора координат.
Steel Standoff - 2D аркада. Мои статьи
|
|
| |
hero564 | Дата: Среда, 18 Июля 2012, 20:09 | Сообщение # 3409 |
Made in Ukraine
Сейчас нет на сайте
| belsen, проблема решена! вместо Code until (place_meeting(new_rock_x, new_rock_y, all)) введи until not (place_meeting(new_rock_x, new_rock_y, all))Добавлено (18.07.2012, 20:09) ---------------------------------------------
Quote (GameMix) hero564, тут не в for дело, а в способе подбора координат. GameMix, понял я уже...
|
|
| |
GameMix | Дата: Среда, 18 Июля 2012, 20:14 | Сообщение # 3410 |
старожил
Сейчас нет на сайте
| Quote (hero564) until not (place_meeting(new_rock_x, new_rock_y, all)) Даже от этого ничего не изменится. У меня моим способом быстро генерируется, без задержки при запуске, но мелкий баг с накладыванием объектов друг на друга все портит
Steel Standoff - 2D аркада. Мои статьи
Сообщение отредактировал GameMix - Среда, 18 Июля 2012, 20:15 |
|
| |
hero564 | Дата: Среда, 18 Июля 2012, 20:21 | Сообщение # 3411 |
Made in Ukraine
Сейчас нет на сайте
| GameMix, я не знаю только что пробовал , все получилось , ща скрин закину Добавлено (18.07.2012, 20:21) --------------------------------------------- вот , только у меня деревья вместо камней
|
|
| |
GameMix | Дата: Среда, 18 Июля 2012, 20:29 | Сообщение # 3412 |
старожил
Сейчас нет на сайте
| hero564, да, точно, работает. Ну тогда мне можно теперь не торопиться с генерированием. Можно выбрать, какой результат больше подходит beslen'у.
Steel Standoff - 2D аркада. Мои статьи
|
|
| |
hero564 | Дата: Среда, 18 Июля 2012, 20:39 | Сообщение # 3413 |
Made in Ukraine
Сейчас нет на сайте
| GameMix, можно еще сделать выравнивание по сетке, Добавлено (18.07.2012, 20:39) --------------------------------------------- hero564, тогда походу должно получится что-то вроде твоего варианта
|
|
| |
GameMix | Дата: Среда, 18 Июля 2012, 20:47 | Сообщение # 3414 |
старожил
Сейчас нет на сайте
| Quote (hero564) hero564, тогда походу должно получится что-то вроде твоего варианта Да, ещё и получится с таким же багом, как у меня - наложением объектов.
Steel Standoff - 2D аркада. Мои статьи
Сообщение отредактировал GameMix - Среда, 18 Июля 2012, 20:47 |
|
| |
hero564 | Дата: Среда, 18 Июля 2012, 20:54 | Сообщение # 3415 |
Made in Ukraine
Сейчас нет на сайте
| GameMix, действительно, тогда можно создавать, выравнивать по сетке, проверять столкновения(если накладываются то удалять) , и проверять сколько обьектов осталось создать как то такДобавлено (18.07.2012, 20:53) --------------------------------------------- все вышеуказанное в цикл запихнуть Добавлено (18.07.2012, 20:54) --------------------------------------------- тогда удобнее через for будет
|
|
| |
belsen | Дата: Четверг, 19 Июля 2012, 16:32 | Сообщение # 3416 |
был не раз
Сейчас нет на сайте
| GameMix, hero564 большое спасибо за помощь!
Все таки я пошел своим путем. Может кому-то пригодится:
Сделал шаг сетки по горизонтали и вертикали равным 1. Origin сделал по центру спрайта препятствия. В Creation Code комнаты прописал следующее:
Code { rocks_num = irandom_range(100, 150); // Здесь задается количество препятствий while(rocks_num >= 0) { new_rock_x = irandom_range(16, room_width - 16); // Генерируются координаты нового препятсвия (значения взяты (16, room_width - 16) и (16, room_height - 16) new_rock_y = irandom_range(16, room_height - 16); // для того, чтобы препятствия не вылазили за пределы экрана) if !position_meeting(new_rock_x + 16, new_rock_y, obj_rock) // Здесь происходит проверка перекрытия с уже созданным экземпляром справа, && !position_meeting(new_rock_x-16, new_rock_y, obj_rock) // слева, && !position_meeting(new_rock_x, new_rock_y+16, obj_rock) // сверху, && !position_meeting(new_rock_x, new_rock_y-16, obj_rock) // снизу, && !position_meeting(new_rock_x + 16, new_rock_y + 16, obj_rock)// в правом верхнем углу, && !position_meeting(new_rock_x - 16, new_rock_y + 16, obj_rock) // в левом верхнем углу, && !position_meeting(new_rock_x + 16, new_rock_y - 16, obj_rock) // в правом нижнем углу, && !position_meeting(new_rock_x - 16, new_rock_y - 16, obj_rock) // в левом нижнем углу { instance_create(new_rock_x, new_rock_y, obj_rock); // Если перекрытия не происходит, создается новый экземпляр rocks_num -= 1; // и количество оставшихся препятствий уменьшается на 1 } } }
Вариант конечно получился довольно неуклюжий, но вполне работоспособный и препятствия создаются без привязки к сетке. Работает это все довольно шустро.
Сообщение отредактировал belsen - Пятница, 20 Июля 2012, 07:55 |
|
| |
GameMix | Дата: Четверг, 19 Июля 2012, 17:20 | Сообщение # 3417 |
старожил
Сейчас нет на сайте
| belsen, быстро ты в GML растёшь!
Steel Standoff - 2D аркада. Мои статьи
|
|
| |
k0fe | Дата: Пятница, 20 Июля 2012, 22:50 | Сообщение # 3418 |
BRONX
Сейчас нет на сайте
| У меня есть код Code draw_text(5,50, global.name) С помощью него, игрок на экране видит имя персонажа, которое он записал в начале.... И всё бы хорошо, но если имя игрока написано кириллицей, то GM его не видит
мой стрим, который я редко включаю, но зато на нём я делаю игры
|
|
| |
МистерИкс | Дата: Пятница, 20 Июля 2012, 22:51 | Сообщение # 3419 |
Текстовик
Сейчас нет на сайте
| ЙаСаня, чтобы была видна кириллица, нужно создать новый шрифт (font), в полях указать числа 0 и 255, а в креэйт: draw_set_font(имя_шрифта)
Три Пути - текстовый квест Not Quite Heroes - пародийная jRPG в разработке
|
|
| |
k0fe | Дата: Суббота, 21 Июля 2012, 03:06 | Сообщение # 3420 |
BRONX
Сейчас нет на сайте
| МистерИкс, спасибо! Шрифт уже был, а вот числа в полях не заполнил, вот и вся проблема Добавлено (21.07.2012, 01:41) --------------------------------------------- У меня есть персонаж со спрайтом 16х16px Как заставить его ходить "по клеточкам"? Что-бы один его ход был равен 16px За пример можно взять roguelike игры Добавлено (21.07.2012, 03:06) --------------------------------------------- Ап вопроса
мой стрим, который я редко включаю, но зато на нём я делаю игры
|
|
| |
|