- PVSM.RU - https://www.pvsm.ru -
Всем привет!
В этой статье я хотел бы рассказать о 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 поставляется со следующими модулями:
В дополнение к этому списку, сообществом разработчиков было написано более 20-ти дополнительных модулей, включая порты различных физических движков (Box2D, Chipmunk и Fling), GUI-системы, модули для работы со шрифтами, модули для реализации IAP (in-app purchase), модули для работы с XML, JSON и различными сервисами. Список большинства доступных, на данный момент, модулей можно посмотреть здесь [2].
Вот мы и подошли к самому главному. В начале статьи я сказал, что Monkey, в основном, используется для создания 2D-игр. Но, как видите, сам язык под это дело не заточен.
Для разработки игр используется модуль mojo, который поставляется вместе с Monkey. Этот модуль предоставляет разработчику кроссплатформенный API для работы с 2D-графикой, звуком и устройствами ввода. Возможности фреймворка несколько ограничены и связано это, в первую очередь, с необходимостью поддержки множества платформ. Не все возможности доступные на одной платформе доступны на другой. Если какая-то «фишка» недоступна хотя бы на одной из платформ, то она не будет включена в mojo. Конечно, это несколько радикально. Но в тоже время, вы сможете быть уверены, что ваше приложение будет одинаково работать на всех платформах.
Вторая причина столь скромного функционала — простота добавления новых платформ. Технологии меняются с невероятной скоростью. То тут, то там появляются новые устройства и операционные системы. Именно поэтому, возможность оперативного добавления поддержки новой платформы, дает неоспоримое преимущество перед другими подобными инструментами.
Конечно, функционала mojo недостаточно для написания полноценной игры. Ведь игра — это не только работа с графикой, звуком и устройствами ввода, но и пользовательский интерфейс, различные состояния, тайлы, анимация, физика и прочее. Всего этого в mojo, к сожалению, нет. Но на помощь приходят игровые фреймворки, и другие модули, созданные сообществом Monkey.
FantomEngine [4]. Создателем фреймворка является автор книги «Monkey Game Development», все примеры в которой сделаны с использованием fantomEngine.
Flixel [5]. Порт популярного flash-фреймворка flixel. Портированием данного фреймворка занимаюсь я, но на данный момент, в виду отсутствия времени, работа над ним приостановлена.
Playniax [6]. Единственный коммерческий фреймворк, но с неплохими отзывами. Автором является разработчик одноименного фреймворка для BlitzMax.
Помимо этих 4-х фреймворков, на официальном сайте можно найти ссылки еще на 4-5 подобных инструмента различной степени завершенности.
Если же вашей целью является создание 3D-игр, то в вашем распоряжении есть модуль opengl (работает не на всех платформах) или фреймворк minib3d [7]. Но в целом, в этом плане, все довольно-таки плохо.
Наиболее полный список игр вы можете посмотреть здесь [13].
Стоимость pro-лицензии Monkey составляет $99. За эту сумму вы получаете: пожизненную поддержку и обновления, доступ к форуму официального сайта, модуль mojo для всех официально поддерживаемых платформ и возможность создания коммерческих игр.
Также, для загрузки доступна демо-версия, в состав которой входит mojo для HTML5. С помощью этой версии вы не сможете создавать коммерческие игры.
На самом деле, говоря о демо и pro-версиях я имею в виду только mojo, так как сам Monkey является общественным достоянием и распространяется совершенно бесплатно. К сожалению, у Monkey отсутствует официальный репозиторий, поэтому вы можете скачать только пользовательские форки.
На данный момент, известны два форка Monkey:
Из этих двух, я порекомендовал бы использовать первый, так как он чаще обновляется и включает большее количество доработок.
Как и любой программный продукт, Monkey имеет свои минусы. Ниже, я постараюсь рассказать о самых важных из них, а также предложить способы их решения.
Наверное, это самая серьезная проблема — отсутствие нормальной среды разработки. Несмотря на то, что Monkey поставляется с двумя IDE (Monk и Ted), ни одну из них нельзя назвать полноценной. Я бы скорее назвал их чуть продвинутым блокнотом, не более. Писать на них серьезные проекты весьма проблематично.
Для решения этой проблемы можно воспользоваться коммерческой Jungle IDE [16] (есть бесплатная lite-версия) или одним из нескольких [17] плагинов для популярных текстовых редакторов. Тем не менее, проблема с IDE, к сожалению, остается одной из ключевых.
Большинство профессиональных инструментов для создания игр поставляются вместе с редакторами уровней, спрайтов, анимации и т. д. В Monkey подобных инструментов вы не увидите. Есть только язык, модули и IDE.
На выручку приходит стороннее ПО, как платное так и бесплатное. Обычно, сделать импорт проектов из подобных инструментов, не составляет больших проблем. К тому же, если поискать по официальному форуму, можно найти уже готовые решения, такие как, импорт текстурных атласов из TexturePacker, импорт тайловых карт из Dame и Tiled и т.д.
HTML5-версия mojo использует 2D-контекст, что отрицательно сказывается на производительности игр. К сожалению, WebGL не поддерживается в IE. И как я уже писал ранее, если какая-то особенность где-то не поддерживается, то она не используется вовсе.
Чтобы исправить эту ситуацию, можно попробовать воспользоваться экспериментальным патчем для mojo — Mojo HTML5 GL [18], который заменяет 2D-контекст на WebGL, что дает существенный прирост производительности.
Еще один привет из прошлого — официальный сайт. Да, он справляется со своей прямой обязанностью — предоставлять пользователям возможность задавать вопросы и получать ответы, но в остальном это очень примитивный форум с ужасным дизайном. Многие из тех, кто заинтересовался Monkey, начинали сомневаться сразу после просмотра главной страницы. А когда переходили к демкам, с ужасом убегали и никогда не возвращались (я не преувеличиваю). Несмотря на то, что проблема не касается непосредственно разработки, я считаю ее одной из самых серьезных второстепенных проблем.
Многие пользователи жалуются на то, что искать информацию о Monkey очень тяжело, так как они постоянно натыкаются на информацию об обезьянах. К тому же, словосочетание monkey coder имеет негативный окрас, из-за схожести с Code Monkey [19].
Haxe — универсальный объектно-ориентированный язык программирования высокого уровня, со схожим с Monkey принципом действия. И учитывая, что Haxe появился раньше, можно полагать, что разработчик Monkey черпал свое вдохновение именно от него.
Подобно mojo, у Haxe есть NME — фреймворк повторяющий Flash API. В виду подобного количества совпадений возникает закономерный вопрос: «Чем Monkey и mojo лучше Haxe и NME?». Оговорюсь сразу, я не знаком близко с Haxe и возможно в чем-то ошибаюсь, но тем не менее, постараюсь быть максимально объективным.
Плюсами связки Monkey и mojo, на мой взгляд, являются:
Плюсы связки Haxe и NME:
Как видите, у каждого инструмента есть свои сильные и слабые стороны. И получить однозначного ответа на вопрос, какой из них лучше, не представляется возможным. Многое зависит от того, что вы ожидаете получить от выбранного вами инструмента.
Спасибо, что дочитали данный пост до конца. Я не ожидал, что он получится таким длинным, поэтому извините, если зря потратил ваше время. Тем не менее, я надеюсь, что мне удалось полностью раскрыть тему и рассказать о Monkey максимально объективно.
Для всех, кто заинтересовался Monkey — официальный сайт проекта [1].
Спасибо за внимание!
На этом все. Пока!
Автор: devolonter
Источник [21]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/game-development/20511
Ссылки в тексте:
[1] Image: http://monkeycoder.co.nz/
[2] здесь: http://monkeycoder.co.nz/Community/modules.php
[3] Diddy: http://code.google.com/p/diddy/
[4] FantomEngine: http://code.google.com/p/fantomengine/
[5] Flixel: http://devolonter.github.com/flixel-monkey/
[6] Playniax: http://www.playniax.com/
[7] minib3d: https://github.com/adamredwoods/minib3d-monkey
[8] Zombie Trailer Park: http://ninjakiwi.com/Games/Strategy/Zombie-Trailer-Park.html
[9] New Star Soccer Mobile: http://www.newstarsoccer.com/nssmobile.php
[10] Ninjah: http://chrismingay.co.uk/colourfy/ninjah/
[11] Jet Worm: http://www.avaloid.com/jet-worm/iphone
[12] Blotty Pots: http://www.blottypots.com/
[13] здесь: http://monkeycoder.co.nz/Community/posts.php?topic=3783
[14] The Monkey Language with Extras: http://code.google.com/p/monkey-ext/
[15] Monkey by Michael Contento: https://github.com/michaelcontento/monkey
[16] Jungle IDE: http://www.jungleide.com/
[17] нескольких: http://www.gingerbeardman.com/monkey/
[18] Mojo HTML5 GL: https://github.com/devolonter/mojo-html5-gl
[19] Code Monkey: http://lurkmore.to/%D0%91%D1%8B%D0%B4%D0%BB%D0%BE%D0%BA%D0%BE%D0%B4%D0%B5%D1%80
[20] значительнее: http://www.haxenme.org/documentation/features/
[21] Источник: http://habrahabr.ru/post/159377/
Нажмите здесь для печати.