Всем привет!
В этой статье я хотел бы рассказать о Monkey — языке программирования, направленного, в первую очередь, на создание кроссплатформенных 2D-игр. Этот инструмент, на мой взгляд, несколько незаслуженно обделен вниманием разработчиков и я хотел бы это исправить.
Monkey ни в коем случае не является «убийцей» Unity и других подобных инструментов. Но он может заинтересовать начинающих, а также независимых разработчиков игр, чей бюджет в значительной степени ограничен. Если мне удалось вас заинтересовать, добро пожаловать под кат.
Язык
Monkey — объектно-ориентированный, транслируемый язык программирования, кроссплатформенность которого достигается за счет транслирования кода Monkey в нативный для платформы язык.
Официально, код Monkey может быть транслирован в следующие языки программирования: С++, C#, Java, JavaScript и ActionScript. Тем не менее, этот список может быть расширен, путем написания собственных трансляторов. Так, сообществом Monkey, были успешно разработаны трансляторы для Python и BlitzMax.
Monkey относится к семье языков с BASIC-подобным синтаксисом. Но в нем также отчетливо прослеживается влияние Java. Язык имеет статическую типизацию, обеспечивает модульность, поддерживает абстракцию, инкапсуляцию, наследование и полиморфизм, а также интерфейсы, обобщённые типы, свойства, итераторы и исключения.
' включение строгого режима
Strict
' импорт модуля mojo
Import mojo
' точка входа приложения monkey
Function Main:Int()
New GameApp
Return 0
End
' основной класс, расширяющий класс mojo app
Class GameApp Extends App
Field player:Player
' переопределение метода mojo oncreate
Method OnCreate:Int()
' загрузка изображения player.png в переменную img, медиаданные должны хранится в папке project.data
Local img:Image = LoadImage("player.png")
player = New Player(img, 100, 100)
' установка обновлений в секунду равным 60
SetUpdateRate 60
Return 0
End
' переопределение метода mojo onupdate
Method OnUpdate:Int()
player.x+=1
If player.x > 100
player.x = 0
End
Return 0
End
' переопределение метода mojo onrender
Method OnRender:Int()
' очистка экрана заданным цветом (красный, зеленый, синий)
Cls 32, 64, 128
player.Draw()
Return 0
End
End
' класс игрока
Class Player
Field x:Float, y:Float
Field image:Image
' конструктор
Method New(img:Image, x:Int, y:Int)
self.image = img
self.x = x
self.y = y
End
' рисование спрайта
Method Draw:Void()
DrawImage image, x, y
End
End
Автором языка является новозеландский разработчик Марк Сибли — основатель Blitz Research Ltd. Этот человек известен некоторым разработчикам по таким инструментам для создания игр, как BlitzBasic, Blitz3D и BlitzMax. По сути, Monkey является эволюцией линейки всех предшествующих продуктов компании Blitz Research Ltd.
Кроссплатформенность
Как я уже писал выше, кроссплатформенность достигается за счет транслирования. По сути, все что умеет транслятор Monkey — это проверять и транслировать код, собирать валидный для платформы проект, и запускать нативные средства для сборки приложений. В связи с этим, для сборки итогового приложения, вам понадобится установить SDK для всех требуемых платформ. Ниже приведена таблица доступных на данный момент платформ и список необходимого ПО.
Платформа | Необходимое ПО |
---|---|
HTML5 | не требуется |
Flash | Flex SDK, Java SE |
GLFW (Windows, Mac) | MS VC++ или MinGW, OpenAL |
Android | Android SDK, Java SE (32-bit), ANT (Windows) |
iOS | OS X 10.6, XCode |
XNA (Windows, WP7, XBox 360) | XNA Game Studio 4.0, MS VC#, WP SDK 7.1 |
PSM (PS Vita) | PSM SDK |
Таким образом, нам удается избежать использования различных лаунчеров и плагинов для запуска итоговых приложений. Все выглядит так, как если бы мы писали приложение самостоятельно. Конечно, транслированный код получается малочитаемым и не всегда оптимальным, но вместе с этим дает все преимущества нативной разработки.
Как видно из приведенной выше таблицы, на данный момент поддерживаются следующие платформы: HTML5, Flash, Android, iOS, WP7, PS Vita, Xbox 360, Windows и Mac. Linux также поддерживается, но пока неофициально. Как и в случае с трансляторами, этот список может быть расширен путем собственной реализации поддержки необходимых вам платформ.
Транслятор
Транслятор, как бы странно это не звучало, написан на Monkey. Но как и в случае с яйцом и курицей, был промежуточный этап, когда транслятор был написан на BlitzMax. Исходный код транслятора полностью открыт, поэтому, в случае необходимости, вы можете вносить изменения и пересобирать его в Monkey, используя целевую платформу Stdcpp (стандартный C++).
Препроцессор
Monkey использует простой препроцессор для разделения специфичных участков кода для различных платформ, установки дополнительных параметров конфигурации, а также для включения или исключения блоков кода в зависимости от конфигурации сборки.
Использование нативного кода
Для написания платформозависимого кода может быть использован нативный для платформы язык. С помощью директивы Extern, в код Monkey могут быть включены классы и функции, использующие специфичные особенности платформы. Это дает возможность практически без ограничений расширять функционал вашего приложения.
Модули
Возможности языка, могут быть расширены с помощью модулей, которые можно писать, как непосредственно на Monkey, так и на нативном для платформы языке.
«Из коробки» Monkey поставляется со следующими модулями:
- monkey (базовые возможности языка)
- brl (набор классов и функций для работы с потоками)
- reflection (отражение)
- os (модуль для работы с операционной системой)
- dom (модуль для работы с DOM-деревом HTML-документа)
- mojo (2D-фреймворк)
- opengl (модуль для работы c OpenGL)
В дополнение к этому списку, сообществом разработчиков было написано более 20-ти дополнительных модулей, включая порты различных физических движков (Box2D, Chipmunk и Fling), GUI-системы, модули для работы со шрифтами, модули для реализации IAP (in-app purchase), модули для работы с XML, JSON и различными сервисами. Список большинства доступных, на данный момент, модулей можно посмотреть здесь.
Разработка игр
Вот мы и подошли к самому главному. В начале статьи я сказал, что Monkey, в основном, используется для создания 2D-игр. Но, как видите, сам язык под это дело не заточен.
Mojo
Для разработки игр используется модуль mojo, который поставляется вместе с Monkey. Этот модуль предоставляет разработчику кроссплатформенный API для работы с 2D-графикой, звуком и устройствами ввода. Возможности фреймворка несколько ограничены и связано это, в первую очередь, с необходимостью поддержки множества платформ. Не все возможности доступные на одной платформе доступны на другой. Если какая-то «фишка» недоступна хотя бы на одной из платформ, то она не будет включена в mojo. Конечно, это несколько радикально. Но в тоже время, вы сможете быть уверены, что ваше приложение будет одинаково работать на всех платформах.
Вторая причина столь скромного функционала — простота добавления новых платформ. Технологии меняются с невероятной скоростью. То тут, то там появляются новые устройства и операционные системы. Именно поэтому, возможность оперативного добавления поддержки новой платформы, дает неоспоримое преимущество перед другими подобными инструментами.
Игровые фреймворки
Конечно, функционала mojo недостаточно для написания полноценной игры. Ведь игра — это не только работа с графикой, звуком и устройствами ввода, но и пользовательский интерфейс, различные состояния, тайлы, анимация, физика и прочее. Всего этого в mojo, к сожалению, нет. Но на помощь приходят игровые фреймворки, и другие модули, созданные сообществом Monkey.
FantomEngine. Создателем фреймворка является автор книги «Monkey Game Development», все примеры в которой сделаны с использованием fantomEngine.
Flixel. Порт популярного flash-фреймворка flixel. Портированием данного фреймворка занимаюсь я, но на данный момент, в виду отсутствия времени, работа над ним приостановлена.
Playniax. Единственный коммерческий фреймворк, но с неплохими отзывами. Автором является разработчик одноименного фреймворка для BlitzMax.
Помимо этих 4-х фреймворков, на официальном сайте можно найти ссылки еще на 4-5 подобных инструмента различной степени завершенности.
3D
Если же вашей целью является создание 3D-игр, то в вашем распоряжении есть модуль opengl (работает не на всех платформах) или фреймворк minib3d. Но в целом, в этом плане, все довольно-таки плохо.
- Zombie Trailer Park — Flash and iOS
- New Star Soccer Mobile — Android, iOS, Flash and HTML5
- Ninjah — Xbox 360, PC, Mac
- Jet Worm — iPhone and iPad
- Blotty Pots — Android, iOS, WP7
Наиболее полный список игр вы можете посмотреть здесь.
Стоимость и модель распространения
Стоимость pro-лицензии Monkey составляет $99. За эту сумму вы получаете: пожизненную поддержку и обновления, доступ к форуму официального сайта, модуль mojo для всех официально поддерживаемых платформ и возможность создания коммерческих игр.
Также, для загрузки доступна демо-версия, в состав которой входит mojo для HTML5. С помощью этой версии вы не сможете создавать коммерческие игры.
На самом деле, говоря о демо и pro-версиях я имею в виду только mojo, так как сам Monkey является общественным достоянием и распространяется совершенно бесплатно. К сожалению, у Monkey отсутствует официальный репозиторий, поэтому вы можете скачать только пользовательские форки.
На данный момент, известны два форка Monkey:
Из этих двух, я порекомендовал бы использовать первый, так как он чаще обновляется и включает большее количество доработок.
Недостатки
Как и любой программный продукт, Monkey имеет свои минусы. Ниже, я постараюсь рассказать о самых важных из них, а также предложить способы их решения.
IDE
Наверное, это самая серьезная проблема — отсутствие нормальной среды разработки. Несмотря на то, что Monkey поставляется с двумя IDE (Monk и Ted), ни одну из них нельзя назвать полноценной. Я бы скорее назвал их чуть продвинутым блокнотом, не более. Писать на них серьезные проекты весьма проблематично.
Для решения этой проблемы можно воспользоваться коммерческой Jungle IDE (есть бесплатная lite-версия) или одним из нескольких плагинов для популярных текстовых редакторов. Тем не менее, проблема с IDE, к сожалению, остается одной из ключевых.
Отсутствие вспомогательных инструментов
Большинство профессиональных инструментов для создания игр поставляются вместе с редакторами уровней, спрайтов, анимации и т. д. В Monkey подобных инструментов вы не увидите. Есть только язык, модули и IDE.
На выручку приходит стороннее ПО, как платное так и бесплатное. Обычно, сделать импорт проектов из подобных инструментов, не составляет больших проблем. К тому же, если поискать по официальному форуму, можно найти уже готовые решения, такие как, импорт текстурных атласов из TexturePacker, импорт тайловых карт из Dame и Tiled и т.д.
Производительность HTML5
HTML5-версия mojo использует 2D-контекст, что отрицательно сказывается на производительности игр. К сожалению, WebGL не поддерживается в IE. И как я уже писал ранее, если какая-то особенность где-то не поддерживается, то она не используется вовсе.
Чтобы исправить эту ситуацию, можно попробовать воспользоваться экспериментальным патчем для mojo — Mojo HTML5 GL, который заменяет 2D-контекст на WebGL, что дает существенный прирост производительности.
Официальный сайт
Еще один привет из прошлого — официальный сайт. Да, он справляется со своей прямой обязанностью — предоставлять пользователям возможность задавать вопросы и получать ответы, но в остальном это очень примитивный форум с ужасным дизайном. Многие из тех, кто заинтересовался Monkey, начинали сомневаться сразу после просмотра главной страницы. А когда переходили к демкам, с ужасом убегали и никогда не возвращались (я не преувеличиваю). Несмотря на то, что проблема не касается непосредственно разработки, я считаю ее одной из самых серьезных второстепенных проблем.
Название
Многие пользователи жалуются на то, что искать информацию о Monkey очень тяжело, так как они постоянно натыкаются на информацию об обезьянах. К тому же, словосочетание monkey coder имеет негативный окрас, из-за схожести с Code Monkey.
Monkey и Haxe
Haxe — универсальный объектно-ориентированный язык программирования высокого уровня, со схожим с Monkey принципом действия. И учитывая, что Haxe появился раньше, можно полагать, что разработчик Monkey черпал свое вдохновение именно от него.
Подобно mojo, у Haxe есть NME — фреймворк повторяющий Flash API. В виду подобного количества совпадений возникает закономерный вопрос: «Чем Monkey и mojo лучше Haxe и NME?». Оговорюсь сразу, я не знаком близко с Haxe и возможно в чем-то ошибаюсь, но тем не менее, постараюсь быть максимально объективным.
Плюсами связки Monkey и mojo, на мой взгляд, являются:
- большее количество официально поддерживаемых платформ
- поддержка таких важных платформ как PS Vita, WP7, Xbox 360, HTML5 (в NME эта платформа в зачаточной стадии)
- стабильная трансляция в C# и Java (в Haxe эти языки находится в статусе beta)
- одинаковое или ожидаемое поведение на всех платформах. В NME разница между платформами выглядит значительнее
- относительная простота добавления поддержки новых платформ
- платность, как гарантия развития
Плюсы связки Haxe и NME:
- более «продвинутый» язык
- большие возможности фреймворка NME
- знакомый многим разработчикам игр Flash API
- FlashDevelop, как основная IDE
- большое сообщество
- беслпатность
Как видите, у каждого инструмента есть свои сильные и слабые стороны. И получить однозначного ответа на вопрос, какой из них лучше, не представляется возможным. Многое зависит от того, что вы ожидаете получить от выбранного вами инструмента.
В завершение
Спасибо, что дочитали данный пост до конца. Я не ожидал, что он получится таким длинным, поэтому извините, если зря потратил ваше время. Тем не менее, я надеюсь, что мне удалось полностью раскрыть тему и рассказать о Monkey максимально объективно.
Для всех, кто заинтересовался Monkey — официальный сайт проекта.
Спасибо за внимание!
На этом все. Пока!
Автор: devolonter