Запаковывать файлы в сам .exe файл тяжело - это требует разбора структуры формата приложения (чтобы заменить какие-то стандартные ресурсы на свои), либо ухищрений с перепаковкой файла внешним ПО (с UPX, например)
Можно взять какую-нибудь DLL-ку для работы с архивами, запаковывать пользовательские уровни в архив, и ложить архив в папку возле "плеера" (что потом будет вытягивать и обрабатывать файлы из архива). В самом GameMaker: Studio по-умолчанию (без YYC) это так и работает (ресурсы игры складываются в data.win).
На Sega Megadrive/Genesis было очень ограниченное количество стратегий. Полагаю, имеется в виду Master of Monsters (совпадает: глобальная карта, ограничения по ходам, бои с видом сбоку, прокачка юнитов). Игра, правда, не об одних лишь драконах.
Из того что легко вспомнить на данный момент: Minicraft (тот, что был сделан на Ludum Dare; не путать с Minecraft) Planetscape (небольшая но вполне пригодная игра) Можно сказать, что тема "песочниц" с видом сверху толком не раскрыта, поскольку проекция поощряет генерацию много-уровневых подземелий и иных сооружений, что в общей сложности вносят риск превращения игры в roguelike.
instance_place, instance_position, и все collision_ функции возвращают ID найденного экземпляра. Следовательно, можно проделывать следующим образом в шаге юнита: if (selected && mouse_check_button_pressed(mb_left)) { // если текущий юнит выбран и мышь нажата target = collision_point(mouse_x, mouse_y, obj_enemy, false, true) if (target) { /* найден враг, можно атаковать */ } }
ЦитатаEfimovMax ()
objTest.id возвратит идентификатор объекта.
Утверждение верно, но obj_name.id возвратит id первого экземпляра объекта, а не какого-то отдельно взятого [на который нажали мышью].
Сообщение отредактировал YellowAfterlife - Воскресенье, 29 Марта 2015, 04:04
Сравнение строкового значения с числом выдает ошибку. Ты читал текст ошибки? В GMS оно даже отчетливо говорит "Invalid comparison type" (неправильный тип сравнений). Можно с таким же успехом написать "if0='Сам проверь' { }" и говорить, что в GameMaker не работают сравнения.
Array[999] = '' if (Array[998] == 0) { show_message("What are you doing with your life.") }
Сообщение отредактировал YellowAfterlife - Суббота, 28 Марта 2015, 16:49
Это где ты такое вычитал? GM не создаёт автоматом предыдущие индексы массива. Код array[99] = 0 создаст только один элемент массива с индексом 99 и значением 0. Пользуйтесь только достоверными источниками
В GameMaker не бывает "дыр" в массивах. Если запись происходит за границу массива, массив расширяется (происходит пере-выделение памяти под него) и все "новые" ячейки обнуляются, arr[9] = 1 for (vari = 0; i < 10; i += 1) { show_message("arr[" + string(i) + "] -> " + string(arr[i])) } отобразит серию 0 и 1 в конце, без ошибок.
Что смешно, в предоставленной ссылке на документацию описывается эта же концепция (поиск по фразе "You will notice that the array has been initialised backwards"), и все примеры кода в документации инициализируют массивы задом наперед, поскольку for (vari = 0; i < 100; i += 1) arr[i] = 0 Уничтожит и выделит массив заново 100 раз. И время выполнения растет с каждой новой итерацией, поскольку памяти выделять и освобождать нужно все больше и больше.
Ну и раз уж мы заговорили о критике кода, хотелось бы заметить, что инициализировать массив значениями "noone" - сомнительная идея, потому что noone это просто спец. константа, равная -4.
Если нужен список значений, использовать вышеупомянутые массивы. Еще про массивы:
Достаточно присвоить значение в "последнюю" ячейку - остальные будут заполнены нулями, array[99] = 0// array[0..99] автоматически будут установлены в 0 при выделении памяти
Есть двухмерные массивы (см. справку)
Если используете GameMaker: Studio, можно даже записывать один массив в другой массив.
Если нужен список соответствий (например, слов и выдаваемых за них очков), логичнее взять ds_map.
Information about object: obj_player Sprite: <no sprite> Solid: false Visible: true Depth: 0 Persistent: false Parent: <no parent> Mask: <same as sprite> Create Event: set variable cooldown to 0
Step Event: set variable cooldownrelative to -1
Mouse Event for Glob Left Button: if cooldown is smaller than1 . . start of a block . . set variable cooldown to 10 . . create instance of object obj_bullet at relative position (0,0) with speed 4 in direction point_direction(x, y, mouse_x, mouse_y) . . end of a block
"cooldown" используется как таймер до возможности следующего выстрела.
Еще тестирую инструментарий для генерации подсвеченного кода. Все очень плохо.
В качестве нехитрого способа, можно добавить в активацию проверку того, что объект видимый, вместо непосредственной активации создавать "активированный объект" и скрывать основной, и через нужное количество секунд (с помощью alarm) делать его вновь видимым.
keyboard_string = "Type something..." runline_text = keyboard_string runline_pos = 0 // offset (in pixels) runline_space = 30 // space after the end of text
Step:
Код
runline_text = keyboard_string runline_pos += 4
Draw:
Код
draw_set_font(fnt_runline) var p, w, i, dw; w = string_width(runline_text) + runline_space if (w > 0) { p = runline_pos p = (p mod w) + (p < 0) * w dw = room_width // output width i = max(2, ceil(dw / w)) while (i >= 0) { draw_text(i * w - p, 50, runline_text) i -= 1 } }
GMK spin_pos это смещение (в "строках") spin_speed это скорость вращения (опять таки в "строках") Пример включает прокрутку текста и прокрутку фона, поскольку я не совсем уверен о том, что из двух является желаемым эффектом. Полагаю, сделать замедление или прочий нужный эффект не составит большого труда.
ООО, спасибо! Все работает! Пользуясь случаем, ты же автор Terrasavr, или я что-то путаю?
Верно.
В подписи есть ссылка на группу, группа ссылается на мой сайт, на котором лежит программа. Еще есть версия для tAPI, о которой я никак не соберусь написать запись для блога, чтобы ее можно было легко найти
Занимаюсь различным времяпрепровождением, в общем-то говоря.
С Unity RPC все довольно странно. Вызывает подозрения, что им занимались те же люди, что сделали встроенный API для геймпадов.
Есть несколько вариантов: 1. Запаковать массив более плотно, преобразовав его в буфер, и после вызвав Convert.ToBase64. Это подразумевает 4 байта base64 на каждые 3 байта буфера с массивом, что обычно вполне приемлемо. Тут есть пример кода. 2. Воспользоваться незадокументированным фактом того, что по RPC кроме описанных в документации типов можно еще отправлять массив байт (byte[]). Полагаю, преобразование массива int в массив byte и обратно не требует дополнительных пояснений. Данный трюк используется тут чтобы отправить/принять сериализированный класс.
"Универсальных" программ для создания модов не бывает, поскольку принципы и технологии создания игр значительно отличаются, и особой стандартизации не подлежат. А что мешает поискать приложения для моддинга SimCity 5 в отдельности? Небольшой поиск выдал SimCityPak, что позволяет просматривать и редактировать файлы игры. ... а еще можно рассмотреть возможность перехода на Cities: Skylines, в котором есть поддержка моддинга "из коробки", и созданные работы можно загружать в Steam Workshop.
Большое спасибо, этот видел, много лишнего правда там, но порою. Крупное окно и многострочность не нужна. Мне просто нужно вводить до ста, скажем, знаков в одной строке.
В примере нет многострочности, это просто демонстрация варианта вывода вводимых значений. Если нужно ограничивать длину то можно просто делать
Код
if (string_length(keyboard_string) > 100) { keyboard_string = string_copy(keyboard_string, 1, 100) } if (keyboard_check_pressed(vk_enter) && keyboard_string != "") { var ins = keyboard_string; // сделать что-то с введенной строкой (ins) keyboard_string = "" }
И рисовать значение keyboard_string через draw_text. Пример добавляет над этим надстройку для возможности копирования, вставки, и перемещения курсора по тексту (чего keyboard_string изначально не предусматривает).
Бьюсь с этими таймлайнами, как сделать чтобы каждую секунду срабатывало событие. Я так понимаю, одна секунда - это 30 кадров (по стандарту). Это делается через таймлайн, таймер или все проще?
Для такого используют alarm'ы. Timelines больше рассчитаны на серии событий, что происходят один раз. Можно, конечно, "зациклить" timeline кодом, но при одном действии это лишь лишние хлопоты.
Цитата
Information about object: obj_example
Create Event:
Код
alarm[0] = 30 // время до первого срабатывания
Alarm 0:
Код
// [выполнить действия] alarm[0] = 30 // время до следующего срабатывания
CheckboxGroup.selectedIndex указывает на номер выбранного пункта (первый пункт имеет индекс 0, второй 1, и так далее); содержит -1 если ни один пункт не выбран. Если включена возможность выбора нескольких элементов за раз, selectedIndexes (ниже на той же странице документации) содержит их список.