Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Фонарь [Delphi]


Страницы:   1 2

DM_A ©   (2004-02-29 15:35:00) 

Я хочу сделать полностью чёрную Image1. Только при направлении на неё мышью в некоем радиусе она будет светлой.Помогите пожалуйста.


lyeh   (2004-03-12 00:27:00) [1]

2 Vertex
>> лучше фэстдиба не сделаем
Да


WebErr   (2004-03-11 18:55:00) [2]

Народ! Делайте всё через SetDIBitsToDevice - ни тормозов, ни проблем с получением адресов точек! :))))


Vertex   (2004-03-11 04:08:00) [3]

2lyeh ступил написал альфу виноват
     буфер не создавал не суть важно я хотел идею объяснить
     то что быстрее прочитать указатели заранее - факт, не оспоришь, тем более это не моя идея (в каком то примере видел)
     и опять же вернусь к fastdib, бесполезные споры на тему сканлайн и пикселс - лучше фэстдиба не сделаем.


lyeh   (2004-03-10 00:33:00) [4]

2 ka3ax
Да, можно и заранее создавать буфер, а при выходе его освобождать, но скорость явно не увеличится... В DelphiX, например, все спрайты есть классы, а значит создаются и освождаются подобно битмэпам или кнопкам... Другое дело, если бы мы каждый раз при прорисовке создавали буфер и по-новой загружали в него бэкграунд из файла :)


ka3ax   (2004-03-09 08:07:00) [5]

+
я явно торможу.
Про замечание на счет TImage - забудьте, еще раз просмотрел код, все увидел.
Замечание про буфер (создание/освобождение) по-прежнему в силе.


ka3ax   (2004-03-09 07:32:00) [6]

2 lyeh
:) сорри
Не надо, конечно, за комп нетрезвым садиться :)
Больше не буду.
пример [28] тогда не смотрел, посмотрел [31]
Сейчас посмотрел - все правильно. Единственое замечание - буфер не создавать/разрушать каждый раз при перемещении фонаря. Создать при создании формы, освободить - при разрушении.
К тому же использовать TImage в данном случае - неоправданно. На сколько я знаю, у TImage есть свой буфер, то есть при копировании Вашего буфера на TImage он сначала будет скопирован в буфер TImage, а затем на экран. Лишнее время и память. Лучше использовать TPaintBox.


lyeh   (2004-03-09 00:26:00) [7]

2 pianiiKa3ax
1) Сначала научись по-русски выражаться :)
2) Ты мой пример [28] просмотри, скомпилируй - ничего не мерцает, скорость хорошая, и код небольшой. Если ты там не увидел буфера, это твои проблемы...


pianiiKa3ax   (2004-03-08 17:25:00) [8]

Фсех девушек с 8 марта.
2lyeh. Я пра паследний пример. А чо, сначала в буфер никак нельзя рисовать? Он (вертекс) по-моему ето и имел ввиду. Попробуй отрисовать эдак хотябы 5 пять линий сразу на екран, ет типа даж гдиишными LineTo. Чо мерцать думашь не будет?
2вертекс все верно, что угодно, НО сначала рисуй в буфер. И скорость BitBlt осуждать - совершенно несостоятельно - вполне приемлемая скорость, если вы не стремитесь к хз каким фпс


lyeh   (2004-03-08 07:01:00) [9]

2 Vertex
Посмотрел я вот на твой пример, и заметил несколько назначительных недостатков :)

1) Все рисуется Alpha'ой а не Add'ом - так фонарь не получится
2) Слишком много заранее определленных переменных - и все для того, чтобы лишний раз пикселы не просчитывать?
3) Все ужасно мерцает
4) Скорость "супер"!


Vertex   (2004-03-08 02:27:00) [10]


type
...

 TRGBColor = record
   r,g,b:^Byte;
 end;

 PBytes = ^TBytes;
 TBytes = array[0..0] of Byte;

const
 wimage = 256;
 himage = 256;

var
 fmMain: TfmMain;
 bmp:TBitmap;
 pixels:array [0..wimage-1,0..himage-1] of TRGBColor;
 mx,my,t:integer;
implementation

{$R *.DFM}

procedure TfmMain.Glow(_x,_y,_r:integer; _c:TColor);
var x,y,cr,cg,cb,x1,y1,x2,y2:integer; r,alpha:real;
begin
 cr:=GetRValue(_c);
 cg:=GetGValue(_c);
 cb:=GetBValue(_c);
//проход ведем только квадрата в который вписана наша окружность glow
 x1:=max(_x-_r,0);
 y1:=max(_y-_r,0);
 x2:=min(_x+_r,wimage-1);
 y2:=min(_y+_r,himage-1);
 for x:=x1 to x2 do
   for y:=y1 to y2 do
   begin
     r:=sqrt(sqr(x-_x)+sqr(y-_y));
//меняем тока те пиксели которые принадлежат окружности
     if r<=_r then
     begin
//вычисляем коэффециент прозрачности
       alpha:=r/_r;
//устанавливаем значение линейной интерполяции
       pixels[x,y].r^:=trunc(alpha*(pixels[x,y].r^)+(1-alpha)*cr);
       pixels[x,y].g^:=trunc(alpha*(pixels[x,y].g^)+(1-alpha)*cg);
       pixels[x,y].b^:=trunc(alpha*(pixels[x,y].b^)+(1-alpha)*cb);
     end;
   end;
end;

