Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.12.23;
Скачать: 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 вся ветка

Текущий архив: 2007.12.23;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.017 c
15-1195808646
Ega23
2007-11-23 12:04
2007.12.23
Где сейчас можно купиь 5 лицензий на


2-1196088119
Ivolg
2007-11-26 17:41
2007.12.23
Отправка файлов через сокеты


15-1195580908
master_asasin
2007-11-20 20:48
2007.12.23
Конференция


15-1195867805
SerJaNT
2007-11-24 04:30
2007.12.23
Помогите составить SQL-запрос


15-1195985196
Kostafey
2007-11-25 13:06
2007.12.23
С днем рождения ! 25 ноября