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

Наконец-то запек лайтмапы (и ambient occlusion, которого нифига не видно).
Получилось немного темновато, но это поправимо.
Большинство пожеланий из прошлого поста реализовал.
Сетка стала ярче, менять маринов можно один кликом, подсветка объектов под курсором есть, кружочки не исчезают.
Пульсации не получилось, сетка слишком крупная :(
Кружочки увеличу, как руки дойдут.
Камеру считать тестовой, до нее еще не добрался.
Сделал блендинг анимаций.
Особенно это заметно по тому, что стоящие марины проигрывают разные анимации, а не одну, как раньше.
Оставшееся время ковырялся со стрельбой.
Понадобилось сделать трассировку видимости.
Сделал на основе клеток (можно стрельнуть через клетку или нет). Хорошо бы приделать «честную», но как-то пока не сильно хочется зарываться. Вроде нормально.
Сделал частицы.
Частицы делать не так просто, как кажется.
В «игровом» пространстве они представляют собой точки, а в «графическом» это квады, ориентированные «лицом» в камеру.
Приходится выдергивать из матрицы камеры два вектора и строить на этом базисе фейсы. Ну и про вращение не забыть.
Ничего сильно сложного, но когда делаешь в первый раз — приходится хорошо подумать.
Кстати, если вы думаете, что с molehill это не пригодится — вы не правы :)
Огонь из оружия и «пуля» — аддитивный блендинг с одной частицей.
Кровь — обычный блендинг с анимацией. Частицы выдрал из quake3.
Еще оказалось, что я не могу точно определить время начала вылета крови из тела. Все время получалось, что я или отстаю, или кровь вылетает раньше чем надо.
Пришлось немного поменять внутреннюю структуру очереди действий.
Но об этом надо долго рассказывать.
В общем, сейчас можно популякать во вражину.
Выбрали марина, если под алиеном клетка стала красной — значит можно пулякать.
В принципе, осталось доделать немного:
1. Изменение амбиента на модельках.
2. «Динамическая» статика. Куски уровня, которые двигаются. Хрен пойми как из рисовать лучше.
3. Сделать саму игру :)
4. Оптимизация скорости и размера.
Демка тут: megaswf.com/serve/89517/ (3.5 метра)
PS. Перешел для архивов на codeazur.com.br/lab/fzip/
Распаковка стала в 10 раз быстрее, потому что юзает нативные методы.
Под катом немного новостей…

