пятница, 27 декабря 2013 г.

Прогресс, наконец то


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

среда, 25 декабря 2013 г.

Жывотное


Что то я закопалась и потеряла счет дням. Итак, есть целых два первых уровня. Сделали список гемплейных возможностей и ограничений, начали писать уровни в тексте. Очень хочется сделать внятный туториал и уровни не заставляющие чувствовать игрока тупым идиотом который не понимает что от него хотят вообще.

И да, переписала полностью просчет сцены.




воскресенье, 22 декабря 2013 г.

День десятый


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










ps. В вот таком вот ключе -

package helpers {
    import flash.events.Event;
    import flash.events.TimerEvent;
    import flash.utils.Timer;

    public function $_toTime (time : uint, callback : Function, ...params) : Timer {
        var timer : Timer = new Timer(time, 1);
        timer.start();
        var onComplete : Function = function (e : Event) : void {
            callback.apply(null, params);
            timer.removeEventListener(TimerEvent.TIMER_COMPLETE, onComplete);
        }
        timer.addEventListener(TimerEvent.TIMER_COMPLETE, onComplete);

        return timer;
    }
}

суббота, 21 декабря 2013 г.

День восьмой и девятый - лень и дела

Отголосок ленивой сонной расслабленности продолжает преследовать. Уникальное состояние на самом деле - когда не тревожат горящие дела. Наверно оно было несколько раз в жизни.
Тем не менее немного полезного сделано. Начала писать костяк квестов, писать / удалять. Хочу сделать так чтобы оно было максимально подготовлено к внезапным хотелкам, было по возможности стабильным и при добавлении конструктора уровней для игроков чтобы не переписывать слишком много.
Будет очень много статики, и не будет синглтонов. Опыт показывает что приложение достаточно крупное выдерживает без архитектурных фреймворков если статические ссылки на классы собраны в нескольких местах. Да, я не буду скорее всего использовать что то стороннее, очень не хочется разбирать и отлаживать чужое, разве что с минимал компс украду пару идей.

Меня последнее время очень беспокоит мысль про дырявые абстракции. Есть ощущение что когда все запихиваешь в черный ящик то расслабляешься и позволяешь делать странные вещи, думая что все равно апи скроет. Вот есть желание не притворяться, а показывать что делает объект и какими механизмами. И инструментом предупреждения ошибок делать здравый смысл и простоту.
К тому же не сильно удачные абстракции усложняют жизнь больше чем упрощают. Есть ощущение что на старте нам показывают хороший инструмент, он помогает, и его начинают использовать везде где нужно и не нужно. Получается как то так : создаем красивое обобщение, натыкаемся на исключение, дописываем, дописываем, дописываем, получаем сферического монстра который уже не может использоваться и начинаем заново. Как то так.

Зы. Как это касается квестов. Я разделила их на две части данные присущие любой сущности которая описывает игровые правила и на специфические классы для которых скорее всего в интерфейсе будет только геттер на основную часть (уникальный айдишник и тип пока)Ю Один уровень - один уникальный класс который моделирует все что угодно внутри используя графические и логические компоненты, имеет доступ к данным системы, имеет свой уникальный набор данных. Посмотрим что из этого выйдет.

четверг, 19 декабря 2013 г.

День седьмой - отсыпаюсь после вчерашнего забега.

Успето мало. Сохранение и загрузка игрового процесса, причесывание визуала поля, ресайз ячеек. Уже вполне залипабельно ;)

Ночная инкапсуляция

Дорисовала я вчера элементы и поняла что не смогу заснуть пока их не вставлю в игру, хотя уже в ушах звенело слегка, поэтому кодю слегка на автомате.

Итак, делаю класс BaseCellData чтобы разбирать клип с разными цветами и формами для одного соеденения на битмапы.

