Форум: "Игры";
Текущий архив: 2003.04.07;
Скачать: [xml.tar.bz2];
ВнизDirect API Найти похожие ветки
← →
Ich Hasse (2002-11-04 11:36) [0]вопрос а как вывести спрайт но с определенными сдвигами одного цвета?
к примеру есть человечек, на нем одежда зеленого цвета, штаны красные, как вывести спрайт, чтобы вместо зеленого был синий(к примеру) а вместо красного Серый???
← →
Sapersky_ (2002-11-04 14:18) [1]Т.е. скины нужно сделать, так? :)
Существуют следующие варианты:
1) Палитровая графика. На достаточно мелкого (я полагаю) человечка 256 цветов хватит без особых проблем и ухудшений качества. Правда, с подготовкой спрайтов придётся повозиться, лучше сразу рисовать их в 256 цветах и заранее выделить градиентные области для куртки, штанов и т.д. Или преобразовать True-color спрайт в 256 цветов, выделить упомянутые области программно и опять же т.д.
Выводить можно прямо из палитровой поверхности (медленнее) или сначала преобразовать к формату первичной поверхности (требует больше памяти). Можно сделать своего рода кэш оцветнённых спрайтов.
2) Маски. Где-то на DelphiGFX была статья. Но если выводить, как там написано (попиксельно) - будет медленно, лучше просчитывать заранее, или опять же делать кэш.
Можно попробовать сделать эти маски через Direct3D (аппаратно) - с мультитекстурированием или ещё как. Но формулы смешения текстур в общем довольно примитивны - сложение, умножение, ещё что-то, так что придётся долго возиться, подбирая цвета так, чтобы их сумма/произведение дала нужный.
Кстати, формулы можно менять. Через пиксельные шейдеры. 2D-программа, использующая п.ш. - это круто! :)
3) Еще вариант с D3D - регулировать цвет спрайта через цвет вершин полигона, которым он рисуется. Но это будет влиять на весь спрайт, а не только на куртку/штаны.
← →
Ich Hasse (2002-11-04 15:52) [2]Мне надо как-то сдвинуть палитру при выведении определенного оттенка, но как, я согласен п.ш. это круто, и D3D тоже но у меня 2D
← →
Sapersky_ (2002-11-04 16:48) [3]Т.е. нужен непосредственно алгоритм сдвига (изменения цвета)?
Ленитесь, товарищ... Я думал, до этого можно и самому допереть... :)
Вот вариант для палитровой графики:
// src - исходная палитра, dest - результирующая
For n:=сFrom to cTo do begin
// цикл по определённому фрагменту палитры (сFrom..cTo)
// с градиентом (возможно, неравномерным) нужного цвета
m:=(src[n].r+src[n].g+src[n].b) / 768;
// считаем примерно grayscale-интенсивность
r:=Round(m * color.r * Brightness);
g:=Round(m * color.g * Brightness);
b:=Round(m * color.b * Brightness);
// определяем новые цветовые значения
// color - требуемый цвет, brightness - яркость
If r>255 then dest[n].r:=255 else dest[n].r:=r;
If g>255 then dest[n].g:=255 else dest[n].g:=g;
If b>255 then dest[n].b:=255 else dest[n].b:=b;
// на случай выхода из диапазона
end;
Для масок - см. статью на DelphiGFX, там пример есть.
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2003.04.07;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.007 c