Вниз
Скачать: CL | DM;

Алгоритм отрисовки тайлов методом альфа-блендинга   Найти похожие ветки 

 
Ярослав Ерёменко   (2006-11-20 13:30) [0]

Здравствуйте, господа.

В работе над небольшой игрой возник у меня вопрос по отрисовке тайлов. Точнее сказать -- не по отрисовке, а по алгоритму "генерации" переходных тайлов.

Делать это я пытаюсь методом альфа-блендинга. Подробности об этом методе можете прочитать в этой статье: http://mirgames.ru/article/gamedev/aigame.html.

Алгоритм я составил, но реализовать у меня его никак не получается. Приведу здесь описание основного класса карты и кода, существующего на текущий момент:

//--------------------------------------------------------------------------------
type
 TTile = record
   // прозрачность углов, 1 лево-верх, 2 право-верх, 3 право-низ, 4 лево-низ
   Darkness: Integer;
   Alpha: array[1..4] of Integer;
   ImageIndex: Integer; // индекс картинки тайла
   X, Y: Integer; // где находится
 end;

//--------------------------------------------------------------------------------
 TPlane = record
   Planes: array[0..128, 0..128] of TTile;
 end;

//--------------------------------------------------------------------------------
 TMap = class
 public
   // слои, 1 трава, 2 песок, 3 земля, 4 горы, 5 вода, 6 объекты
   Layers: array[1..6] of TPlane;

   // кол/во клеток по ширине и высоте, пока не используется т.к.
   // размеры фиксированы
   MapWidth, MapHeight: Integer;
 end;

//--------------------------------------------------------------------------------
procedure TMap.Prepare;
var
 i, j, k, l: Integer;
 B1, B2, B3, B4: Integer;
begin
 // рассчитываем прозрачность для каждый вершины первого слоя
 for i := 1 to MapWidth do
 for j := 1 to MapHeight do
 begin
   // если данная вершина слева сверху окружена водой, тогда В1 присваивается 0
   if Layers[1].Planes[i - 1, j - 1].ImageIndex = 1 then B1 := 0
   // если любым другим типом поверхности то 255
   else B1 := 255;
   // если данная вершина справа сверху окружена водой, тогда В2 присваивается 0
   if Layers[1].Planes[i, j - 1].ImageIndex = 1 then B2 := 0
   // если любым другим типом поверхности то 255
   else B2 := 255;
   // если данная вершина справа снизу окружена водой, тогда В3 присваивается 0
   if Layers[1].Planes[i, j].ImageIndex = 1 then B3 := 0
   // если любым другим типом поверхности то 255
   else B3 := 255;
   // если данная вершина слева снизу окружена водой, тогда В4 присваивается 0
   if Layers[1].Planes[i - 1, j].ImageIndex = 1 then B4 := 0
   // если любым другим типом поверхности то 255
   else B4 := 255;
   // теперь подсчитываем значение Alpha для данной вершины
   if (B1 = 0) and (B2 = 0) and (B3 = 0) and (B4 = 0) then
     Layers[1].Planes[i, j].Alpha[1] := 255
   else
     Layers[1].Planes[i, j].Alpha[1] := Round((B1 + B2 + B3 + B4) div 4);

   end;
end;


Спасибо!


 
Ярослав Ерёменко   (2006-11-20 20:30) [1]

U


 
Ярослав Ерёменко   (2006-11-20 20:57) [2]

Неужели никто не может помочь? Мне казалось, что для вас это будет просто. :)))


 
megabyte-ceercop ©   (2006-11-28 07:39) [3]

>Алгоритм я составил, но реализовать у меня его никак не получается.

Это как так? : )

Расчитываешь альфу для углов, а как применить это при отрисовке на экран незнаешь? В этом проблема, или в чем?

А чем ты рисуешь? DX3D? GDI?

Если DX преобразовывай интегер своей альфы в значениу float от 0.0 до 1.0 и подставляй в альфу вершин. Если попиксельно отрисовываешь на канвасе - интерполируй линейно и смешивай вершины из двук битмапов.

Давай конкретнее, в чем проблема?



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: -0.986 c
15-1195157054
palva
2007-11-15 23:04
2007.12.23
Тут недавно спрашивали, как шифроваться в аське


2-1195710167
Costy
2007-11-22 08:42
2007.12.23
Ускорения tClientSocket (tserverSocket)


2-1196577450
Новый
2007-12-02 09:37
2007.12.23
Как программно можно проверть, существуеть ли таблиц в Оракле


3-1182843398
DelphiN!
2007-06-26 11:36
2007.12.23
Округление даты-время в дату в SQL


11-1182011558
St33l
2007-06-16 20:32
2007.12.23
ExptIntf.dcu not found




   Наверх