Game Maker - создание игр | HellRoom Games
Январь 22, 2017, 10:55:49 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Jelly Killer - релиз!
 
   Начало   Game Maker Помощь Правила форума Поиск Календарь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Список недокументированных возможностей и особенностей Game Maker 8.1.141  (Прочитано 3772 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Черный Думер
Пользователь
***

Репутация: 11
Offline Offline

Пол: Мужской
Russian Federation Russian Federation

API: GameMaker 8.1 Standard
Деятельность: Организатор проектов, тестер, разработчик вспомогательного кода
Сообщений: 50


Треугольник будет выпит!


WWW
« : Июль 28, 2014, 19:22:47 »

Как известно, версия 8.1 стала первой из версий GameMaker, для которой выпускались постоянные автоматические обновления. Однако - увы и ах - разработчики программы зачастую забывали обновлять справку по программе, находившуюся и в без того весьма незавидном состоянии. В итоге "классический" GameMaker за всё время своего существования обзавёлся сравнительно большим количеством недокументированных особенностей.
Так как информации по ним практически нет, я решил собрать в одном месте все недокументированные особенности последней "классической" версии GM - 8.1.141.
Для создания списка использовался официальный список изменений (Release Notes) для сборок версии 8.1, обрывки информации с тематических форумов, а также собственный опыт.
Надеюсь, кому-нибудь окажется полезно.

НЕДОКУМЕНТИРОВАННЫЕ ФУНКЦИИ

Рекомендованные к применению:


 - clamp( val, min, max )
Возвращает аргумент, который меньше одного и больше другого, то есть среднее из трёх чисел. Эту функцию можно сравнить с median(), но в отличие от неё эта принимает строго 3 аргумента. Была создана для ограничения значения по некоторому диапазону, так как раньше для этого программисты использовали median(), if-конструкции или комбинацию из функций min() и max(), что запутывало код.
Наличие в Studio: Да (подробное описание в официальной справке)
Дополнительно: Функция появилась в версии 8.1.141, упомянута вместе с описанием в Release Notes:
Цитировать
clamp( number, min, max ) - returns number once it has been clamped between the min and max values

 - lerp( val1, val2, amount )
Возвращает промежуточное значение между val1 и val2, вычисленное по формуле val1 + (val2 - val1) * amount. Может использоваться для линейной интерполяции. При этом предполагается, что amount соответствует выражению 0 < amount < 1 (однако кодом самой функции значение этого аргумента не ограничивается).
Наличие в Studio: Да (подробное описание в официальной справке)
Дополнительно: Функция появилась в версии 8.1.141, упомянута вместе с описанием в Release Notes:
Цитировать
lerp( val1, val2, amount ) - returns val1 + ((val2 - val1) * amount). (NOTE: amount is not clamped, but is expected to be in 0..1 range)

 - draw_sprite_pos( sprite, subimg, x1, y1, x2, y2, x3, y3, x4, y4, alpha )
Рисует четырёхугольник с углами в указанных координатах, затекстурированный указанным изображением (при необходимости искажённым).
Наличие в Studio: Да (подробное описание в официальной справке)
Дополнительно: Функция появилась в одной из сборок 8.1, точный номер которой неизвестен. Упоминания в Release Notes о ней отсутствуют.

 - d3d_set_zwriteenable( on_off )
Включает (on_off = true) или отключает (on_off = false) буфер глубины (Z-буфер) в 3D-режиме.
Наличие в Studio: Да (подробное описание в официальной справке)
Дополнительно: Функция появилась в версии 8.1.139, упомянута вместе с описанием в Release Notes:
Цитировать
Added d3d_set_zwriteenable( enable ) function, takes a single parameter that indicates if z writing is on (true) or off (false)

 - YoYo_EnableAlphaBlend( enable )
Включает (enable = true) или отключает (enable = false) альфа-смешивание (т.е. использование канала прозрачности) при отрисовке. Если альфа-смешивание отключено, то вся графика рисуется полностью непрозрачной, вне зависимости от установленного уровня прозрачности отрисовки и канала прозрачности рисуемых изображений. Крайне рекомендуется использовать в тех случаях, когда альфа-смешивание не нужно для отрисовки, так как его отключение очень сильно повышает её скорость.
Наличие в Studio: Да, переименована в draw_enable_alphablend() (подробное описание в официальной справке)
Дополнительно: Функция появилась в одной из сборок 8.1, точный номер которой неизвестен. Упоминания в Release Notes о ней отсутствуют, а префикс "YoYo_" намекает, что она предназначалась только для внутреннего использования или была частью уже разрабатывающейся GameMaker: Studio.

 - GameMaker: Studio - Obsolete File Functions
Как ни странно, но эти функции для работы с текстовыми файлами из старых версий GM даже будучи заменёнными на функции file_text_* сумели дойти до 8.1 в неизменном виде. Их главное отличие от функций file_text_* в том, что они не используют файловые потоки (т.е. работают с одним файлом). Могут оказаться полезными при разовых операциях чтения/записи (например, при работе с файлами конфигурации). Синтаксис у них полностью идентичен оному у аналогичных функций file_text_* за исключением одного - отсутствия аргумента индекса файла.

НЕ рекомендованные к применению (описаны только ради общего интереса):

 - YoYo_GetPlatform()
Возвращает константу, определяющую операционную систему, на которой запущена GM-программа.
Наличие в Studio: Нет
Дополнительно: Функция появилась в одной из сборок 8.1, точный номер которой неизвестен. Упоминания в Release Notes о ней отсутствуют. Скорее всего, не была превращена в полноценную функцию (префикс "YoYo_" намекает на техническое её предназначение) по причине замены на более быстрый и удобный вариант - константу os_type (задокументирована).

 - YoYo_GetDevice()
Возвращает константу, определяющую тип устройства, на котором запущена GM-программа.
Наличие в Studio: Нет
Дополнительно: См. YoYo_GetPlatform(). Скорее всего, не была превращена в полноценную функцию также по причине замены на константу os_device (задокументирована). Примечательна тем, что в отличие от YoYo_GetPlatform() не имеет подсказки, а следовательно не отображается в автозаполнителе и подсказке внизу редактора кода.

 - move_contact( direction )
Функция, оставшаяся "в наследие" от старых версий GM. Полностью эквивалентна вызову задокументированной move_contact_all() с -1 в качестве второго аргумента. Теоретически, может использоваться для некоторого упрощения кода.

 - make_color( red, green, blue )
Функция, оставшаяся "в наследие" от старых версий GM. Полностью эквивалентна задокументированной make_color_rgb().

 - Множество функций с префиксом "action_"
Секрет происхождения этих функций незамысловат - они являются частью встроенных LIB-библиотек Drag&Drop действий. Как бы то ни было, их ни в коем случае не рекомендуется использовать в обычном коде. А если учесть, что они в подавляющем большинстве своём являются псевдонимами для функций GML, то это и не требуется.

НЕДОКУМЕНТИРОВАННЫЕ КОНСТАНТЫ И ПЕРЕМЕННЫЕ

 - image_single
Переменная, ведущая свою историю со старых версий GM. Определяет номер отображаемого в данный момент кадра спрайта, присвоенного объекту. Предполагала ручное изменение значения для создания анимации. В дальнейшем была заменена комбинацией переменных image_index и image_speed того же уровня. Однако может оказаться полезной в том случае, если нужно остановить анимацию без изменения значения переменной image_speed - image_single имеет больший приоритет, чем image_index, поэтому если её значение отлично от -1, то отрисовываться будет именно указанный ею кадр.
Уровень: локальная переменная каждого объекта

 - argument_count
Определяет количество переданных в функцию аргументов. Полезна при написании функций, использующих произвольное число аргументов (т.е. работающих с массивом argument(x), а не с переменными argument0..argument15).
Уровень: локальная константа каждого скрипта

 - argument_relative
Эту функцию было бы несправедливо называть совсем уж недокументированной, но её описание содержится только в справке к Library Maker - программе для создания LIB-библиотек Drag&Drop действий. С которыми она и связана, так как определяет, был ли в действии указан параметр "Relative" для передаваемых в скрипт действия аргументов. Следовательно, использовать её в обычных скриптах совершенно незачем - она пригодится только создателям LIB-библиотек.
Уровень: локальная переменная каждого скрипта, но имеет смысл быть использованной только во внутренних скриптах Drag&Drop действий

НЕДОКУМЕНТИРОВАННЫЕ ОСОБЕННОСТИ ДВИЖКА И GML

1. Возможность использования вместо C-подобного синтаксиса Delphi-подобный.
Да, именно так. В GML зарезервированы ключевые слова then, begin, end, not, and, or, xor, а также допускается использование операторов присваивания ":=" и сравнения "=" вместо C-подобных "=" и "==" соответственно.
Наличие в Studio: Да (также недокументированно)

2. Именование блоков кода в событиях объектов.
Теперь если внутри кода действия "Execute a piece of code" в самом начале перед первой строкой поставить тройную дробь (т.е. "///"), то получившийся комментарий станет названием этого действия.
Наличие в Studio: Да (подробное описание в официальной справке)

3. Контейнер "local".
Является по сути противоположностью контейнеру "global", так как содержит переменные уровня выполняемого скрипта. Позволяет создавать их без использования ключевого слова "var" (равно как контейнер "global" позволяет создавать глобальные переменные без использования ключевого слова "globalvar"), однако и обращение к созданным таким способом переменным также должно происходить с указанием контейнера (т.е. local.myvar).
Наличие в Studio: Да (также недокументированно)

4. INI-файлы теперь могут храниться везде, а не только в папке с EXE-файлом GM-программы.
Да, это именно то, чего все так долго ждали. Начиная с версии 8.1.108 это ограничение было убрано, о чём свидетельствует упоминание в Release Notes:
Цитировать
Removed the restriction that INI files have to be in the same directory as the executable - they can now be anywhere.

Наличие в Studio: Нет (в связи с внедрением принципа "песочницы" при работе с файловой системой)

5. Теперь если в GM-программе отсутствуют вложенные звуковые ресурсы, то звуковая подсистема не инициализируется.
Эта особенность наверняка обрадует любителей использовать сторонние звуковые движки наподобие FMOD. И вправду - не использующаяся, но обрабатывающаяся в фоновом режиме звуковая подсистема отъедала часть ресурсов компьютера, влияя на производительность GM-программы. Однако это не значит, что теперь нельзя использовать внешне подгружаемые звуки - GM автоматически запустит звуковую подсистему при добавлении любого нового звука (однако будьте осторожны - это может вызвать небольшое подвисание).
Данная особенность появилась либо в версии 8.1.106, либо в 8.1.139 - такая неопределённость связана с двумя похожими упоминаниями в Release Notes:

Цитата: 8.1.106
If there are NO sound (mp3,wav etc.) resources included in the program, the audio subsystem will not initialise. This will allow for faster turn around on testing. If you load sounds later during the game, Audio will then initialise at that point, causing a STALL in your application, so use with care.

Цитата: 8.1.139
If you have no sound at all in the export then Sound is not initialised (even if you have deleted all the sounds)

6. Умножение строк.
Более короткая и удобная альтернатива стандартной и вполне задокументированной функции string_repeat().
Пример:
Код:
text = "foo" + 3 * "bar";

В результате выполнения этого кода переменная text будет содержать строку "foobarbarbar".
Стоит отметить, что операция умножения может располагаться только с левой стороны строки, которую надо умножить. Т.е. следующая запись некорректна:
Код:
text = "bar" * 3;

7. Блоки кода в for-циклах.
Как известно, условие цикла for, перекочевавшего в Game Maker напрямую из Си и ему подобных языков, состоит из трёх частей: инициализации, условия выполнения, модификатора условия. Во многих языках (например, в Perl) есть возможность указывать в каждой из этих частей сразу несколько отдельных синтаксических выражений. Однако мало кто знает, что такая же возможность есть и в GML. Для этого нужную часть надо заключить в фигурные скобки, например так:
Код:
for({a=0;b=2}; a*b < 6; a += 1)

Данная функциональность интересна в частности тем, что позволяет организовать определение переменной-счётчика прямо в условии цикла, примерно как в C99 и многих других языках программирования. Пример:
Код:
for({var i;i=0}; i<3; i+=1) {
  show_message(i);
}

8. Возможность неполных вычислений в условиях if-ветвлений.
Многими современными языками поддерживается стратегия вычисления логических выражений, при которой вычисление может быть прервано если результат заранее стал известен. Эта стратегия называется "неполным вычислением", а также "short-circuit evaluation" - "вычисление по короткой схеме" (дословный перевод). Описание в английской Википедии.
Эта стратегия вычисления зачастую помогает сэкономить ресурсы и время выполнения. Она основана на двух правилах:
  • если часть выражения в операции AND ложна, то и всё выражение ложно;
  • если часть выражения в операции OR истинна, то и всё выражение истинно.

В Game Maker существует возможность имитировать в условиях if-ветвлений первое правило без ущерба для стиля кода.
Делается это так:
  • Если в логическом выражении некоторая его часть должна быть вычислена обязательно (например, происходит вызов функции), то эта часть должна быть выделена в отдельное выражение (выделением скобками или выносом перед ветвлением). Назовём такие части важными.
  • Затем вычисления располагаются в порядке от наиболее важных до наименее. При одинаковой важности двух частей вычисления рекомендуется выбирать из них менее затратное (т.е. потенциально более быстро выполняемое). Это правило сохраняется и при отсутствии важности как таковой - тогда она полагается у всех частей выражения равной.
  • Операторы && / and между частями выражения заменяются на ключевое слово if без вынесения его в отдельный блок.

Пример:
Код:
if place_meeting(x, y, o_bullet) && !check_if_protected(id) && !godmode {/* обычное вычисление */}
if !godmode if place_meeting(x, y, o_bullet) if !check_if_protected(id) {/* неполное вычисление */}
« Последнее редактирование: Апрель 20, 2016, 22:16:58 от Черный Думер » Записан

Codepage Converter - Обеспечение совместимости старых расширений с GM 8.1
Bit Wizard - Функции для работы с битами
XP Messages - Стандартные сообщения GM в WinXP-стиле

Чёрный Думер, Черный Думер
С монстрами сражается.
Черный Думер, Черный Думер
Рокетланчер плавится.
AndrewVideoGames
Главный Модератор
*

Репутация: 587
Online Online

Пол: Мужской
Russian Federation Russian Federation

Награды:
5000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+500 репутации]За помощь новичкам!
API: GameMaker Studio Pro
Деятельность: Coder, Artist
Сообщений: 5598



« Ответ #1 : Июль 28, 2014, 19:37:56 »

 Почему статья в разделе "Для продвинутых пользователей"? Вам нужен этот раздел: http://forum.hellroom.ru/index.php?board=29.0
Записан
Fantom
I am... All of me
Гл. Администратор
*

Репутация: 1310
Offline Offline

Пол: Мужской
Russian Federation Russian Federation

Награды:
5000 сообщений!За постоянность! [500 дней на форуме]За лояльность! [+1000 репутации]За отличные статьи по Game Maker!Тру Админ :DЗнаток Game Maker...
API: GameMaker Studio Master
Деятельность: Experienced Programmer
Сообщений: 5030



« Ответ #2 : Июль 28, 2014, 19:44:22 »

Да уж, это крепко вошло у ЁЁшников в привычку.
Записан

Черный Думер
Пользователь
***

Репутация: 11
Offline Offline

Пол: Мужской
Russian Federation Russian Federation

API: GameMaker 8.1 Standard
Деятельность: Организатор проектов, тестер, разработчик вспомогательного кода
Сообщений: 50


Треугольник будет выпит!


WWW
« Ответ #3 : Июль 28, 2014, 19:45:52 »

Почему статья в разделе "Для продвинутых пользователей"? Вам нужен этот раздел: http://forum.hellroom.ru/index.php?board=29.0

