Трехмерная стратежка - 3

Скоро Новый год, но творческая артель «Сумрачные тугодумы» продолжает фигачить.
Под катом немного новостей…

лайтмапы
Наконец-то запек лайтмапы (и ambient occlusion, которого нифига не видно).
Получилось немного темновато, но это поправимо.

Большинство пожеланий из прошлого поста реализовал.
Сетка стала ярче, менять маринов можно один кликом, подсветка объектов под курсором есть, кружочки не исчезают.

Пульсации не получилось, сетка слишком крупная :(
Кружочки увеличу, как руки дойдут.
Камеру считать тестовой, до нее еще не добрался.

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

Оставшееся время ковырялся со стрельбой.

Понадобилось сделать трассировку видимости.
Сделал на основе клеток (можно стрельнуть через клетку или нет). Хорошо бы приделать «честную», но как-то пока не сильно хочется зарываться. Вроде нормально.

Сделал частицы.
Частицы делать не так просто, как кажется.
В «игровом» пространстве они представляют собой точки, а в «графическом» это квады, ориентированные «лицом» в камеру.
Приходится выдергивать из матрицы камеры два вектора и строить на этом базисе фейсы. Ну и про вращение не забыть.
Ничего сильно сложного, но когда делаешь в первый раз — приходится хорошо подумать.
Кстати, если вы думаете, что с molehill это не пригодится — вы не правы :)

Огонь из оружия и «пуля» — аддитивный блендинг с одной частицей.
Кровь — обычный блендинг с анимацией. Частицы выдрал из quake3.

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

В общем, сейчас можно популякать во вражину.
Выбрали марина, если под алиеном клетка стала красной — значит можно пулякать.

В принципе, осталось доделать немного:
1. Изменение амбиента на модельках.
2. «Динамическая» статика. Куски уровня, которые двигаются. Хрен пойми как из рисовать лучше.
3. Сделать саму игру :)
4. Оптимизация скорости и размера.

Демка тут: megaswf.com/serve/89517/ (3.5 метра)

PS. Перешел для архивов на codeazur.com.br/lab/fzip/
Распаковка стала в 10 раз быстрее, потому что юзает нативные методы.
  • +6

Комментарии (33)

+1
Баг нашел. Иногда юнит как юла крутиться :)
0
Опять этот баг вылез?
Я думал, что исправил.
Переделаю, спасибо.
0
А можешь кратко рассказать как работаешь с битмапом? Используешь flash.Memory и BitmapData.setPixels? Если да, то как делаешь альфа-блендинг? Или у тебя просто прозрачно/не прозрачно, без градаций?
0
Руками, все руками.
Формула (dst.color*(1-src.alpha)) + (src.color*src.alpha)
Вот тут кусок кода: pastebin.com/a93Ncj9j
Очень медленно, но частиц мало и они маленькие, поэтому с этим можно смириться.
0
А, да, забыл.
var a:Float = (((tClr >> 24) & 0xFF) / 256) * alpha;

alpha это общая прозрачность фейса.
Тут еще можно (нужно) соптимизировать.
В начале функции, alpha надо сразу поделить на 256, и убрать деление.
0
Ясно. Я очень надеялся что есть способ побыстрее :-)
А текстуры у тебя без прозрачности?
0
Почему без? Все с прозрачностью.
var a:Float = (((tClr >> 24) & 0xFF) / 256) * alpha;
Вот эта строчка как раз читает прозрачность из текстуры.
0
Я имел ввиду не системы частиц, а все остальное. Или ты этот код и рисования моделек и уровня используешь? Тогда он очень быстро работает, получается :-)
0
Да, это только для частиц.
Все остальное без прозрачности, там просто копирование.
0
Тут можно еще оптимизировать, в принципе.
Хранить заранее умноженные цвета.
Экономится 3 умножения на пиксель.
0
Оптимизировать там можно. Например:
[code]
a = (c >> 24) & 0xFF
r = ((c >> 16) & 0xFF) * a >> 8;
ia = 0xFF-a;
r = r + ((fr * a) >> 8)
if(r >> 8 != 0)
r=0xFF;
[/code]
Не факт, что это быстрее во флеше, но флоаты и преобразования типов в таком коде как-то не смотрятся.

Кстати, я не очень понял, у тебя значения компонента цвета от 0 до 255, а делишь ты на 256, т.е. единицы они никогда не достигнут. Мелочь, конечно.

