Меню сайта
Форма входа

Категории раздела
Уроки по созданию игр [38]
Программирование игр разной сложности
Игровые алгоритмы [24]
Алгоритмы, которые уже реализованы для разных жанров игр
Графика [5]
Учимся работать с графикой в Делфи
Мультимедиа [3]
Работа с мультимедийными возможностями Делфи
Другие статьи [18]
Статьи не вошедшие не в один из разделов
Ошибки [4]
Всевозможные ошибки и пути их решения
Четверг, 16.05.2024, 10:36
Приветствую Вас Гость

Статьи по программированию

Главная » Статьи » Графика

Прорисовка Bitmap с маской изображения.
Прорисовка Bitmap с маской изображения.

Эта статья, посвящена работе над ошибкой, вызванной работой с TBitmap. Начну, пожалуй, с задач, которые ставились передо мной в ходе работы. Она будет полезна как при создании переходов текстур в играх, так и при прорисовке Bitmap  с маской изображения.

Мне необходимо было в редакторе карт, который я создаю сделать неровные переходы между текстурами. Выход я нашел следующий. Сначала загружаю в один Bitmap монотонную картинку текстур (желтую, красную, синюю и т.д.). Затем загружаю в другой TBitmap черно-белую картинку, которая является маской для текстур. Черным цветом выделена область, которая не должна рисоваться, а белым выделена область самого неровного перехода.

Тоесть налаживая маску поверх самогой текстуры, при этом делая прозрачным белый цвет. Мы получим переход нужной текстуры, но с черным фоном вокруг. Теперь останется только рисовать данные переходы, но уже с прозрачным черным цветом.

Но каково было мое удивление, когда у меня рисовалась только черно белая маска, а не сама текстура. Я попробывал рисовать только текстуру, но не рисовалось ничего. Тогда пришлось прибегать к другим методам прорисовки картинок, а не стандартый Canvas.draw. Ни один из рассмотренных мною методов результатов не дали. Правда я не стал принципиально прибегать к DirectX и OpenGL. Не хочу использовать дополнительные бибилиотеки.

Затем я посчитал, что ошибка TBitmap вызвана проблемами с TransparentColor и Transparent  в общем. Путем научного тыка - я не добился никаких положительных результатов.

Методом создания и проверки собственных теорий по поводу вызванной ошибки я предположил, что возможно ошибка заключается именно в монотонности цвета. Вся картинка текстуры была залита одним цветом без оттенков. И когда я добавил просто точечки на текстуры другого цвета. Bitmap начала отлично прорисовываться. Но прорисовывалась только для нулевой текстуры, которая вообще не должна иметь переходов

Вот мой код:


Img:=TBitmap.Create; //dlya vremennogo hraneniya
Img2:=TBitmap.Create;

      for g:=0 to m-1 do
      for i:=1 to n do
      for j:=1 to 8 do
      begin
      Graf.PerIMG[g,i,j]:=TBitmap.Create;
      Graf.PerIMG[g,i,j].Width:=32;
      Graf.PerIMG[g,i,j].Height:=32;

Img.LoadFromFile(Opt.Path+'\'+form1.edit4.Text+'\0\'+inttostr(g)+'.bmp');
      Img2.LoadFromFile(Opt.Path+'\'+form1.edit4.Text+'\p\'+inttostr(i)+inttostr(j)+'.bmp');

Graf.PerIMG[g,i,j].Canvas.Draw(0,0,IMG);
      end;




После долгих раздумий я нашел ошибку. Она была не связана с тем, что Я неправильно расставлял и загружал переходы И когда я добавил прозрачности и в маску и в итогое изображение, то Bitmap и маска изображения начали отлично прорисовываться.

Исправленный код:



Img:=TBitmap.Create;  //tekstura
Img2:=TBitmap.Create; //maska

      //tekstura
      for g:=0 to m-1 do
      //n perehoda
      for i:=1 to n do
      //povorot
      for j:=1 to 8 do
      begin
      Graf.PerIMG[g,i,j]:=TBitmap.Create;

Img.LoadFromFile(Opt.Path+'\'+form1.edit4.Text+'\0\'+inttostr(g)+'.bmp');
Img2.LoadFromFile(Opt.Path+'\'+form1.edit4.Text+'\p\'+inttostr(i)+inttostr(j)+'.bmp');
      img2.TransparentColor:=clwhite;
      img2.Transparent:=True;

      Graf.PerIMG[g,i,j].Canvas.Draw(0,0,IMG);
      Graf.PerIMG[g,i,j].Canvas.Draw(0,0,IMG2);
      Graf.PerIMG[g,i,j].TransparentColor:=clBlack;
      Graf.PerIMG[g,i,j].Transparent:=True;

      end;


Я нарисовал на все 8 сторон по 4 варианта перехода. И с помощью данного алгоритма мне не прийдется рисовать для 8 текстур 4 варианта по 8 поворотов. Вместо 184 картинок переходов я нарисовал лишь 24 маски переходов и получился тот же эффект. Всем новичкам не работающим с дополнительными графическими бибилиотеками советую использовать данный метод прорисовки TBitmap и маски изображения для разработки игр и других мультимедийных приложений.


Источник: delgame.at.ua
Категория: Графика | Добавил: Armageddets (04.08.2013)
Просмотров: 2010 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Наш опрос
Оцените мой сайт
Всего ответов: 103
Мини-чат
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0