Язык программирования Monkey

от автора

Всем привет!

В этой статье я хотел бы рассказать о Monkey — языке программирования, направленного, в первую очередь, на создание кроссплатформенных 2D-игр. Этот инструмент, на мой взгляд, несколько незаслуженно обделен вниманием разработчиков и я хотел бы это исправить.

Monkey ни в коем случае не является «убийцей» Unity и других подобных инструментов. Но он может заинтересовать начинающих, а также независимых разработчиков игр, чей бюджет в значительной степени ограничен. Если мне удалось вас заинтересовать, добро пожаловать под кат.

Язык

Monkey — объектно-ориентированный, транслируемый язык программирования, кроссплатформенность которого достигается за счет транслирования кода Monkey в нативный для платформы язык.

Официально, код Monkey может быть транслирован в следующие языки программирования: С++, C#, Java, JavaScript и ActionScript. Тем не менее, этот список может быть расширен, путем написания собственных трансляторов. Так, сообществом Monkey, были успешно разработаны трансляторы для Python и BlitzMax.

Monkey относится к семье языков с BASIC-подобным синтаксисом. Но в нем также отчетливо прослеживается влияние Java. Язык имеет статическую типизацию, обеспечивает модульность, поддерживает абстракцию, инкапсуляцию, наследование и полиморфизм, а также интерфейсы, обобщённые типы, свойства, итераторы и исключения.

Пример кода, написанного на Monkey

' включение строгого режима 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.

Список популярных игровых фреймворков для Monkey

Diddy. Один из самых популярных фреймворков для Monkey. Помимо, непосредственно, фреймворка, предоставляет большое количество дополнительного функционала.

FantomEngine. Создателем фреймворка является автор книги «Monkey Game Development», все примеры в которой сделаны с использованием fantomEngine.

Flixel. Порт популярного flash-фреймворка flixel. Портированием данного фреймворка занимаюсь я, но на данный момент, в виду отсутствия времени, работа над ним приостановлена.

Playniax. Единственный коммерческий фреймворк, но с неплохими отзывами. Автором является разработчик одноименного фреймворка для BlitzMax.

Помимо этих 4-х фреймворков, на официальном сайте можно найти ссылки еще на 4-5 подобных инструмента различной степени завершенности.

3D

Если же вашей целью является создание 3D-игр, то в вашем распоряжении есть модуль opengl (работает не на всех платформах) или фреймворк minib3d. Но в целом, в этом плане, все довольно-таки плохо.

Список популярных игр, сделанных на Monkey

Наиболее полный список игр вы можете посмотреть здесь.

Стоимость и модель распространения

Стоимость 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 — официальный сайт проекта.

Спасибо за внимание!
На этом все. Пока!

ссылка на оригинал статьи http://habrahabr.ru/post/159377/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *