![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Окрашивание ч/б спрайта в DelphiX
Gnobobel © (2006-01-23 22:01:00)У меня есть спрайт состоящий и белого и чёрного цвета (чёрный - прозрачный). Как окрасить белую часть в другой (RGB) цвет?
Gnobobel (2006-01-27 18:45:00) [1]Пишешь Form1.Color := TRed;
хмакаешь файнд декларейшен, радуешься =)
Лана. Всем пасибо вроде понял, пойду делать.
antonn (2006-01-27 15:11:00) [2]если это битмап 24-32 бита, то можно через scanline.
я просто не знаю, что там в DX...
boalse (2006-01-26 04:45:00) [3]Что есть TRed и что именно я должен понять?
Gnobobel (2006-01-25 16:44:00) [4]boalse
Кхе... просмотри декларейшен TRed и всё поймешь.
boalse (2006-01-25 04:59:00) [5]В смысле RGB?
В примре используется TColor, а как преобразовать RGB в TColor - спроси на www.delphiworld.narod.ru - примеров дофига.
Gnobobel (2006-01-24 17:29:00) [6]BoAlSe
Без тормозов - хорошо, а можно ли канибудь использовать для этого палитру?
Shirson (2006-01-24 09:58:00) [7]А если посомтреть код D2DRenderRotate, там можно обнаружить строчку
D2DEffectAdd($FF, $FF, $FF, $FF);
Рядом с кодом этой процедуры есть еще кучка:
D2DEffectCol
D2DEffectAddCol
D2DEffectSolid
D2DEffectBlend
D2DEffectMul
D2DEffectNone
Какая религия запретила использовать эти эффекты, по уму, разработчикам (un)DelphiX для меня глубочайшая загадка.
Если расширить стандартную команду draw(rotate) и передавать через неё больше параметров (цвета для 4х вершин и прозрачность) и подключить перечисленные эффекты, можно насыщаять изображения любым цветом, одной командой. Независимо от того, сколько цветов в изображении. При максимальной насыщенности изображение полностью перекрашивается. Можно расскрашивать 4 угла разными цветами и степенью прозрачности.
BoAlSe (2006-01-24 08:39:00) [8]Сделай белый прозрачным, затем
var
OutSurf: TDirectDrawSurface
в Tform1.Create:
OutSurf:=TDirectDrawSurface.Create(Form1.DXDraw1.surface.DDDraw);
OutSurf.SystemMemory:=true;//если false - то поверхность не сохранится при
//минимизации приложения, но при false - быстее работает, однако на своей
//машине разницы в быстродействии не заметил
with MainForm.DXImageList1.Items.Find('имя_спрайта') do
begin
SetSize(Width,Height);//Назначаем размер поверхности такойже, как и
//размер спрайта.
end;
OutSurf.TransrarentColor:=clBlack;//Чёрный цвет - прозрачный
в Form.destroy не забудь убрать за собой:
OutSurf.Free;
Теперь, собственно, отрисовка:
With OutSurf.canvas do
begin
brush.Color:=clLime;//цвет, которым будет закрашиваться белая часть
FillRect(ClientRect);//заливаем поверхность нужным цветом
release;//надо
end;
with MainForm.DXImageList1.Items.Find('имя_спрайта') do
Draw(OutSurf,0,0,0);//Рисуем на поверхности OutSurf нужный спрайт
//при этом рисуется только чёрная его чать, а белая(прозрачная), само-
//сабой не рисуется, таким образом, на поверхности OutSurf имеем рисунок
//Чёрного цвета, на нужном нам фоне, короче, тотже спрайт, но только
//вместо белого, у него нужный тебе цвет. Осталось отрисовать эту
//поверхность там, где тебе надо, например:
Form1.DXDraw1.surface.Draw(X,Y,OutSurf.ClientRect,OutSurf,true);
Я таким образом вывожу разноцветный текст в своей игре - работает отменно, без тормозов. Правда brush.Color:=clBlack не прокатит, подумай почему.
Gnobobel (2006-01-23 22:10:00) [9]P.S. okrashivat nado pri vivode. Toest iz odnogo spraita na ekran budet vilezat n kartinok raznih svetov.