Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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.04 c
2-1196107164
cyber
2007-11-26 22:59
2007.12.23
Проблема с DBGid


1-1190854398
FearG0
2007-09-27 04:53
2007.12.23
Адреса функций в памяти


15-1195568496
Черный Шаман
2007-11-20 17:21
2007.12.23
За что садить программиста, если он всего лишь писал ПО?


2-1196232702
roughneck
2007-11-28 09:51
2007.12.23
Окна всегда поверх всех окон


3-1187087591
ari_9
2007-08-14 14:33
2007.12.23
зависимые ListSource для Lookup компонент. как лучше ? (+)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский