Haxe — “Unity” среди языков программирования

Насчитываются1 сотни языков программирования, если не тысячи. И чуть ли не каждый день этот список пополняется. Не более пары десятков из них у всех на слуху. Часть языков на пике популярности, часть снискали мимолетную славу, но все еще держатся на плаву, часть устарела и уже мало пригодна к использованию. Некоторые же так прочно закрепились в топе, что в ближайшие лет 30 покидать его явно не собираются. Существуют интересные языки, которые разрабатываются и поддерживаются небольшими группами энтузиастов. Такие разработки очень часто находятся в тени разрекламированных технологий больших компаний. Это происходит не потому, что разработка бесполезна, некачественна или не имеет права на жизнь, а, скорее, из-за того, что весь процесс ее развития чаще всего держится практически на голом энтузиазме разработчиков и, изредка, на небольших донатах. Стеснение в средствах или их полное отсутствие является основной причиной, не позволяющей технологии вырваться из тени. А если какие-то средства и появляются, то, чаще всего, они идут на улучшение технологии, а не на ее популяризацию (порой объем и качество работы просто поражают!). Поэтому ярый маркетинг отсутствует, и чуть ли не единственным средством распростространения информации о разработке являются статьи в блогах, заметки в соц. сетях и т.п. Вследствие этого мы имеем не такой бурный рост сообщества, какой мог бы быть. Примерно такой же путь прошли многие ныне (или ранее) популярные технологии. Нужно лишь слегка помочь им в продвижении.
Популяризации одного из таких языков и посвящена эта статья.

Читать →

Неожиданное исключение на ровном месте

Намедни столкнулся с неожиданным (по крайней мере для меня) исключением на банальном куске кода в Unity. Если убрать все лишнее, то получится примерно вот такой скрипт:

Вышепреведенный код отрабатывал без ошибок, если на игровом объекте висел компонент CanvasGroup . А если этого компонента нет, то код генерирует исключение:

MissingComponentException: There is no ‘CanvasGroup’ attached to the «Button» game object, but a script is trying to access it.
You probably need to add a CanvasGroup to the game object «Button». Or your script needs to check if the component is attached before using it.
TestScript.Start () (at Assets/TestScript.cs:10)

По задумке, само собой, не ожидалось никакого исключения. Какое-то время потребовалось, чтобы понять, почему генерируется это исключение. Я, конечно, был в курсе, что Unity переопределяет оператор сравнения и что использовать операторы ?.  и  ??  с Unity.Object  и его наследников не следует. Но почему-то мне казалось, что переопределенный оператор на что-то влияет, только если мы имее дело с уничтоженным объектом. В моем же коде, по идее, этого не должно было быть. И потому это исключение оказалось неожиданным. Логично было бы предположить, что вместо  MissingComponentException будет генерироваться исключение  NullPointerException . Но, как вы уже поняли, этого не происходит. Согласно документации, метод  GetComponent :

Returns the component of Type type if the game object has one attached, null if it doesn’t.

Этот метод должен вернуть ссылку на компонент или  null , если компонент не найден. А далее приводится пример:

который «подтверждает» ранее описанное поведение. Но если бы это была бы правда, то мой код бы не генерировал исключение. А он генерирует. Дело в том, что метод  GetComponent возвращает ссылку на управляемый компонент, даже если компонент не найден. Иными словами, если запрашиваемый компонент не найден, то все равно возвращается ссылка на управляемый компонент, который не ссылается на настоящий C++ компонент и переопределенный оператор сравнения с  null  не срабатывает.  Создается ощущение, что вернулся  null . Это легко подтвердить, например, таким кодом:

В результате выполнения этого кода мы увидим:

UnityEngine.CanvasGroup
UnityEngine.Debug:Log(Object)
TestScript:Start() (at Assets/TestScript.cs:9)

Также стоит отметить, что, если сбилдить приложение, то тестовый код выполнится без ошибок, а ненайденный компонент будет добавлен. Происходит это потому, что в run-time  GetComponent будет возвращаться настоящий  null , и все выполнится, как и задумывалось. Т.е. подмена возвращаемого значения работает только в редакторе Unity. Само собой, не стоит использовать операторы  ?.  и  ??  с  Unity.Object  и его наследниками в реальном коде.

Статистика Android устройств, август 2017

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

Android приложение
Жанр: игра, три в ряд.
Установок: > 100K.
DAU: > 25K.
Аудитория: в основном женская.

ОС

Android 5 — 36,5%
Android 4 — 28,9%
Android 6 — 28,2%
Android 7 — 6,4%

Читать →

Пробуем TypeScript на сервере

Доброго времени суток.

В этой статье мы познакомимся с языком программирования TypeScript на примере создания небольшого серверного приложения (простая авторизация), используя такие популярные технологии как Node.js и Express.js. Также вкратце коснёмся рассмотрения довольно интересной embeddeb NoSQL базы данных NeDB.

Статья ориентирована прежде всего на людей уже знакомых с Node и Express и не рассматривает самые базовые вещи, относящиеся к этим технологиям. Я не буду подробно описывать и все особенности TypeScript, а код далеко не является эталонным — это всего лишь пример. Однако, если у вас есть желание попробовать TypeScript, но вы не знаете как к нему подобраться, особенно со стороны backend’a,  тогда, возможно, вы найдёте что-то полезное в этой статье. Ссылка на GitHub репозиторий в конце статьи.

TypeScript

TypeScript (далее по тексту TS) — это язык программирования, являющийся надмножеством JavaScript. Начал разрабатываться компанией Microsoft и был впервые представлен в 2012 году. Автор языка — Андреас Хейлсберг, который до TS приложил руку к разработке таких языков как C# и Delphi. В самом Microsoft заявляют о TS  следующим образом: «Язык программирования TypeScript является средством разработки веб-приложений, расширяющим возможности JavaScript».

