Главная страница
    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.044 c
15-1195624129
GhosTer
2007-11-21 08:48
2007.12.23
Вопрос туп до невозможности, но все таки помогите.


2-1196243768
tytus
2007-11-28 12:56
2007.12.23
Как переделать запрос, чтобы вывелось то чего нету?


3-1187693683
barakuda
2007-08-21 14:54
2007.12.23
update table


1-1191421712
ggg
2007-10-03 18:28
2007.12.23
Недостаточно памяти для обработки команды.


15-1193445356
Живописец
2007-10-27 04:35
2007.12.23
У кого нибудь есть пример реализации рисования кистью на битмэпе?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский