Monkey X

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 02:34, 22 мая 2016.
Monkey X
MonkeyLanguageLogo.png
Парадигма мультипарадигмальный: структурный, императивный, объектно-ориентированный, модульный, рефлексивный, обобщённый, параллельный
Спроектировано Mark Sibly
Разработчики Blitz Research Ltd
Первый   появившийся 2011-03-01
Стабильная версия 0.86(E) / 02.02.2016
Печать дисциплины статическая, слабая, сильная (опционально), номинативная, с частичным выводом типов
Платформа Кроссплатформенное ПО
OS Microsoft Windows, Mac OS X, Linux
Лицензия zlib / Проприетарный
Портал: www.monkey-x.com
Под влиянием
BlitzBasic, BlitzMax, C, C++, C#, JavaScript, Java

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

История

Автором языка является новозеландский разработчик Марк Сибли — основатель Blitz Research Ltd. Этот человек известен некоторым разработчикам по таким инструментам для создания игр, как BlitzBasic, Blitz3D и BlitzMax. Monkey является эволюцией линейки всех предшествующих продуктов компании Blitz Research Ltd. Кроссплатформенность достигается за счет транслирования. Все что умеет транслятор Monkey — это проверять и транслировать код, собирать валидный для платформы проект, и запускать нативные средства для сборки приложений. В связи с этим, для сборки итогового приложения необходимо установить SDK для всех требуемых платформ. Таким образом, удается избежать использования различных лаунчеров и плагинов для запуска итоговых приложений. Все выглядит так, как если бы приложение писали самостоятельно. Конечно, транслированный код получается малочитаемым и не всегда оптимальным, но вместе с этим дает все преимущества нативной разработки.

Целевые платформы

  • Windows
  • Mac OS X
  • Android
  • iOS
  • HTML5
  • Flash
  • XNA
  • PlayStation Vita

Транслятор

Транслятор, как бы странно это не звучало, написан на 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.

  • Diddy. Один из самых популярных фреймворков для Monkey. Помимо, непосредственно, фреймворка, предоставляет большое количество дополнительного функционала.
  • FantomEngine. Создателем фреймворка является автор книги «Monkey Game Development», все примеры в которой сделаны с использованием fantomEngine.
  • Flixel. Порт популярного flash-фреймворка flixel.
  • Playniax. Единственный коммерческий фреймворк, но с неплохими отзывами. Автором является разработчик одноименного фреймворка для BlitzMax.

3D

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

Недостатки

Как и любой программный продукт, 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

  • Zombie Trailer Park — Flash and iOS
  • Pirate Solitaire — iOS, Android and Flash
  • Jet Worm — iPhone and iPad
  • Blotty Pots — Android, iOS, WP7
  • New Star Soccer Mobile — Android, iOS, Flash and HTML5

Пример кода

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

Ссылки