Технология сама по себе довольно интересная и выгодно отличается от того же JavaScript. Главное, что выделяет TS — это строгая типизация, а также более привычная многим (java-like) реализация ООП. В TS вы можете использовать всё, что есть на данный момент в JavaScript, плюс объявления типов, модификаторы доступа, классы, интерфейсы и ещё много всего. Получается такой JavaScript с человеческим лицом. При этом компилируется TS в тот-же JavaScript. На выбор любой из стандартов: ES3, ES5 или ES6. Как и большинство новых технологий TS является open source проектом, доступным в репозитории на GitHub: https://github.com/Microsoft/TypeScript Ещё одним аргументом в пользу данного языка является тот факт, что на нём написан один из самых популярных frontend фреймворков — Angular2. И его можно использовать с другими библиотеками и фреймворками, например с тем-же React. Ну а мы попробуем разобраться насколько TS применим на сервере. И так, приступим.
Читать →

Поддержка Multidex для Android в Adobe AIR

Пару слов о поддержке Multidex для Android в AIR, которую Adobe ввела в 25-й версии. С помощью мультидекса можно упаковывать приложения, которые превышают лимит в 64K методов. Это может произойти, если вы пишете своё или используете стороннее ANE, содержащее большое количество библиотек и, соответственно, большое количество методов. В таком случае при сборке вы получите ошибку:

Too many method references max is 65536

AIR 25 наконец-то позволяет включить multidex, чтобы преодолеть эту проблему.

При разработке собственного ANE выставьте флаг поддержки multidex в gradle скрипте проекта

Далее, при упаковке ANE исключите библиотеку com.android.support:multidex. Её можно прописать в зависимостях проекта для компиляции Android библиотеки, но обязательно надо игнорировать при упаковке самого расширения, потому что иначе, при попытке сборки приложения, будет выводиться ошибка:

UNEXPECTED TOP-LEVEL EXCEPTION: java.lang.IllegalArgumentException: already added: Landroid/support/multidex/BuildConfig;

Видимо потому, что библиотека добавляется AIR’ом и повторное включение её в ANE создаёт конфликт.

Для приложения не забудьте прописать поддержку multidex в секции Android манифеста файла-дескриптора (android > manifestAdditions > manifest):

Обратите внимание, что если ANE содержит pre-dex библиотеки, то при попытке упаковки приложения будет выдаваться ошибка.

Unity для новичков. Простая камера от третьего лица. Часть 1

Доброго времени суток!
Сегодня мы рассмотрим пример создания простой игровой камеры от третьего лица в Unity.

Читать →

GDG DevFest Voronezh 2016 — ключевые тренды

3 декабря 2016 года в Воронеже проходила 5-я ежегодная конференция Google developer group, на которой нам впервые удалось побывать. Сразу скажу, что конференция прошла отлично и мы остались очень довольны :)  Поэтому хотелось бы поделиться своими впечатлениями и подробнее рассказать о самой конференции, а также о докладах, которые были на ней представлены.

img_20161203_140430

Эта конференция, в отличие от многих остальных, является абсолютно бесплатной. Для участия достаточно было просто зарегистрироваться на сайте компании-организатора. В Воронеже организаторами были ребята из DataArt. 
Читать →

Поездка на GDG DevFest Voronezh 2016

3 декабря удалось побывать на GDG DevFest Voronezh 2016. GDG DevFest это ежегодная конференция, проводимая сообществами Google Developers Group (GDG) при поддержке компании Google в разных городах мира. В Воронеже она проводится пятый раз.

Я интересуюсь проектами компании Google и операционной системой Android в первую очередь, поэтому данное событие я не мог пропустить, тем более оно проходило не так далеко от моего места проживания.

maxresdefault_live

GDG проходил в актовом зале ВГУ. Сразу на входе нас встречали волонтеры, проводившие нас на регистрацию. Регистрация прошла моментально, а до начала открытия оставалось чуть менее часа. Благодаря тестовым заданиям от компании DataArt удалось скоротать время и получить наклейку с андроидом, которая теперь украшает мой ноутбук.

В первом выступлении Денис Неклюдов (Google Developer Expert и ведущий подкастов androiddev) и Звиад Кардава (также Google Developer Expert) рассказывали о Project Tango. Project Tango — это платформа, которая использует компьютерное зрение, чтобы научить мобильные устройства воспринимать окружающее пространство и движение.
Читать →

Cocos2d JS на примере браузерной игры

Cocos 2d – кросс-платформенный фреймворк с открытым кодом, для разработки игр и приложений, как браузерных, так и для мобильных платформ.  Приложения могут быть запущены на платформах: iOS, Android, Windows Phone, OS X, Windows, Linux.

Главные возможности:

  • OpenGL.
  • Управление сценами.
  • Эффекты смены сцен.
  • Спрайты.
  • Визуальные эффекты, большое количество качественных 3D эффектов.
  • Экшены (движение, масштабирование, повороты).
  • Компоненты, позволяющие конструировать UI (меню, кнопки, ползунки, списки, текстовые поля и т. д.).
  • Поддержка касаний и акселерометра на мобильных устройствах.
  • Поддержка звука, звуковой движок на основе OpenAl.
  • Поддержка физических движков Box2D и Chipmunk.
  • Тестирование и отладка без необходимости установки на мобильное устройство.

Одна из ветвей фреймворка – Cocos2d JS, позволяет писать игры в JavaScript. Рассмотрим логику и возможности фреймворка на примере создания браузерной игры.

Популярный жанр браузерных игр – головоломки. Целью нашей игры будет расставить в правильном порядке шестеренки, чтобы механизм заработал.
Читать →