![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Фонарь [Delphi]
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]доберусь до делфи, кину рабочий пример