Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> примитивный рендер графики, вывод графики с частотой 60гц 
:(
    Опции темы
СЭНСЭЙ
Дата 15.5.2016, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



Привет всем.

Использую в своих проектах такой метод наложения спрайта на канву с возможностью
затенять кустомный цвет, создавая эффект теней.
В данной теме момент с тенями не важен.
Код

procedure copybmpwithshadows(clshad1,clshad2,trans:Tcolor;dx,dy:integer; var dest,src:tbitmap);
var
tdest,otemp:tbitmap;
p:PByteArray;
pcs,pct:PRGBArray;
tc:tcolor;
i,j,x,y,r,g,b,f:integer;
itc1,itc2,itct:longint;
r81,g81,b81,r82,g82,b82,r8t,g8t,b8t:byte;
begin
//создаются два временных мепа размером с источник
tdest:=tbitmap.Create;
tdest.Width:=src.width;
tdest.Height:=src.height;
otemp:=tbitmap.Create;
otemp.Width:=tdest.Width;
otemp.Height:=tdest.height;
bitblt(tdest.Canvas.Handle,0,0,tdest.Width,tdest.Height,dest.Canvas.Handle,0,0,srccopy);
bitblt(otemp.Canvas.Handle,0,0,otemp.Width,otemp.Height,src.Canvas.Handle,0,0,srccopy);
otemp.PixelFormat:=pf24bit;
tdest.PixelFormat:=pf24bit;

//            R   G   B
//clAqua:     0   255 255
//clFuchsia:  255 0   255
//$00FF96FF:  255 150 255
  if clshad1<>0 then
  begin
  itc1 := ColorToRGB(clshad1);
  r81     := itc1;
  g81     := itc1 shr 8;
  b81     := itc1 shr 16;
  end;

  if clshad2<>0 then
  begin
  itc2 := ColorToRGB(clshad2);
  r82     := itc2;
  g82     := itc2 shr 8;
  b82     := itc2 shr 16;
  end;

  itct := ColorToRGB(trans);
  r8t     := itct;
  g8t     := itct shr 8;
  b8t     := itct shr 16;


for y:=0 to otemp.Height-1 do
begin
pcs:=otemp.ScanLine[y];
pct:=tdest.ScanLine[y];

for x:=0 to otemp.Width-1 do
begin
if clshad1<> 0 then if ((pcs[x].rgbtRed=r81) and (pcs[x].rgbtGreen=g81) and (pcs[x].rgbtBlue=b81)) then
begin
r:=pct[x].rgbtRed-20;if r<0 then r:=0;pcs[x].rgbtRed:=r;
g:=pct[x].rgbtGreen-20;if g<0 then g:=0;pcs[x].rgbtGreen:=g;
b:=pct[x].rgbtBlue-20;if b<0 then b:=0;pcs[x].rgbtBlue:=b;
end;
if clshad2<> 0 then if ((pcs[x].rgbtRed=r82) and (pcs[x].rgbtGreen=g82) and (pcs[x].rgbtBlue=b82)) then
begin
r:=pct[x].rgbtRed-40;if r<0 then r:=0;pcs[x].rgbtRed:=r;
g:=pct[x].rgbtGreen-40;if g<0 then g:=0;pcs[x].rgbtGreen:=g;
b:=pct[x].rgbtBlue-40;if b<0 then b:=0;pcs[x].rgbtBlue:=b;
end;
if ((pcs[x].rgbtRed=r8t) and (pcs[x].rgbtGreen=g8t) and (pcs[x].rgbtBlue=b8t)) then
begin
pcs[x].rgbtRed:=pct[x].rgbtRed;
pcs[x].rgbtGreen:=pct[x].rgbtGreen;
pcs[x].rgbtBlue:=pct[x].rgbtBlue;
end;
end;

end;

//otemp.Transparent:=true;
//otemp.TransparentColor:=clAqua;
//dest.Canvas.Draw(dx,dy,otemp);
bitblt(dest.Canvas.Handle,dx,dy,otemp.Width,otemp.Height,otemp.Canvas.Handle,0,0,srccopy);

otemp.Free;
tdest.Free;

end;


Для не быстрого вывода графики 3-4 гц более чем подходит.
Плюс в том, что не требует ни софта стороннего, ни железа.
Работает с любой версией виндовс.
Но для анимации 60 гц кажется не очень подходит.
Я не проверял сильно. Но есть подозрения что не выдержит частоту если будет много спрайтов.

Подскажите как можно оптимизировать эту функцию, или подскажите альтернативу.
Но для меня важно что бы остался тот же принцип - не использовать никакие библиотеки типа директ икса  или опенжл. И наибольшая совместимость с ОСями и железом.
Возможно ли это?
PM MAIL   Вверх
fr0und
Дата 17.5.2016, 20:09 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











http://www.polyotnn.ru/
ООО "Концерн "Объединенные Заводы Полет"
Предлагаем услуги по выполнению заказов:
- Точная металлообработка (обработка металлов резанием, листовая штамповка); 
- Литье пластмасс; 
- Литье алюминиевых сплавов; 
- Окраска порошковой краской в электростатическом поле; 
- Проектирование и изготовление штампов, прессформ и другой технологической оснастки; 
- Изготовление нестандартного оборудования; 
- Гальванопокрытия;
- Сборочное производство.

Этот ответ добавлен с нового Винграда - http://vingrad.com
  Вверх
frostliner
Дата 18.5.2016, 21:09 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered












http://pxyz.ru/
ПРОКОМ                                        
Армейские кровати соответствуют ГОСТ 2056-77.
Комплектация армейских кроватей позволяет устанавливать их как одну двухъярусную или две одноярусных кровати.
ПРОДАЕМ РАСКЛАДУШКИ, СТУЛЬЯ И ТУМБОЧКИ
ПРОДАЕМ ПОСТЕЛЬНЫЕ КОМПЛЕКТЫ ДЛЯ РАБОЧИХ СТРОИТЕЛЕЙ
ПРОДАЕМ ВАТНЫЕ МАТРАЦЫ
СНАБЖАЕМ МЕТАЛЛИЧЕСКИМИ КРОВАТЯМИ И ПОСТЕЛЬНЫМИ ПРИНАДЛЕЖНОСТЯМИ РАБОЧИХ СТРОИТЕЛЬНЫХ, ОХРАННЫХ И ДРУГИХ ПРЕДПРИЯТИЙ, РАБОТАЮЩИХ ВАХТОВЫМ МЕТОДОМ.
Работаем с юридическими  лицами с учетом НДС.

Этот ответ добавлен с нового Винграда - http://vingrad.com
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.1199 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.