Форум: "Игры";
Текущий архив: 2007.12.23;
Скачать: [xml.tar.bz2];
ВнизАлгоритм отрисовки тайлов методом альфа-блендинга Найти похожие ветки
← →
Ярослав Ерёменко (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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.045 c