Изменение гаммы спрайта
Оформил: XVeL
Автор: Spose&Daddy
WEB-сайт: http://daddy.mirgames.ru
Для чего это нужно. Эту технологию можно
использовать для выделения "юнита", или для выделения пункта
меню. Одним словом для обозначения чего-либо. Ну что не
поняли? Показываю:
|
стандартный спрайт : спрайт с измененной
гаммой |
Как это
делатся. Динамически создается новый спрайт с подложкой
нужного цвета (фон) и на него накладывается с использованием
Альфа смешения наш спрайт. Чем больше величина Альфа, тем
больше будет "проявляться" фон, соответственно, если "фон"
белый - спрайт будет осветляться. Что касается
TransparentColor - если фоновый цвет спрайта будет отличаться
от "подложки" создаваемого спрайта, то придется подумать как
определить новый TransparentColor. Можно конечно заранее его
просчитать и использовать, а можно просчитать динамически,
взяв, например, цвет фоновой точки (посмотрите координаты
какой нибудь из них в редакторе) в полученном
спрайте.
Посмотрим на примере. Эта процедурка
реализует алгоритм описанный выше.
procedure Tform1.createmmap(Color:Tcolor;alpha:byte);
var
NG : TDIB;
Item: TPictureCollectionItem;
tm:Tdirectdrawsurface;
i:integer;
est:boolean; //Присутствует ли уже измененная картика в списке
TC:TColor; //TransparentColor
begin
ng:=tdib.Create; //Создаем картинку (пустую)
tm:=Tdirectdrawsurface.Create(DXDraw.Surface.DDraw); //Создаем поверхность
tm.SystemMemory:=false;
tm.SetSize(il.Items[0].Width,il.Items[0].height); //Устанавливаем размер поверхности по размеру исходной картинки
tm.Fill(color); //Заполняем фон нужным цветом
il.Items[0].DrawAlpha(tm,bounds(0,0,il.Items[0].width,il.Items[0].height),0,alpha); //Рисуем исходную картинку на фон с прозрачностью
tm.AssignTo(ng); //Сохраняем изображение в картинку (создана первой строкой)
tm.Free; //Очищаем память от поверхности
TC:=ng.Canvas.Pixels[0,0]; //Возьмем цвет точки 0,0 в качестве TransparentColor для нового спрайта
est:=false; //Ставим на нет, то что картинка уже есть в списке
for i:=0 to il.Items.Count-1 do //Если же она есть
if il.Items[i].Name='MMG' then est:=true; //ТО Ставим на Да
if est then //Если ДА то
begin //Изменяем уже существующую картинку
item:=il.Items.Find('MMG');
item.Picture.Graphic := ng;
item.TransparentColor:=TC;
item.Transparent:=true;
item.Restore;
end
else
begin //Если же Нет, то заносим в список новую!
Item := TPictureCollectionItem.Create(IL.Items);
Item.Name:='MMG';
Item.SystemMemory:=false;
Item.Picture.Graphic := ng;
Item.TransparentColor:=TC;
Item.Transparent:=true;
Item.Restore;
end;
end;
Вот и все. Возмите этот готовый примерчик.
|