Наконец-то запек лайтмапы (и ambient occlusion, которого нифига не видно).
Получилось немного темновато, но это поправимо.
Большинство пожеланий из прошлого поста реализовал.
Сетка стала ярче, менять маринов можно один кликом, подсветка объектов под курсором есть, кружочки не исчезают.
Пульсации не получилось, сетка слишком крупная :(
Кружочки увеличу, как руки дойдут.
Камеру считать тестовой, до нее еще не добрался.
Сделал блендинг анимаций.
Особенно это заметно по тому, что стоящие марины проигрывают разные анимации, а не одну, как раньше.
Оставшееся время ковырялся со стрельбой.
Понадобилось сделать трассировку видимости.
Сделал на основе клеток (можно стрельнуть через клетку или нет). Хорошо бы приделать «честную», но как-то пока не сильно хочется зарываться. Вроде нормально.
Сделал частицы.
Частицы делать не так просто, как кажется.
В «игровом» пространстве они представляют собой точки, а в «графическом» это квады, ориентированные «лицом» в камеру.
Приходится выдергивать из матрицы камеры два вектора и строить на этом базисе фейсы. Ну и про вращение не забыть.
Ничего сильно сложного, но когда делаешь в первый раз — приходится хорошо подумать.
Кстати, если вы думаете, что с molehill это не пригодится — вы не правы :)
Огонь из оружия и «пуля» — аддитивный блендинг с одной частицей.
Кровь — обычный блендинг с анимацией. Частицы выдрал из quake3.
Еще оказалось, что я не могу точно определить время начала вылета крови из тела. Все время получалось, что я или отстаю, или кровь вылетает раньше чем надо.
Пришлось немного поменять внутреннюю структуру очереди действий.
Но об этом надо долго рассказывать.
В общем, сейчас можно популякать во вражину.
Выбрали марина, если под алиеном клетка стала красной — значит можно пулякать.
В принципе, осталось доделать немного:
1. Изменение амбиента на модельках.
2. «Динамическая» статика. Куски уровня, которые двигаются. Хрен пойми как из рисовать лучше.
3. Сделать саму игру :)
4. Оптимизация скорости и размера.
Демка тут: megaswf.com/serve/89517/ (3.5 метра)
PS. Перешел для архивов на codeazur.com.br/lab/fzip/
Распаковка стала в 10 раз быстрее, потому что юзает нативные методы.
- +6
- ryzed
Комментарии (33)
Я думал, что исправил.
Переделаю, спасибо.
Формула (dst.color*(1-src.alpha)) + (src.color*src.alpha)
Вот тут кусок кода: pastebin.com/a93Ncj9j
Очень медленно, но частиц мало и они маленькие, поэтому с этим можно смириться.
alpha это общая прозрачность фейса.
Тут еще можно (нужно) соптимизировать.
В начале функции, alpha надо сразу поделить на 256, и убрать деление.
А текстуры у тебя без прозрачности?
Вот эта строчка как раз читает прозрачность из текстуры.
Все остальное без прозрачности, там просто копирование.
Хранить заранее умноженные цвета.
Экономится 3 умножения на пиксель.
[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, т.е. единицы они никогда не достигнут. Мелочь, конечно.
Но все это ИМХО мертвому припарки. Для моего случая. Т.к. я хочу весь экран и по нескольку раз с блендингом зарисовать. Я надеялся у тебя есть какая-то магия :-)
К сожалению, триксы, которые работают в «нативном» коде, тут не проходят.
Тут скорее важно количество операций, а не тип.
Внутри плеера интерпретатор байткода, а не JIT.
Увы, ничего не дало в плане скорости.
Не могу заметить разницы.
Даже мерялку приделал. Нифига.
Может их немного разблюрить? Хотябы в фотошопе гаусс-блюром. Только когда блюрить будешь не забудь выделить только нужные места, а то все тени после блюра будут с одного куска на другой заплывать.
Кстати можно ещё попробовать отдельно посчитать АО, а потом наложить его блендинг-умножением на текущие тени (и +- контрастность прибавить, чтобы чувствовалось АО)
Ну а так вижу что продвигаются дела, молодцом так держать :)
Попробую заблюрить.
АО отдельно посчитано и накладывается по «честному». амбиент*0.25+диффуз.
1. амбиент
2. скейленый амбиент (в интервал от 0 до 0.25)
3. лайтинг
4. скейленный амбиент+лайтинг
Просто текстурки темные, поэтому хреновато выходит, если делать «честно».
Придется подбирать коэффициенты.
Ну вообще если убрать направленный источник, а сделать точечные думаю всё будет норм выглядеть.
Только нет других текстур пока :)
http://www.youtube.com/watch?v=i9Ky40VCg7M
Сам радуюсь.
Про лампочки думаю, может даже цветные приделаю, если не будет тормозить.
Еще хочу тени попробовать от динамики, вдруг взлетит :)
А ещё бы хотелось увидеть чтото типо уроков ну или ликбеза по тому что ты делаешь. Не вплане как и что и куда, а вплане с чего начинать и куда двигаться) Ссылочки и т.п.
Но наверное это уже слишком нагло)
Ну и непонятно о чем рассказывать.
Как нарисовать точку? Треугольник? Расписать структуры данных?
Можно, но опять таки, скоро все это устареет.
Чтобы это к флешу применить, желательно знать про алхимию или haxe, в котором есть АПИ для работы с алхимической памятью.
А вообще ИМХО делать 3д движок стоит, только если очень хочется именно сделать 3д движок — развлекуха замечательная.
В любом случае, когда скорость позволяет, удовольствия «творить» гораздо больше, чем когда дрожишь над каждым лишним пикселем.
Изврат со своим движком оправдан, когда получаешь удовольствие именно от «траханья с кодом» :)