Archive for the 'tothink' Category

Карта метро

Проект, над которым работает 1.12783 человека, плавно перешел в GIT и диаграмма его веток начинает напоминать карту нью-йоркского метро. Прикольненько так смотреть, как в ММО какие-то скилы качаешь, ей богу.

Подробнее о GIT будет где-то в подкасте.

Как нужно писать книги.

Отличную книжку вчера пролистал.

Flex 4 Cookbook
Год выпуска: 2010
Автор: Joshua Noble, Todd Anderson, Garth Braithwaite
Издательство: O’Reilly
ISBN: 0596805616

Так нужно писать книги. А этой ссылки тут нет.

Чертов баг в Flash Player 10.1.

Вот XML.

<data xmlns:Bla="bla"><Bla:bla></bla:bla></data>

Очевидно, что он неправильный. И 10.0 это говорит прямо, тогда как 10.1 пофиг. Вчера это вылезло в неплохую головную боль на полдня.

Как в Adobe написать про баг?

А вы в курсе, что есть такой “down to” (–>) оператор в AS3?

Да, именно –>. Называется “down to operator” и используется в циклах вот так:

var a:uint = 20;
while ( a --> 0 ) trace(a);

Правда круто? Вы знали об этом?

А есть кто?

… читает этот блог, но не читает va.lent.in/blog/ ?

Пытаемся достучаться до stage?

Недавно в ruFlash кто-то спросил что делать с SWFами, которые считают себя круче всех и думают, что уж для них-то stage должен быть доступен всегда. Ну вы поняли, такие товарищи сыпятся с Null Access ошибкой.

TypeError: Error #1009: Cannot access a property or method of a null object reference.

- “Это отличное дело для твоего супер скила в Scala, который ты поднял пытаясь разобрать код Joa Ebert“, – сказал Кэп.

Спасибо отличной библиотеке apparat и супер языку Scala, мне удалось закодить небольшую программку, которая берет код из конструктора, переписывает его в приватный метод, который подписывает на событие ADDED_TO_STAGE.

usage: java -jar initInjector.jar [-c] <from.swf> [to.swf]“)
-c — check for references to stage in constructor
If [to.swf] is not specified resulting SWF is saved to <from.swf>

Версия 0.1 не умеет перезаписывать эксэпшены, я что-то пока полностью с ними не разобрался.

Приложение тут: initInjector.zip

Сущности покатят?

Я что-то в последнее время сидел думал над Component/Entity-based System применительно к разработке игр. Вот единственная вменяемая ссылка для тех, кто шпрехает на инглише. Если кратко резюмировать, то получается как-то так.

Есть у нас игра и какие-то Сущности в ней (entity — сущность поанглицки). Например, игрок и мобы. В терминах ооп есть цепочка наследования. Игрок и моб наследуются от каких-то классов в цепочке MovableObject, ControlledObject итд. Дальше от моба наследование идет в сторону FlyingMob, UndergroundMob итд. Какие-то типы мобов с разными особенностями и поведением. Очень вероятно, что когда-нибудь нам понадобится летающий, плавающий и одновременно с этим синий моб, а наша цепочка наследования такого не позволяет (привет множественное наследование). Теперь о component-based системах. В данном случае Сущность — это контейнер с уникальным ID для компонентов, которые описывают эту сущность. То есть, то что моб летающий, плавающий и синий мы говорим просто добавляя к нему FlyingComponent, SwimmingComponent и BlueComponent. Просмотрев несколько примеров, я увидел, что компоненты могут быть как пассивными хранилищами данных, так и большими кусочками логики. Но это не важно.

UI.

Так вот, забавно было бы применить такую же идею к UI. То есть вот есть Сущность, она кнопка. А я говорю — стань-ка ты List’ом, и кнопка становится листом с какими-то последствиями. В общем, я вскоре на это забил, потому что получается какая-то неведомая йухня. Для UI как нельзя хорошо работает старое доброе дерево наследования.

Data (Model).

Потом я думал над применением только к данным. Ведь, это то, для чего народ и использует сей подход. Данным в смысле MVC.

Данные самопроизвольно принимают структуру ориентированного графа, где нодами являются объекты со своими свойствами, а стрелочки — отношения. Например, есть у нас Сущность user — некоторый игрок в системе. У него есть items, которыми он владеет и slots — слоты, куда можно эти итемы засунуть. Картинка снизу примерно это и показывает.

entities1

У сущности сверху есть свойство, что оно user. А также коллекция итемов и слотов. Сущность итема тоже говорит, что оно item, плюс к этому свойства owned (принадлежит) и equipped (надето, да, спелчекер подсказал, что пишется с двумя p, но я уже закрыл исходник картинки), которые ссылаются на соответствующие Сущности. Снизу slot (слоты), в одном из них есть ссылка equipment, то есть в него что-то положили. Если разделить взаимные ссылки (например, items и owned), то получается ориентированный граф.