procedure TfmMain.FormCreate(Sender: TObject);
var x,y:integer; line:pbytes;
begin
 bmp:=TBitmap.Create;
 bmp.Width:=256;
 bmp.Height:=256;
 bmp.PixelFormat:=pf24bit;

 //отчистить обязательно, видимо массивы пикселей не создаются до первой записи
 for x:=0 to wimage-1 do
   for y:=0 to himage-1 do
   begin
     bmp.Canvas.Pixels[x,y]:=$FFFFFFFF;
   end;

//создадим массив указателей на пиксели, чтобы не терять время на вызов scanline
 for y:=0 to himage-1 do
 begin
   line:=bmp.ScanLine[y];
   for x:=0 to wimage-1 do
   begin
     pixels[x,y].b:=@line[x*3];
     pixels[x,y].g:=@line[x*3+1];
     pixels[x,y].r:=@line[x*3+2];
   end;
 end;
end;

procedure TfmMain.FormDestroy(Sender: TObject);
begin
 bmp.Destroy;
end;

procedure TfmMain.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
begin
//можно отчистить и картинкой
//  bmp.Canvas.Rectangle(0,0,wimage,himage);
 bmp.Canvas.Draw(0,0,Image2.Picture.Bitmap);
 Glow(x,y,50,clRed);
 image1.Canvas.Draw(0,0,bmp);
end;


lyeh   (2004-03-08 02:02:00) [11]

2 JibSkeart ©
>> А что как нибудь просто готовую картинку выводить ?
аля партиции ?


Чего?


JibSkeart   (2004-03-07 12:30:00) [12]

А что как нибудь просто готовую картинку выводить ?
аля партиции ?


lyeh   (2004-03-07 03:10:00) [13]

2 TButton ©
Ну чего ты на Scanline наезжаешь? Вот у него как раз супер скорость

Создай форму, скинь на нее TImage, назови Image1, загрузи в него картинку для бэкграунда размером 256х256, затем кинь TPaintBox с именем PBox - и вот код проги


unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ExtCtrls, StdCtrls, Buttons, Math;

type
 TForm1 = class(TForm)
   Image1: TImage;
   PBox: TPaintBox;
   procedure PBoxMouseMove(Sender: TObject; Shift: TShiftState; X,
     Y: Integer);
   procedure PBoxMouseDown(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   procedure glow(x, y, radius: integer; color: TColor);
       { Public declarations }
 end;
 PBytes = ^TBytes;
 TBytes = array[0..0] of Byte;

var
 Form1: TForm1;
 GlowColor:Tcolor;

implementation

{$R *.dfm}

procedure tform1.glow(x, y, radius: integer; color: TColor);
var
i, j:integer;
d, m: single;
r, g, b: byte;
bmp: Tbitmap;
line:pbytes;
begin
bmp:=tbitmap.Create;
bmp.Width:=Image1.Width;
bmp.Height:=Image1.height;
bmp.PixelFormat:=pf24bit;
bitblt(bmp.Canvas.Handle, 0, 0, bmp.Width, bmp.Height, image1.Canvas.Handle, 0, 0, srccopy);
begin
  for j:=0 to bmp.Height-1 do
  begin
   line:=bmp.ScanLine[j];
   for i:=0 to bmp.Width-1 do
   begin
    d:=SQRT((x-i)*(x-i)+(y-j)*(y-j));
     m:=(radius-d)/radius;
     if m<0 then m:=0;
     r:=Round(GetRValue(color)*m);
     g:=Round(GetGValue(color)*m);
     b:=Round(GetBValue(color)*m);
     line[i*3]:=min(line[i*3]+b, 255);   // синий пиксел
     line[i*3+1]:=min(line[i*3+1]+g, 255);   // зеленый
     line[i*3+2]:=min(line[i*3+2]+r, 255);    // красный
   end;
 end;
end;
bitblt(pbox.Canvas.Handle, 0, 0, pbox.Width, pbox.Height, bmp.Canvas.Handle, 0, 0, srccopy);
bmp.free;
end;

procedure TForm1.PBoxMouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
begin
 Glow(x, y, 64, glowcolor);
end;

procedure TForm1.PBoxMouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
 GlowColor := RGB(random(256),Random(256),Random(256));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Glowcolor:=$FFAABBCC;
end;

end.


Води мышью для еффекта фонаря


TButton   (2004-03-04 22:40:00) [14]

попробовал я qpixels )))))))) нет слов. скорость, такая что аж дурно становится, до сих пор не могу понять как это я без него раньше жил...


MBo   (2004-03-04 17:30:00) [15]

>TButton
Там приводятся и аналоги на Паскале, если ты о статье.


TButton   (2004-03-04 17:28:00) [16]

все понятно... было бы если б я небыл в асме ноль. проще скачать исходник и пользовать в свое удовольствие... но это всеравно не спортивно)


TButton   (2004-03-04 17:19:00) [17]

2 Sapersky ©  
fastdib не интересно
2 MBo ©
статью читал... или по крайней мере собирался... на всяк случай поду по читаю)


Sapersky   (2004-03-04 13:42:00) [18]

А ваще совет попробуйте fastdib

Тем более что там есть процедура Lightmap, которая делает требуемый эффект :)


MBo   (2004-03-04 07:04:00) [19]

>TButton
Все же загляни в статьи ("Поставить точку")


Vertex   (2004-03-04 05:19:00) [20]

доберусь до делфи, кину рабочий пример


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо