Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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
7-19908
OxOTHuK
2003-02-12 07:17
2003.04.07
Флоп, логич диск или СD


1-19537
Minog
2003-03-26 13:11
2003.04.07
перегрузка


14-19838
Malder
2003-02-27 23:31
2003.04.07
Большой куш (snatch)


3-19436
grusty
2003-03-18 13:34
2003.04.07
Открытие файла базы данных, игнорируя индексный файл...


3-19495
studentas
2003-03-14 17:19
2003.04.07
SQL v DELPHI





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский