![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Блокировка поверхности [D7, Win95/98, Win2k, WinXP]
parovoZZ © (2004-08-15 01:48:00)Допустим, я хочу узнать цвет определённого пикселя на поверхности. Делаю сабж и попадаю в место, определённое цветовым ключом как прозрачное. Какой цвет я получу?
cyborg (2004-08-16 08:30:00) [1]:)
в общем тебе вот это нужно
PixSize:=(ddsd.ddpfPixelFormat.dwRGBBitCount shr 3);
//Читаем цвет и сдвигаем вправо (SHR) на нужное кол-во бит:
Color:=(Cardinal(Pointer(Cardinal(ddsd.lpSurface)+((ddsd.lPitch*Y)+(X*PixSize-2)))^)) shr (32 - ddsd.ddpfPixelFormat.dwRGBBitCount);
X,Y только свои подставь.
parovoZZ (2004-08-15 20:09:00) [2]Мда, у меня от этих сдвигов голова уже сдвинулась.
cyborg (2004-08-15 14:58:00) [3]Вот, вроде работает :), моя функция получения цвета пикселя (Фрипаскаль):
//Функция получения цвета точки
//Значения X,Y исчисляются с нуля (0,0 - для левого верхнего пикселя картинки)
//Для всех форматов пикселя поверхности (8, 16, 24, 32 бит):
Function GetColorXY(Var Surface : IDirectDrawSurface7; X,Y : Longint) : Cardinal;
Var
Color : Cardinal;
ddsd : TDDSurfaceDesc2;
hRes : HRESULT;
PixSize : Longint;
begin
Color:=$00000000;
ddsd.dwSize := SizeOf(ddsd);
//Запираем поверхность
//ddsd.lpSurface указывает на начало данных
//ddsd.lPitch хранит реальную ширину поверхности
hRes := Surface^^.Lock(Surface, nil, ddsd, 0, 0);
if DD_OK = hRes then
begin
//Если координаты не выходят за пределы поверхности:
if (X>=0) and (Y>=0) and (X<=ddsd.lPitch) and (Y<=ddsd.dwHeight) then
Begin
PixSize:=(ddsd.ddpfPixelFormat.dwRGBBitCount shr 3);
//Читаем цвет и сдвигаем вправо (SHR) на нужное кол-во бит:
Color:=(Cardinal(Pointer(Cardinal(ddsd.lpSurface)+((ddsd.lPitch*Y)+(X*PixSize-2)))^)) shr (32 - ddsd.ddpfPixelFormat.dwRGBBitCount);
end;
Surface^^.Unlock(Surface, nil);
end;
Result:=Color;
end;
Под Дельфи для своих нужд в цикле сам перепиши .
parovoZZ (2004-08-15 12:17:00) [4]Не пойму, что здесь не так. Цвета - 16 бит. Но даже при 32 битах не работает (при смещениях 8).
function BoomParticle (Width, Height : byte; X, Y, speed : single; iDDSurface : IDirectDrawSurface7) : hResult;
var
i, j : word;
desc : TDDSURFACEDESC2;
hRet : hResult;
Pixel : Byte;
BEGIN
ZeroMemory (@desc, SizeOf (desc));
desc.dwSize := SizeOf (desc);
hRet := iDDSurface.Lock(nil, desc, DDLOCK_WAIT, 0);
if hRet <> DD_OK then
begin
result := hRet ;
exit;
end;
for i := 0 to Width do
for j := 0 to Height do
begin
Pixel := PByte (Integer (desc.lpSurface) + j * desc.lPitch + i * (BitDepth div 8))^;
if Pixel > 0 then
begin
Quantity := Quantity + 1;
SetLength (Particles, Quantity);
Particles [Quantity - 1].B := Pixel;// and $1F;
Particles [Quantity - 1].G := (Pixel shr 5);// and $3F;
Particles [Quantity - 1].R := (Pixel shr 11);// and $1F;
Particles [Quantity - 1].X := X + i;
Particles [Quantity - 1].Y := Y - j;
Particles [Quantity - 1].Angle := random * 2 * Pi; //arccos ((i - X) / (j + Y));
Particles [Quantity - 1].Speed := random * Speed;
Particles [Quantity - 1].Time := Random (150) + 150;
Particles [Quantity - 1].variable := false;
end;
end;
hRet := iDDSurface.Unlock (nil);
result := hRet;
END;
parovoZZ (2004-08-15 09:34:00) [5]ихгым, спасибо
cyborg (2004-08-15 08:44:00) [6]Тот, который цветовой ключ.