Примечание переводчика: неделю назад Zynga открыла исходники проекта, упрощающего перенос игр с Flash на мобильные платформы. Так как на хабре много людей, которые пишут игры на флеше, либо под мобильные платформы, представляю вам перевод текста со страницы данного проекта. Вполне вероятно, что вы захотите использовать его в своих разработках.
Что такое PlayScript?
PlayScript это проект с открытым исходным кодом, представляющий из себя ActionScript-совместимый компилятор и Flash-совместимую среду выполнения, которая работает на Mono .NET и предназначена для создания мобильных приложений с помощью MonoTouch и Mono for Android. Сочетание Adobe FlashBuilder для создания веб-приложений и Xamarin Studio для мобильных позволит разрабатывать мультиплатформенные приложения с использованием всех преимуществ данных IDE, а также с возможностью доступа к нативным API на мобильных платформах.
Компилятор PlayScript может также транслировать свой код в C++ и JavaScript (по аналогии с Haxe), что позволяет создавать веб-приложения, не требующие Flash, а также нативные приложения для PC и мобильных (с некоторыми ограничениями). Примечание: в настоящее время JS и C++ находятся в экспериментальной стадии.
В дополнение к поддержке языка ActionScript, компилятор PlayScript также поддерживает новый язык — PlayScript — который представляет собой смесь C# и ActionScript. Этот новый язык поддерживает все особенности C#, в том числе:
• Дженерики
• Свойства
• События
• Типы значений
• Перегрузку операторов
• Асинхронное программирование
• LINQ
Несмотря на это, язык является обратно-совместимым с ActionScript. PlayScript можно использовать для создания веб и мобильных приложений (через JavaScript и Mono). Существующие Flash приложения могут быть легко преобразованы в PlayScript путём простого переименования файлов из .as в .play и исправления некоторых проблем, связанных с более строгими синтаксисом и семантикой нового языка.
Кроме того, среда выполнения PlayScript обеспечивает полную поддержку Stage3D, что позволяет портировать игры на телефоны с очень незначительными изменениями. Часть библиотеки display была также реализована для поддержки таких сторонних Stage3D фреймворков, как Starling, Away3D и Feathers.
PlayScript предоставляет полный набор инструментов для создания и запуска ActionScript игр на мобильных телефонах с помощью Mono и в веб с помощью Adobe Flash или JavaScript/HTML5.
Как реализован PlayScript?
Компилятор PlayScript реализован как дополнительный препроцессор к компилятору Mono MCS. Установка PlayScript версии Mono позволит компилировать все три языка (C #, ActionScript и PlayScript) путём простого добавления файлов с расширениями .cs, .as и .play в командной строке MCS.
Точно так же в Xamarin Studio IDE на странице выбора версии фреймворка вы можете выбрать «PlayScript Mono», что позволит вам добавлять .as и .play файлы в любой C# проект и компилировать их с использованием MonoTouch или Mono for Android. ActionScript код может напрямую вызывать C# код, и наоборот.
Как реализован Stage3D?
PlayScript включает в себя две библиотеки: PlayScript.Dynamic_aot.dll, и pscorlib.dll, которые реализуют среду выполнения и Stage3D через OpenGL. Ссылки на эти библиотеки в вашем проекте позволят запускать существующий код с использованием Stage3D без изменений.
Текущий статус
Компилятор PlayScript и ActionScript достаточно стабильный на данный момент (учитывая, что он построен на основе зрелого Mono), но есть еще некоторый функционал ActionScript, который не был реализован. Ведутся работы по устранению этих остающихся вопросов и предоставлению полной совместимости с ActionScript.
Поддержка ActionScript
• Динамические классы компилируются, но пока не реализованы.
• Тэг [Embed] пока не реализован.
• Паттерн Singleton с использованием класса guard не поддерживается (использование private параметра в public конструкторе)
• Статические и не статические члены с одинаковым именем не поддерживается.
• Инструкции на уровне классов и пакетов не поддерживаются.
• Разнообразные мелкие ошибки.
Поддержка PlayScript
• Небезопасный код не поддерживается (конфликт с использованием символа * в ActionScript).
• Некоторые проблемы с многомерными массивами.
• Трансляция в JavaScript и C++ является экспериментальной.
Поддержка среды выполнения
• Большая работа была проделана по поддержке Stage3D и реализации AGAL через HLSL.
• Фреймворки Starling и Away3D вполне функциональны.
• Было проделано очень мало работы над библиотекой net и другими библиотеками ядра.
Как установить PlayScript?
Вы можете скачать текущие бинарные файлы здесь:
Windows: (Coming)
Пакет включает в себя Mono SDK, инструментарий и библиотеки. Для использования фреймворка, установите Xamarin Studio, и следуйте инструкциям (см. ниже), чтобы сделать PlayScript mono framework фреймворком по умолчанию.
Сборка из исходников
Так как PlayScript это часть Mono и MCS, для сборки можно пользоваться соответствующими инструкциями от Xamarin.
Mac:
www.mono-project.com/Compiling_Mono_on_OSX
Windows:
www.mono-project.com/Compiling_Mono_on_Windows
Кроме того, базовые библиотеки pscorlib.dll и PlayScript.Dynamic.dll (исключая Stage3D) будет собраны и добавлены в GAC в итоговом установщике Mono. Для использования " monotouch ", «monomac» или «monoandroid» версий этих библиотек, используйте .csproj файлы в папке «mcs/class» в репозитории.
Как использовать PlayScript в Xamarin Studio?
• Сделайте сборку Mono согласно инструкции. Используйте --prefix=/Users/myname/playscript-mono-inst для установки фреймворка в удобное место на вашем жестком диске.
• Откройте Xamarin Studio, и выберите пункт “Preferences”.
• Выберите вкладкe “.NET runtimes”.
• Нажмите на кнопку «Add» и выберите папку, где лежит PlayScript mono framework.
• Нажмите кнопку «Set as Default».
• Перезапустите Xamarin Studio.
Теперь вы должны получить возможность добавлять .as и .play файлы к вашему проекту и компилировать их.
Особенности:
Производительность
• Использование «небезопасного» кода.
• Прямое взаимодействие с машинным кодом (cocos2d-X, Page44 и т.д.).
• Оптимизированный компилятор для генерации JavaScript.
• Возможность трансляции в C++ с минимальным размером приложения и с минимальными накладными расходами на запуск.
Расширенные средства поддержки
• Полная поддержка инструментов, включая подсветку синтаксиса и Intellisense в MonoDevelop IDE.
• Отладка исходного кода на всех платформах (FlashBuilder для Flash).
• Быстрая компиляция в Release.
Полная поддержка API
• Полная поддержка API iOS и Android через MonoTouch и Mono for Android.
• Полная поддержка Windows / MacOSX API.
• Полная интеграция с UI Builder (iOS) и Android GUI Builder через Xamarin Studio.
Различия между PlayScript и ActionScript
• PlayScript поддерживает большинство функций C # 5.
• PlayScript требует точки с запятой после окончания инструкций.
• PlayScript использует блок видимости для переменных.
• PlayScript требует использование break в операторе switch.
• PlayScript поддерживает дженерики, используя синтаксис AS3 (.<> ) с использованием функционала C#.
• PlayScript поддерживает свойства, используя ключевое слово «property».
• PlayScript поддерживает индексаторы и перегрузку операторов с помощью ключевых слов «indexer» и «operator».
• PlayScript реализует пространства имён в AS3 путем преобразования их в пространства имён .NET.
Различия между PlayScript и C#
• PlayScript требует использовать ключевое слово «overload » к перегружаемым методам.
• PlayScript не поддерживает оператор using.
• PlayScript браузер не поддерживает операторы checked и unchecked.
• PlayScript не поддерживает небезопасный код (хотя поддержка будет добавлена в будущем).
• В PlayScript вы не можете напрямую обращаться к свойствам базового объекта Object (ToString (), GetType (), GetHashCode ()) до тех пор пока не приведёте его к типу System.Object. Однако использование данного подхода, сделает невозможным транслировать ваш код в C++ или JavaScript.
Лицензия
Этот проект Zynga выпущен под лицензией Apache.
Пример кода на PlayScript
// Basic types
var b:byte;
var sb:sbyte;
var s:short;
var us:ushort;
var i:int;
var u:uint;
var l:long;
var ul:ulong;
var f:float;
var d:double;
// Conditional compilation
#if DEBUG
#else
#endif
// Fixed arrays
var a:int[] = new int[100];
// Properties
public property MyProperty:int {
get { return _myInt; }
set { _myInt = value; }
}
// Events
public event MyEvent;
// Delegates
public delegate MyDelegate(i:int):void;
// Operators
public static operator - (i:int, j:int):int {
}
// Indexers
public indexer this (index:int) {
get { return _a[index]; }
set { _a[index] = value; }
}
// Generics
public class Foo.<T> {
public var _f:T;
public function foo<T>(v:T):void {
}
}
// Async
async function AccessTheWebAsync():Task.<int>
{
var client:HttpClient= new HttpClient();
var getStringTask:Task.<String> = client.GetStringAsync("http://msdn.microsoft.com");
var urlContents:String = await getStringTask;
return urlContents.Length;
}
Автор: bmforce