public class BaseCellData {

public var y:int;
public var x:int;

public var name:String;

private var _frames:Array = [];

public function BaseCellData (
name:String, 
mc:MovieClip, 
x:int, y:int
) {
    this.x = x;
    this.y = y;
    this.name = name;
    for (var i:int = 1; i <= mc.totalFrames; i++) {
        mc.gotoAndStop(i);
        _frames[i] = createBitmap(mc).bitmapData;
    }
}

И забиваю себе данные.
public static var data:Object = {};
data['0000'] = new BaseCellData('cell_0000', new cell_0000(), -2, -2);
....

Таак думаю я, для начала сделаем рандомчик. Как сделать проще всего?

public function get bitmapData ():BitmapData {
    return _frames[1 + Math.floor(Math.random()* (_frames.length - 1)];
}

Впихиваю в отрисовку, запускаю - после нескольких правок неправильных символов все работает, красотень! Запускаю просчет - здравствуй карнавал (на каждый просчет все ячейки перекрашиваются).

Блиин, а надо же запоминать в какой ячейке какой цвет!
Дописывается код

public var frame:int;

public function getBitmapData (frame:int = -1):BitmapData {
    this.frame = frame;

    if(this.frame == -1){
        this.frame = 1 + Math.floor(Math.random()* (_frames.length - 1) );
    }
    return _frames[ this.frame];
}

Теперь я могу узнать какая картинка получена и запомнить во вьюхе, все работает, я ложусь спать.


Утро.
О боже что же я натворила! Мысль не выходит из головы пока завтракаю.

Убираю из кода getBitmapData, магический frame который отдает верное значение только сразу после обращения и открываю доступ к _frames.

А мораль такова - пока не собираешься строить продуманный и клевый звездолет лучше не выеживаться и давать доступ к данным напрямую.



среда, 18 декабря 2013 г.

День шестой - многарисую


Минимум 16 клеток + 2 состояния - ща умру и ща появлюсь * четыре пять кадров... Сделано где то 80%, осталось сейчас нарисовать 2 фигуры и раскидать цвета по кадрам.
К вечеру слегка болит голова, явно от переизбытка усилий. Но оно мне нравится.
Зы, то что было утром -

Завтра буду проставлять координаты для точного позиционирования на сетке и вставлять в демо.

вторник, 17 декабря 2013 г.

День пятый

Нарисовано не так много как мне хотелось бы, но за набросками все яснее видно что вырисовывается некая бредовая стилистика.
И опять ко мне вернулась простуда, когда же я вылечусь до конца.

Стартскрин

Старт туториала

Экран головоломки с заданием, прямо очень набросочно

Пробую сделать финальный арт для знаков жизни.



Настройки, пока не нравится.

Откуда растут ноги у плохого кода?

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

Размышления

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

И это я к чему - я больше либо не делюсь планами, либо проношу мимо ушей скептические морды (по поводу моего текущего проекта их было 99%).

Наверно сейчас такой же переломный период, время принятия решений. А решение такое - я занимаюсь только тем что ценно для меня и делаю это с полной отдачей.

Моя жизнь настолько полна невозможного что уже пора поверить в себя.

понедельник, 16 декабря 2013 г.

День четвертый












Итак, вчера ко мне приехал планшет.


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

суббота, 14 декабря 2013 г.

Про оптимизацию глазами флешера.

Публикую недописанное чтобы не потерять и не забыть. Надеюсь домучать в ближайшее время.

Хочу показать основные известные мне капитанские "лайфхаки" которые позволяют достаточно быстро и эффективно сделать обычное "неидеальное и говнокодистое" приложение быстрее. Это попытка упорядочить и уточнить примерами и тестами последний год моей работы в геймдеве.

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

Поиск проблем.
Для определения тяжелых мест можно использовать замечательный скаут (профайлер). Работа со скаутом остается за кадром, так как методом тыка все быстро осваивается. Замечу только, что для превращения обычных swf в swf с телеметрией я использую SWF Scout Enabler (есть другие, более правильные способы, но имхо это самый простой).
Стоит обратить внимание на две вещи - массовые выделениях памяти и кадры что заняли много времени. В них и смотреть, вплоть до самого жесткого и малочитаемого переписывания.

Рефакторинг.
Первое что я делаю с тяжелым кодом это улучшение читаемости (и не забываем на случай неприятностей делать это отдельным коммитом!).
Переименовыаю невнятные локальные сущности, добавляем комментарии.
Для дальнейший работы требуется ясно читаемый алгоритм и намерения автора по использованию кода, иначе вероятность привнесения бага оптимизацией будет стремиться к 100%.
Важно на этом этапе ничего не менять в логике, опять же вероятность внесения багов очень велика. Большие дяди советуют делать юнит тесты, но в грустном моем мире делать их до того как поймешь как работает код бессмысленно, а после уже не особо и нужно (тут работает принцип распределения времени на самые горящие задачи, работать дальше со стабильным кодом обычно возможности нету).

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

Ускорение доступа к данным, индексация.
//TODO

Кеширование.
//TODO

Пуллинг.
//TODO


Распределение нагрузки.
Когда код более менее вычищен а тормозов есть стоит обратить внимание на пики нагрузки еще раз. Чтобы юзер не видел залипаний можно уводить расчеты в поток, отслеживать загруженность системы и не запускать тяжелые методы вроде ручного gc в моменты когда фпс ниже нормы. Если цп уйдет в 100% быстрее не будет, поверьте, будет медленнее (не считая нервов юзера у которого все залипло, и не забываем про 15 секунд лимита после которых плеер просто прибьется).
Простейшая реализация тут - github.com/.../SimpleCallManager.as, использование - github.com/.../ThreadSimpleMain.as.


И теперь уже можно сюда.
gskinner.com/talks/quick
help.adobe.com/ru_RU/as3/mobile/flashplatform_optimizing_content.pdf
jacksondunstan.com

Всем добра.

Выходной


Да, всему мера должна быть, даже мечте. Поняла сегодня что начинаю нести фигню и надо притормозить. Объявляю день перезагрузки и генеральной уборки дома.

Но нечто все таки сделано - скетч одного экрана, концепция графики из которой понятно что все прежде придуманное и нарисованное идет в топку.

пятница, 13 декабря 2013 г.

День третий - бюрократия

Мы писали, мы писали (действительно мы, есть еще бесценный Ростислав).
Концепт док, планы, тасочки корневые, описание мира, первые два уровня с туроиала, список экранов и обьектов на них.
Многабуков, надеюсь что планы приближены к реальности.
По планам через месяц первый релиз, но мучать всех знакомых начну очень скоро ).

И да, заказала утром графический планшет. Из розетки так и не позвонили, ****.

Вставила кастомную картинку в игру. Понравилось. 

четверг, 12 декабря 2013 г.

Инди!

Потихоньку в голове начинает рождаться понимание того чего хочу в графике, и это прекрасно.
И сегодня появилась первая игровая демка одного из режимов и это еще лучше.

среда, 11 декабря 2013 г.

понедельник, 2 декабря 2013 г.

Hello world

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