Но все это ИМХО мертвому припарки. Для моего случая. Т.к. я хочу весь экран и по нескольку раз с блендингом зарисовать. Я надеялся у тебя есть какая-то магия :-)
0
Попробую, может будет быстрее.
К сожалению, триксы, которые работают в «нативном» коде, тут не проходят.
Тут скорее важно количество операций, а не тип.
Внутри плеера интерпретатор байткода, а не JIT.
0
Ну бленди нативными средствами, там явно быстрее будет.
0
Переделал рендеринг мешей (умножение текстуры на освещение) по твоему примеру.
Увы, ничего не дало в плане скорости.
Не могу заметить разницы.
Даже мерялку приделал. Нифига.
0
Ну значит флеш достаточно быстро из int во float и обратно конвертит, и кроме того в общем числе операций это деление дает небольшой вклад.
0
Что-то у тебя лайтмапы какие то жОские получились )
Может их немного разблюрить? Хотябы в фотошопе гаусс-блюром. Только когда блюрить будешь не забудь выделить только нужные места, а то все тени после блюра будут с одного куска на другой заплывать.

Кстати можно ещё попробовать отдельно посчитать АО, а потом наложить его блендинг-умножением на текущие тени (и +- контрастность прибавить, чтобы чувствовалось АО)

Ну а так вижу что продвигаются дела, молодцом так держать :)
+1
Сейчас лайтмапы сделаны пиксель в пиксель, поэтому края жесткие получились.
Попробую заблюрить.

АО отдельно посчитано и накладывается по «честному». амбиент*0.25+диффуз.


1. амбиент
2. скейленый амбиент (в интервал от 0 до 0.25)
3. лайтинг
4. скейленный амбиент+лайтинг

Просто текстурки темные, поэтому хреновато выходит, если делать «честно».
Придется подбирать коэффициенты.
0
Чесно не всегда значит красиво ;)
Ну вообще если убрать направленный источник, а сделать точечные думаю всё будет норм выглядеть.
0
Супер. Без текстур эффектней смотрится! Может есть смысл текстуры поправить и оставить по «честному»?
0
Да, если текстуры сделать светлыми (что-то вроде голубого металла, как в Starcraft2), было бы интересней.
Только нет других текстур пока :)
0
ага, мне это напомнило моё любимое меню из Mirror's Edge :)
http://www.youtube.com/watch?v=i9Ky40VCg7M
0
Кста есть прога для создания AO текстуры, называется faogen. Правда бесплатная версия не даёт сохранить полученную текстуру… Но это ограничение с лёгкостью обходится кнопкой PrintScreen ;)
0
Я максом запекаю.
0
Я понимаю ) Просто экспортируешь в obj и потом открываешь в faogen. Ну вообщем как хочешь :)
0
аа) крутотень, и главное на моем нетбуке не тормозит :D
  • z3lf
  • z3lf
0
Да, главное, что не тормозит :)
Сам радуюсь.
0
ну вот. вся критика была в тему — щас весело)) Пора бы текстурки нормально сшить и мб сделать динамическое освещение от якобы светильников, либо на потолке либо по стенам пихнуть лампы. думаю будет всё круто.
0
Текстуры потом сошью, когда их побольше станет, чтобы не переделывать.
Про лампочки думаю, может даже цветные приделаю, если не будет тормозить.
Еще хочу тени попробовать от динамики, вдруг взлетит :)
0
Главное чтобы не упала))))

А ещё бы хотелось увидеть чтото типо уроков ну или ликбеза по тому что ты делаешь. Не вплане как и что и куда, а вплане с чего начинать и куда двигаться) Ссылочки и т.п.

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

Как нарисовать точку? Треугольник? Расписать структуры данных?
Можно, но опять таки, скоро все это устареет.
0
Для начала вот можно почитать: www.enlight.ru/faq3d/content.htm
Чтобы это к флешу применить, желательно знать про алхимию или haxe, в котором есть АПИ для работы с алхимической памятью.

А вообще ИМХО делать 3д движок стоит, только если очень хочется именно сделать 3д движок — развлекуха замечательная.
0
Ок будем ждать молхил. Думаю над альтернативой тож придёться голову ломать не меньше)
0
Да вроде там обещают, что будет удобно.

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

Изврат со своим движком оправдан, когда получаешь удовольствие именно от «траханья с кодом» :)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.