А что здесь тогда делает статья про оптимизацию, например (не в обиду автору)? Да и будем честны - в том разделе обе мои статьи сгинут, так как там строгой GML-тематики нет. Мне бы этого не хотелось, признаться.
Записан

Codepage Converter - Обеспечение совместимости старых расширений с GM 8.1
Bit Wizard - Функции для работы с битами
XP Messages - Стандартные сообщения GM в WinXP-стиле

Чёрный Думер, Черный Думер
С монстрами сражается.
Черный Думер, Черный Думер
Рокетланчер плавится.
AndrewVideoGames
Главный Модератор
*

Репутация: 587
Online Online

Пол: Мужской
Russian Federation Russian Federation

Награды:
5000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+500 репутации]За помощь новичкам!
API: GameMaker Studio Pro
Деятельность: Coder, Artist
Сообщений: 5598



« Ответ #4 : Июль 28, 2014, 20:04:58 »

Почему статья в разделе "Для продвинутых пользователей"? Вам нужен этот раздел: http://forum.hellroom.ru/index.php?board=29.0
А что здесь тогда делает статья про оптимизацию, например (не в обиду автору)?
Чтобы не задавали тупых вопросов, удобно, сразу можно поискать в закрепленной теме.
Записан
MusNik
KeeVee Games
GM Pro user
*

Репутация: 709
Offline Offline

Пол: Мужской
Russian Federation Russian Federation

Награды:
3000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+500 репутации]За отличную игру Rock painting story!За помощь в развитии форума!За отличные статьи по Game Maker!...
API: GameMaker Studio 2
Сообщений: 3177


Tiny Alien :3


WWW
« Ответ #5 : Июль 28, 2014, 20:26:24 »

Статья хорошая

P.S. Эту тогда тоже что ли переместите http://forum.hellroom.ru/index.php?topic=19676
Записан

Черный Думер
Пользователь
***

Репутация: 11
Offline Offline

Пол: Мужской
Russian Federation Russian Federation

API: GameMaker 8.1 Standard
Деятельность: Организатор проектов, тестер, разработчик вспомогательного кода
Сообщений: 50


Треугольник будет выпит!


WWW
« Ответ #6 : Июль 29, 2014, 01:25:09 »

Не, та тема посвящена проблемам и находится в подфоруме о проблемах, так что всё нормально.
А вот если бы админы прилепили что ту тему, что эту (потому что они реально позволяют прокачать умение пользоваться GM), то это было бы просто прекрасно.

Вполне допускаю, что у меня могут быть проблемы с пониманием назначения разделов, но это только потому, что я не завсегдатай здесь.
Записан

Codepage Converter - Обеспечение совместимости старых расширений с GM 8.1
Bit Wizard - Функции для работы с битами
XP Messages - Стандартные сообщения GM в WinXP-стиле

Чёрный Думер, Черный Думер
С монстрами сражается.
Черный Думер, Черный Думер
Рокетланчер плавится.
MusNik
KeeVee Games
GM Pro user
*

Репутация: 709
Offline Offline

Пол: Мужской
Russian Federation Russian Federation

Награды:
3000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+500 репутации]За отличную игру Rock painting story!За помощь в развитии форума!За отличные статьи по Game Maker!...
API: GameMaker Studio 2
Сообщений: 3177


Tiny Alien :3


WWW
« Ответ #7 : Июль 29, 2014, 01:39:21 »

Не, та тема посвящена проблемам и находится в подфоруме о проблемах, так что всё нормально.
Ну не знаю, там вроде о проблемах спрашивают, а уже потом решают, а готовые решения обычно пишут в статьях. Но это имхо, как решат админмодеры.
Записан

Черный Думер
Пользователь
***

Репутация: 11
Offline Offline

Пол: Мужской
Russian Federation Russian Federation

API: GameMaker 8.1 Standard
Деятельность: Организатор проектов, тестер, разработчик вспомогательного кода
Сообщений: 50


Треугольник будет выпит!


WWW
« Ответ #8 : Июль 29, 2014, 14:23:32 »

Добавил ещё одну недокументированную особенность, о которой я забыл упомянуть. См. конец списка.

Добавлено: Апрель 20, 2016, 22:06:48
Добавил ещё две недокументированные особенности. Опять же, смотрите конец списка.
« Последнее редактирование: Апрель 20, 2016, 22:06:48 от Черный Думер » Записан

Codepage Converter - Обеспечение совместимости старых расширений с GM 8.1
Bit Wizard - Функции для работы с битами
XP Messages - Стандартные сообщения GM в WinXP-стиле

Чёрный Думер, Черный Думер
С монстрами сражается.
Черный Думер, Черный Думер
Рокетланчер плавится.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Vendet | HellRoom Games © 2006-2015 All Rights Reserved
Powered by SMF 1.1.21 | SMF © 2013, Simple Machines