Понятия.

Основные понятия получаются следующие:

  • Entity (сущность) — некий объект, который сам по себе. У сущностей есть id, я думаю уникальный в системе вообще, то есть любую сущность можно всегда найти по id.
  • Property (свойство) — то, что называют еще компонентом или тэгом. Свойство сущности, которое определяет ее как “является тем-то”.
  • Link (ссылка) — ссылка/ссылки на другие entity. По сути, ребра в графе. На самом деле являются частным случаем свойсв.

С ссылками не все так просто, они могут быть одновременно и коллекциями (много ссылок с одинаковыми названиями) или ребрами гиперграфа, но гиперграф не умещается в моем миниатюрном мозге. Могут быть следующие типы ссылок:

  • 1 .. много — в примере items –> item x *
  • много .. 1 — наоборот, item x * –> items
  • 1 .. 1 — equipment –> equiped
  • много .. много — если, например, может быть несколько хозяев у итема

Ссылки могут быть двусторонними, например items –> owned — двусторонняя ссылка. Проще говоря, если я делаю ссылку из user в некий item (добавляю item к юзеру), то на Сущности итема появляется свойство-ссылка owned. Если она там уже есть, то так как это ссылка типа 1 .. много, этот итем убирается из предыдущего хозяина и прицепляется к новому хозяину. Что-то напоминает? Да, частным случаем евляется отношение parent-child. Ссылка slots односторонняя, слоту в данном случае совершенно пофиг кому он принадлежит (как определять выполнимость 1 .. много в данном случае яхз).

Вроде бы должно быть все более-менее просто.

События.

Во фреймворке компании TimeZero есть прикольная фишка, которая мне нравится — баблинг событий по дереву данных. Как в дереве дисплейлиста. То есть, я могу быть ленивой скотиной и не подписываться ко всякой милюзге, а тупо подписаться на событие где-то сильно выше у родителей. Нужное мне событие туда всплывет. Здесь можно сделать также, если считать, что ссылки (даже двусторонние) имеют начало и конец. То есть баблинг идет с конца. Иначе попадаем на движение событий по кругу в совершенно ненужные части, в идеале зацикливание гг.

То есть, допустим итема есть свойство Damaged. Оно там у себя внутри считает и хранит насколько поломано оружие. Как только оружие полностью сломалось, оно шлет событие. Это событие доходит до слота, слот может что-то с ним сделать, если заинтересован в таком событии. Дальше оно идет до юзера. На юзере какие-то свойства могут учесть эту инфу и сделать какие-то выводы. Ну и дальше это же событие всплывает еще выше, пока его дерзко не обрывают или оно не упирается в последний элемент иерархии.

Итог.

Получается забавно, во всяком случае, пока я не заметил существенных косяков. Собственно, хочется услышать кто что думает. Изобрел я велосипед? Слишком сложно?

Я уже вижу некоторые возможные забавные расширения.

Резюмируя флейм про #14

В коментах на номер 14 развернулся нешуточный флейм. Какбы я понимаю обе стороны. Тут вопрос чистоты и понимаемости vs. оптимизации и скорости. Ruby vs. Assembler. Чем более на низком уровне что-то пытаешься сделать, тем больше аккуратнее нужно быть и знать досконально свое окружение, чтоб ничего не сломать. Помните, наш флэш пишут такие же индусы, над кодом которых мы время от времени ржем.

Встреча BURAFPUG 6 февраля в Москве

Что-то я совершенно случайно об этом узнал. Кто туда идет-то вообще? Какие-то все незнакомые имена.

Мой левелап…

Итак, я только что поднялся до уровня 25 в этой ММО игре с названием Жизнь. Еще один день рождения, я уже так стар, что этот день все меньше и меньше кажется праздником. Я думаю, что это не очень хорошая идея, пытаться кратко написать что ты сделал за последний год. Возможно, потому, что обычно писать-то и нечего, но я попытаюсь.

Второй подряд день рождения я встречаю этот день далеко от дома. Но, если в прошлый раз я грустно сидел с бакалом вина и неуверенностью в будущем, то сегодня я вдохновлен и полон креативной энергии. Я могу сказать, что я на 80% счастлив.

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

Этот год прошел очень быстро, но оказался очень важным для меня. Возможно, важнее даже, чем предыдущий. Мне бы хотелось, чтобы следующие года были еще более значими в моей жизни лет так до 35. А потом можно будет и отдохнуть.

~ Cheers.