Использование возможностей <поздних> плееров.
Запись от zuxul размещена 02.11.2012 в 13:46
Когда мы начинали разрабатывать игру, мы встали перед выбором - 9 или 10 плеер будем поддерживать.
Десятый плеер только вот-вот вышел, но зная нашу неопытность, выбор пал на 10.
Когда мы заканчивали (или можно сказать прилизывали игру к первому выходу) выходил уже 11 плеер.
Но это так - присказка. А эта запись о том, как использовать "крутые" возможности плеера, там, где их еще нет.
Итак, игру у нас скомпилирована для плеере 10.0. В плеере 10.1 появляется фишка - глобальный перехват не перехваченных исключений. Вставляем ее так:
try { // попробуем перехватывать все ошибки методом 'uncaughtErrorEvents', доступно только в плеере >= 10.1 var UncaughtErrorEvent:Class = getDefinitionByName("flash.events.UncaughtErrorEvent") as Class; loaderInfo['uncaughtErrorEvents'].addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, uncaughtErrorHandler); } catch (e:Error) { // плейер версии < 10.1 } private function uncaughtErrorHandler(event:/*UncaughtErrorEvent*/* ):void { // ... логирование ошибки и возможно, перегрузка игры }
Основная масса игроков, всегда обновляет плеер, но игроков, которые не обновили плеер тоже не хочется терять. Делаем обёртку, которая в рантайме определяет, какой JSON использовать:
package game.utils { import by.blooddy.crypto.serialization.JSON; import com.adobe.serialization.json.JSON; import flash.utils.getDefinitionByName; /** * Этот класс должен выбрать в realtime самый лучший JSON */ public class JSON { private static var encodeFunction:Function; private static var decodeFunction:Function; // статик инициализация { init(); } private static function init():void { try { // если плеер 11 версии (а он почти у всех 11), возьмем этот класс через getDefinition // т.к. игра скомпилирована для 10 версии var JSON_class:Class = getDefinitionByName("JSON") as Class; encodeFunction = JSON_class["stringify"]; decodeFunction = JSON_class["parse"]; } catch (error:*) { // быстый json от blooddy, быстрее adobe-вского раз в 3-4 decodeFunction = by.blooddy.crypto.serialization.JSON.decode; // json от blooddy так <"оптимизирован">, что не кодирует null-ы в конце массивов и ломает нам игру // из-за этого используем json от adobe encodeFunction = com.adobe.serialization.json.JSON.encode; } } public static function encode(obj:*):String { return encodeFunction(obj); } public static function decode(jsonString:String):Object { return decodeFunction(jsonString); } } }
Всего комментариев 8
Комментарии
02.11.2012 16:48 | |
02.11.2012 16:52 | |
Или Capabilities.version?
|
02.11.2012 18:05 | |
Расскажите про игру, долго ведь делали, видимо большой проект.
|
02.11.2012 22:54 | |
Действительно, а почему сразу версию фп не посмотреть-то? Я этого не понимаю совсем.
|
03.11.2012 02:49 | |
Цитата:
Верю...
просто при первом же обращении к классу будет вызван этот метод. Но я бы поставил проверку на ужеИнициализирован |
03.11.2012 22:41 | |
cinit ведь вызывается только один раз? Или думаете он может вызваться еще когда-нибудь?
|
04.11.2012 19:56 | |
сейчас работает так, но может быть потом будет по-другому.
это недокументировано и поэтому опасно |
Последние записи от zuxul
- Использование возможностей <поздних> плееров. (02.11.2012)