Кароче, дело такое, когда ложишь две палки рядом, сталкиваешься с обоими и выкидываешь палку то переменная палки увеличивается в обоих стаках палок. Как можно подобное пофиксить?
Зависит от реализации. Полагаю, сейчас сделано как "если нажата кнопка > если есть столкновение > для всех пересекающих объектов > (увеличить количество)"? Если так, то третье условие можно заменить на выборку ближайшего объекта (Pick Nearest).
Сообщение отредактировал YellowAfterlife - Пятница, 08 Мая 2015, 18:47
Факт того, что видны лишь вертикальные "зазоры", вызывает у меня вопрос - округлены ли координаты вида? Если изображения рисуются на дробных координатах, зачастую "стыкуются" они не очень хорошо. Если это не помогает, для избежания перестановки тайлов на уровнях можно на старте комнаты пройтись по всем "клеткам" с помощью tile_layer_find, и поменять им координаты в фоне (tile_set_region) для соответствия правкам Tileset Champion. Другое решение - нарисовать все интересующие тайлы на поверхность, и рисовать на экран уже ее. На HTML5 это так же неплохо помогает с производительностью, но трюк нужно повторять при движении камеры (когда на экране должна появится пока еще не нарисованная в поверхность полоска тайлов). Tile:Horizontal, Tile:Vertical на спрайтах делают вещи аналогичные действиям Tileset Champion для тайлов - они определяют, каким образом будут добавлены "рамки" вокруг изображений в странице текстур для избежания наблюдаемых глюков. "Use for 3D" дает изображению отдельную страницу текстур (это полезно лишь для непосредственного 3D, где может возникнуть потребность рисовать замощенную текстуру).
Почему-то так и подумал. Тогда возникает вопрос: почему эта штука не работает, а ручная дорисовка даёт положительный эффект?
Потому что tile:* добавляет "рамки" вокруг фона в целом, а не отдельных тайлов в нем. Если бы каждый тайл был отдельным фоном, это бы помогло. `Global Game Settings - /HTML5\ - /Graphics\ - /Texture Pages\ - [Preview]` чтобы посмотреть на генерируемую страницу текстур.
Тогда я поигрался с глубиной, и теперь дерево растёт выше темноты ночной! Это плохо.
А чем это плохо? Разве дерево (по крайней мере, его ветви) не должно быть полностью черным и над всеми объектами, поскольку свет до его вершины его кроны никак достать не может?
Уточнение: Я имею в виду, что дерево не может быть "ярким"/"освещенным" в любом случае, поскольку свет на него сверху попадать не может. Следовательно, можно оставить его над всеми объектами, и просто затемнить с помощью какого-нибудь image_blend.
Сообщение отредактировал YellowAfterlife - Воскресенье, 10 Мая 2015, 17:54
(Например, в HTML фреймы обмениваются информацией в целом, один не может адресовать конкретный фрагмент другого)
Не совсем. В JS разрешается управлять содержимым iframe в документе если он находится на том же домене, в том числе и адресовать document/window iframe'а. Следовательно, при загрузке iframe можно просто присвоить ссылку на "внешний" документ в одну из переменных, и из iframe можно будет через эту переменную работать с содержащим его документом. А далее - дело техники - разработать набор функций, что позволят достаточно удобно находить нужный элемент в том или ином фрейме. Чтобы не разбрасываться пустыми словами, сделал пример, в котором ссылка в каждом из двух фреймов меняет содержимое отдельного элемента в другом.
В какой-то момент включение публичной папки убрали, и теперь ее можно получить лишь в составе платной подписки. Я писал запись о использовании Google Drive для прямых ссылок. GD регулярно переставляет кнопки по интерфейсу но функционал остается на месте.
Создание вспомогательного объекта (контроллера): global.unit_selected = -1 Событие глобального нажатия левой кнопки мыши для этого объекта: global.unit_selected = -1 with (obj_unit) { if (position_meeting(mouse_x, mouse_y, id)) { global.unit_selected = id } } События юнита, где нужна проверка на "выбранность": if (global.unit_selected == id) { // сейчас выбран данный юнит, можно реагировать на ввод пользователя. } Чтобы не разбираться с разграничением, когда клик должен выделять, а когда двигать юнитов, движение\следование за мышью можно установить на ПКМ (если оно еще не там).
Спасибо за совет... А по поводу разбирательства с кликом и движением... А как это будет выглядеть допустим на Андроиде? Ведь по сути там нет правой и левой кнопки мыши.
По умолчанию, два быстрых касания считаются GMS за клик правой кнопки мыши. В зависимости от игры, для мобильных платформ можно поменять функции ЛКМ/ПКМ местами, если двигать юниты игроку придется чаще, чем их выбирать.
Встроенное поведение можно так же отключить с помощью device_mouse_dbclick_enable и написать какую-то свою обработку - думаю, идею (то ли это будет задержка касания на юните, то ли кнопка для выбора, то ли что-то иное) можно подсмотреть в каких-нибудь существующих играх похожего рода.
Вариант 1: Записывать индекс комнаты: // сохранение: ini_open("some.ini") ini_write_real("room", "index", room) ini_close() // загрузка: ini_open("some.ini") if (ini_key_exists("room", "index")) { room_goto(ini_read_real("room", "index", -1)) } else { // INI нет вовсе или номер комнаты в нем не записан. } ini_close()
Вариант 2: Записывать имя комнаты и правильно его считывать: // сохранение: ini_open("some.ini") ini_write_string("room", "name", room_get_name(room)) ini_close() // загрузка: ini_open("some.ini") if (ini_key_exists("room", "name")) { room_goto(asset_get_index(ini_read_string("room", "name", ""))) } else { // INI нет вовсе или имя комнаты в нем не записано. } ini_close() (если версия 8.1 или ниже то заменить asset_get_index скриптом отсюда)
Сообщение отредактировал YellowAfterlife - Четверг, 28 Мая 2015, 20:09
Если искать в google images по запросу "swirl plant pattern texture" или "swirl flower pattern texture", можно найти много похожего. Упор на наличие в запросе "pattern" (узор). Можно и "seamless pattern" вместо "pattern texture".
device_mouse_check_button позволяет указать номер "мыши" (касания) что необходимо если хочется сделать мультитач (например, для "джойстиков" в углах экрана). mouse_check_button(b) работает как device_mouse_check_button(0, b).
Данная проблема - баг (ссылка на рапорт), который слишком уж неспешно исправляют. Ещё риведенный код можно немного упростить с помощью "else if" draw_set_font(font0) //заранее выбрать шрифт и вбить в него русский алфавит draw_text(10,10,string(str)) //рисуем строку
ifkeyboard_check_pressed(vk_anykey) //нажатие клавиши { ifkeyboard_check_pressed(vk_backspace) //бэкспейс { if (string_length(str) > 0) //в строке есть символы { str=string_delete(str,string_length(str),1) //удаляем последний символ } } elseifkeyboard_check_pressed(vk_delete) { str=string_delete(str,1,1) //удаляем первую букву } elseif !keyboard_check_pressed(vk_shift) { if (string_length(str) < 30) // максимум символов в строке { key=keyboard_lastchar//нажатая клавиша str += key//добавление буквы в строку } } } Такой подход вполне нормально работает, но имеет один дефект - при зажатии кнопки буквы не будут вводится\стираться с указанной в системных настройках клавиатуры скоростью, как это происходит при использовании обычного keyboard_string.
Сообщение отредактировал YellowAfterlife - Вторник, 09 Июня 2015, 09:28
Название: GameMaker' Visualizer Жанр: Программа/утилита Платформы: Веб Автор: YellowAfterlife (VK | Twitter) Ссылка: yellowafterlife.itch.io/gmvisualizer Описание: GameMaker' Visualizer это веб-программа с двумя основными функциями: 1. Подсветка DnD/GML: Программа может взять кусок кода или отрывок "object information", подсветить код/выражения/DnD иконки в них, и вывести HTML (для сайтов/блогов) или BB (для форумов) код. 2. Перевод DnD в GML: Если дать программе ранее упомянутый фрагмент "object information", она может перевести его в эквивалентный GML код. Процесс преобразования довольно точный и учитывает причуды DnD (к примеру, особенности обработки "applies to" для разных типов действий).
Скриншоты: Генерация BB кода:
Генерация HTML кода:
Перевод DnD в GML:
GIF-ка с вышеперечисленными:
О случаях использования:
Давайте предположим, что у вас есть это DnD событие: И вам нужно отправить его на форум, будь то в качестве ответа на чей-то вопрос, или как часть урока. Обычно у вас есть несколько вариантов действий: А: Вставить его как "object information". В общем-то неплохо, но выглядит не очень хорошо:
Цитата
Keyboard Event for <Right> Key: repeat next action (block) move_speed times if relative position (1,0) is collision free for Only solid objects jump relative to position (1,0) else exit this event
Б: Вставить скриншот. Выглядит хорошо, несложно проделать, но не стоит забывать о маленьком факте того, что сайты не могут гарантировать вечного хранения файлов, и в какой-то момент времени картинка может "накрыться", вместе с удобством/возможностью читаемости записи. В: "Do it yourself" - вручную выделить интересующие части, расставить отступы, добавить картинки кнопочек. Выглядит хорошо, но занимает немало времени, поэтому этим никто особо не занимается.
А теперь о том, с чем вам может помочь GM' Visualizer. Вы вставляете в программу свой "object information" (или его фрагмент), нажимаете на кнопку, и получаете подсвеченный BB код:
Keyboard Event for <Right> Key: repeat next action (block) move_speed times if relative position (1,0) is collision free for Only solid objects jump relative to position (1,0) else exit this event (в данном случае мной была использована опция "use small icons" для компактности)
Как можно заметить, программа не только выдает код с изображениями для DnD значков, но и подсвечивает интересующие части (параметры) и выражения, чего даже сам GameMaker пока не делает.
А если нажать другую кнопку ("GML"), ваш DnD волшебно превратится в чистенький GML код:
Код
repeat (move_speed) if (place_free(x + 1, y)) { x += 1 } else { exit }
... который тоже можно подсветить, раз уж форумы всё равно особо не подсвечивают GML код: repeat (move_speed) if (place_free(x + 1, y)) { x += 1 } else { exit }
Ещё у программы открытый исходный код, который можно найти на Github. Не уверен, лучшее ли место данной теме в "готовых проектах", так как такое в идеальном случае крепится в разделе по GameMaker (что и было сделано на англ. форуме с согласия администрации). Должно быть полезным.
Сообщение отредактировал YellowAfterlife - Пятница, 12 Июня 2015, 23:03
Flow, А для подобного вида работы требуется лишь подключиться к любой беспроводной сети, и можно хоть из другого города этим заниматься, если компьютер включен?
Да. Расстояние лишь определяет время между действием и изменением на экране (пока действие дойдет до компьютера и назад вернется обновление области экрана), но при наборе кода это не очень сильно мешает, если задержка невелика.
Если пока ещё ведется выбор устройства, упоминание планшетов на Win8[.1] это дельный совет - у меня на столе рядом с компьютером расположен Asus Vivotab Smart, и GMS на нем работает вполне нормально. Ещё выбор устройства на базе Windows позволит использовать его в качестве дополнительного монитора на основном компьютере с помощью Mouse Without Borders или Synergy. Одно лишь примечание - желательно приобрести какую-нибудь bluetooth клавиатуру, так как счастья в наборе кода на сенсорной клавиатуре очень мало.
Поддерживает и GM8 и GMS. Кнопочки у обоих преимущественно одинаковые. Файл с описанием действий для их распознания дает неплохую картину происходящего -- несколько кнопок убрали, несколько добавили, в нескольких поменяли параметры. GMS-специфичный синтаксис и функции тоже поддерживаются, пример: vararray = undefined; vargrid = ds_grid_create(1, 1); array[0] = 1; grid[#0, 0] = array; show_debug_message(array_get(grid[#0, 0], 0)); // 1 array[@0] = 2; show_debug_message(array_get(grid[#0, 0], 0)); // 2
Создать список, занести значения, перемешать список, достать первые 8 значений: varlist; list = ds_list_create() for (vari = 0; i < 16; i += 1) ds_list_add(list, i) ds_list_shuffle(list) n_1 = ds_list_find_value(list, 0) n_2 = ds_list_find_value(list, 1) n_3 = ds_list_find_value(list, 2) n_4 = ds_list_find_value(list, 3) n_5 = ds_list_find_value(list, 4) n_6 = ds_list_find_value(list, 5) n_7 = ds_list_find_value(list, 6) n_8 = ds_list_find_value(list, 7) n_1 = ds_list_find_value(list, 0) ds_list_destroy(list) Но проблема правда вряд ли в этой части - даже для 8-ого значения шанс того что оно совпадет с каким-либо из предыдущих будет 1/2.