-Поиск по дневнику

Поиск сообщений в Cos_stub

 -Подписка по e-mail

 

 -Постоянные читатели

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 02.08.2007
Записей: 57
Комментариев: 70
Написано: 438

Выбрана рубрика Computer Games Interface.


Другие рубрики в этом дневнике: Programming Interface(6), Fiction Interface(9)

It is so nice to see new places, meet new people...and kill them

Дневник

Четверг, 25 Октября 2007 г. 23:44 + в цитатник
Эта фраза из игры Overlord. В рустыне советчик главного героя ее говорит спокойным голосом, вроде как все так и должно быть.
Рубрики:  Computer Games Interface

Why am I so great?

Дневник

Четверг, 25 Октября 2007 г. 23:29 + в цитатник
Согласно описанию игры, так называлась книга-бестселлер, которую написал Duke Nukem после победы над вселенским злом.
Рубрики:  Computer Games Interface

Эффект жидкости

Дневник

Четверг, 06 Сентября 2007 г. 13:32 + в цитатник
Меня удивляло, как в древней игрушке Quake была анимирована вода. Это был не набор текстур-кадров анимации, а лишь одна текстура, но она чудесным образом деформировалась. Причем это было не линейное преобразование. На то время сложно представить что люди писали пиксельные шейдеры, но в первом квейке они точно есть.
Время Квейка ушло, найти описание как они делали эту примочку мне не удалось, зато глядя на саму воду появились догадки как сделать подобный эффект.
Текстура это квадратный двумерный массив пикселей (более стильно сказать матрица :)). Как массив - можно сделать циклический его сдвиг, например строки вправо или влево, столбца вверх и вниз. Индексы можно рассматривать как координаты х и y. Тогда при сдвиге по горизонтали и вертикали на dx и dy получим Х=x(+/-)dx, Y=y(+/-)dy.
Возьмем синусоиду вида f(x)=a*sin(x*2*Pi/N), где a - амплитуда, х- координата, а N - размер текстуры по горизонтали, f(x) есть округленное целое число. Используем ее для сдвига столбцов матрицы - Х=х,Y=y-f(x). Теперь элемент новой деформированной текстуры X,Y соответствует элементу X,Y+f(X) оригинала. Как результат мы получаем волновую деформацию по горизонтали.
Аналогично возьмем синусоиду вида g(y)=b*sin(y*w*Pi/N),... X,Y соответствует элементу X+g(Y),Y. Получим волновую деформацию по вертикали.
Теперь можно их обьединить, в результате X=x+g(y),Y=y+f(x+g(y)).. хотя можно получить и X=x+g(y+f(x)),Y=y+f(x).
Теперь исходя из практики - считать для каждого пикселя текстуры синус - это тяжело для процессора и глупо. Ведь мы подаем в качестве аргумента целое число в диапазоне от 0 до N-1. Можно заранее вычислить значения синусов 1 раз и записать их в массив, потом просто брать готовые значения.
Анимация деформации делается очень просто, синунусу дается начальнаяя фаза, например r. Проверка на то, вылазит ли индекс за пределы массива легко делается остатком от деления, например (x+a)%N. Но тут получается глюк, в слечае если x+a<0. Допустим сдвиг индекса a по модулю не превышает N, тогда в виде (x+a+N)%N у нас все будет работать нормально. Теперь что касается функции f. Агрументом будет подаваться x,x+a или y+g(x). Пусть она возвращает значения от 0 до N-1 (циклический сдвиг на -1 эквивалентен сдвигу на N-1). Получается что агрументы могут принимать значения от 0 до 2N-2. Конечно можно свести аргументы к 0..N-1 операцией целочисленного деления, но ее можно вообще не делать, если увиличить массив вычисленных значений в 2 раза.
В результате после предварительной подготовки, мы можем получить значение деформированного пикселя X:=(X+G[Y])%N,Y:=(Y+F[X])%N, тут % - остаток от деления. Т.е. 2 сложения, 2 взятия элементов массива и 2 остатка от деления
Рубрики:  Programming Interface
Computer Games Interface

Doom 1,2

Дневник

Воскресенье, 26 Августа 2007 г. 16:04 + в цитатник
Классика жанра имела следующий арсенал для истребления нечисти

  • Кастет - Не особо полезный, наносил 2 очка повреждений в 0.5 секунды

    • Берсерк - Можно рассматривать как улучшение оружия. С ним наносится 10 очков повреждений

  • Пистолет - Как оказалось еще менее полезный - 1 очко повреждений в 0.5 секунды
  • Бензопила - Лучшее из оружия ближнего боя, наносит 1-2 очка повреждений в 0.1 секунды
  • Ружье - Как это ни банально, но ружье стреляет 7 дробинок, по 1 очку повреждения в 1.2 секунды
  • Двухстволка - То же самое,но дробинок 20, по 1 очку в 1.5 секунды
  • Пулемет - По 1 очку повреждения на пулю в 0.1 секунды
  • Базука - Ракеты медленные, (от них можно убежать пешком) но где-то 10 очков повреждений в 0.7 секунды
  • Плазма винтовка - Шарики плазмы быстрее ракет, 2 повреждения в 0.1 секунды
  • BFG 9000 - Большой и жирный разрывной шарик, раз в 2 секунды, но 100 очков повреждений. Прямое попадание наносит от 100 до 800 повреждений. После попадания из точки во всех направлениях отходят 40 лучей, каждый луч наносит от 49 до 87 повреждений. Повреждения выбираются псевдослучайно.

Очко повреждений - примерно 3% от жизни. Как видно в игре были непонятки:

  1. Удар кастетом мощнее пули от пистолета
  2. Дробинка от ружья эквивалентна пуле от пистолета
  3. Если из одного патрона выходит 7 дробинок, то из двух их 20
  4. Если выстрел из BFG потреблял 40 зарядов и приносил 100 повреждений, то выстрел из плазма-винтовки 1 заряд и 2 повреждения,(40 зарядов/80 повреждений)

Значения взяты из

http://doomworld.com/pageofdoom/weapons.html
Рубрики:  Computer Games Interface


 Страницы: [1]