От мерцания можно избавиться лишь если перерисовывать только те ячейки, что изменились с прошлого кадра (например, игрок передвинулся - стираем "Р" из прошлой ячейки на экране и записываем в новую). В этом поможет SetConsoleCursorPosition ~ http://msdn.microsoft.com/ru-RU/library/windows/desktop/ms686025(v=vs.85).aspx (кто-нибудь скажите мне, почему ссылки на MSDN невозможно сделать "кликабельными")
Abel399, урок от LunarPixel, который поможет тебе.
Стоит заметить что чтение файлов (а так же попиксельное рисование) в GameMaker проходит слишком медленно для того чтобы это можно было хоть как-то использовать для средних и крупных изображений. Реалистичными для выполнения в самом ГМ (без внешних длл) методами являются шифрование заголовка файла (без знания размерности и файлового формата пользователь вряд ли что-то сделает) и "перемешивание" содержимого изображений (текущие версии GMObfuscator предоставляют такой функционал). Второй вариант не дает "настоящего" шифрования, но из перемешанной пиксельной каши восстановить исходное изображение пользователь, скорее всего, не сможет.
Еще одним интересным вариантом было бы использование стандартного формата .gmspr (что может быть быстро загружен через sprite_add_sprite), но возможности сохранять его из игры нет, и никакой документации по формату мне пока находить не доводилось.
if (place_free(x, y)) { // если объект не находится в стене, image_angle += rotation; // поворачиваем объект if (!place_free(x, y)) { // если после этого объект застрял в стене, image_angle -= rotation; // отменяем поворот } }
"Зазоры" на тайлах это не столько проблема GameMaker, сколько "особенности" видеокарты. Появляются из-за того, что видеокарта "хватает" один лишний пиксель на текстуре, хотя и не должна (сюда же относится знаментальная особенность с тем, что разные видеокарты рисуют прямоугольники для draw_rectangle разных размеров). Исправляется добавлением "рамки" размером в один пиксель вокруг каждого тайла (см. запись YoYoGames) или трюком с поверхностями.
Model Creator - для моделивания, поддерживает импорт .obj моделей GmModelFix - программа специально предназначена для конвертирования уже готовых моделей под ГМ. Поддерживает набор инструментов для исправления типичных глюков, возникающих при экспорте-импорте моделей (вроде переворота по оси Y или неправильных координат текстуры)
Есть, например, Adventus, что включает в себя практически все возможные особенности таких движков.
Если есть желание делать что-то самому, есть: 2D dynamic soft shadows - довольно подробный пост, видел несколько реализаций по нему. Проблемой являются лишь "стыкующиеся" фигуры - между ними будет видна пенумбра, если нет пересечения. 2D visibility - очень интересный подход к данной проблеме, базированный на бросании лучей (подобный подход использовался в первых "3д" шутерах вроде wolfstein / doom).
Можно упростить код и дальше. Это уже получается минималистичная симуляция таймера. Create
Код
cooldown = 0 // "нагрев" оружия. если 0 то можно стрелять
Step
Код
if (cooldown > 0) cooldown -= 1 // "остывание" оружия со временем if (keyboard_check(vk_control) && (cooldown <= 0)) { // если нажата кнопка и оружие уже "остыло" cooldown = room_speed / 2 // пол секунды, в шагах. instance_create(x, y, o_ammo) // собственно создание пули }
GameMaker разрешает манипулировать INI файлами лишь в папке программы. Если нужно что-то сделать с файлом в другом месте, нужно скопировать его в папку программы, изменить, и скопировать обратно (file_copy). Или написать свою реализацию для манипуляции INI (не рекоммендуется).
Первое, что бросается в глаза, это дописанные пути для INI файлов. GameMaker (по какой-то своей причине) не позволяет манипулировать INI вне папки игры (и даже с дописанными путями для папки игры). То есть использование должно быть как
Код
ini_open('scores.ini')
Вторая проблема в том, что считываемые значения никуда не идут - ini_read_real возвращает полученное значение, но в приведенном коде оно никуда не присвается вовсе. Это можно исправить так:
(добавлено присвоение результата в переменную) Если значения все равно не будут считываться, можно попробывать убрать точку из имени переменной для ини, изменив это на "var" или "global_var".
Значения откалибровать под свои. "obj_player" заменить на имя объекта игрока.
Добавлено: Если пользоваться кнопками, то можно создать новый объект для отрисовки полоски жизни, с двумя действиями в событии рисования - одним для перемещения экземпляра к игроку (на obj_player.x, obj_player.y) и другим для непосредственного рисования полоски вокруг центра координат, с поставленным флагом relative.
Сообщение отредактировал YellowAfterlife - Суббота, 29 Июня 2013, 23:59
Страница Greenlight Название игры: BiteSizeWars Жанр: 2D RTS Платформы: PC, Mac, Linux Средство разработки: GameMaker: Studio Разработчики:YellowAfterlife (код), Cameron Znojemsky (графика), Mariano S. Pizzorno (игровая музыка) Начало разработки: Январь 2015 Описание: BiteSizeWars это мини-стратегия в реальном времени с 5-минутными матчами и онлайн мультиплеером.
Эта игра о сборе ресурсов, покупке юнитов, их улучшении, и сражении с оппонентами. Цель игры заключается в уничтожении всех юнитов противника и захвате их базы.
Планируйте свои атаки, упражняйтесь в микро-управлении армиями, и громите противников.
Поскольку события в игре происходят довольно быстро, онлайн мультиплеер делается специально с расчетом на то, чтобы быть как можно более сглаженным и честным для всех игроков.
На данный момент есть Windows версия игры с полностью рабочим онлайн мультиплеером на двоих игроков, что станет доступна в режиме раннего доступа (в Steam) после прохождения игрой greenlight. В будущем планируется следующий функционал:
Лобби, организация матчей, и ранги.
Поддержка карт большего размера и до 8 игроков (для наиболее эпичных битв)
Картостроительство и моддинг (включая поддержку Steam Workshop)
Mac и Linux версии
Отзывы приветствуются.
Сообщение отредактировал YellowAfterlife - Среда, 25 Февраля 2015, 18:38
После перечитывания темы у меня закрадываются подозрения, что я не очень правильно понял вопрос, но вот: (файл GMK)
Добавлено: Хотя можно получить искомый результат если устанавливать magnet_x/y на "точку крепления" а x/y объекта на mouse_x/y (до применения кода магнита):
Создание:
Код
magnet_x = x magnet_y = y magnet_r = 50 radius = 10
Шаг:
Код
x = mouse_x y = mouse_y // var dx, dy, dr, df; dx = x - magnet_x // delta x dy = y - magnet_y // delta y dr = dx * dx + dy * dy // squared distance if (dr > magnet_r * magnet_r) { dr = sqrt(dr) // normal distance df = magnet_r / dr // distance factor x = magnet_x + dx * df y = magnet_y + dy * df }
Сообщение отредактировал YellowAfterlife - Среда, 25 Февраля 2015, 19:14
Стоит добавить - если в файл нельзя записать данные (например, он занят другим приложением), то file_text_open_write вернет -1. Код можно структурировать как
Код
mname = get_save_filename("MapGameMaker|*.mgm",'NewMap') if (mname <> "") { smap = file_text_open_write(mname); if (smap >= 0) { // запись в файл file_text_close(smap); } }
Если это MP3 звуки и версия GameMaker 8.1 или ниже, то за раз может проигрываться лишь один (потому что проигрываются они средствами [url=https://ru.wikipedia.org/wiki/MCI_(%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81)]MCI[/url]). Способы исправления - преобразовать звуки в формат WAV или взять DLL для проигрывания звуков (например, SuperSound).
Полагаю, что это будет зависеть от реализации отдельно взятой библиотеки, но виснуть не должно - "кнопки" из библиотек преобразовываются в мини-функции, что вызываются игрой на месте нахождения кнопки в действии. При желании можно расковырять библиотеку (с помощью Extension Maker) и сделать скрипты для ее кнопок. Это подразумевает вызов скриптов через код, но, если библиотека включает в себя действия для простого рисования/позиционирования моделей, то это должно будет оставаться удобным. Так же, если библиотека совместима с GameMaker: Studio, можно попробовать импортировать тестовый проект с библиотекой в него. В GM:S делали различные улучшения генерации кода и это может решить проблему.
В GM8.0 это убрать нельзя. Насколько я помню, игра выдает ошибку на запуске, но все же работает. В GM8.1 игра не проводит инициализацию звуковой карты если в нее не добавлены звуки. В GM:S код воспроизведения звуков был переписан и ошибок не выдает (вроде бы).
Можно утащить пример отсюда (для GameMaker; использует DirectX9; бесплатная версия программы подходит для открытия примера). Способ с цветными объектами на вспомогательном буфере немного дурацкий, но нередко им и пользуются, поскольку он гарантирует "попадание" по видимому пользователю объекту. Еще способ - вычислить вектор мыши (вектор направления взгляда камеры, повернутый по X и Z в зависимости от смещения мыши от центра экрана), и по нему бросать луч для определения столкновения и следовательно объекта под мышью.