Форум: "Media";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];
ВнизБлокировка поверхности Найти похожие ветки
← →
parovoZZ © (2004-08-15 01:48) [0]Допустим, я хочу узнать цвет определённого пикселя на поверхности. Делаю сабж и попадаю в место, определённое цветовым ключом как прозрачное. Какой цвет я получу?
← →
cyborg © (2004-08-15 08:44) [1]Тот, который цветовой ключ.
← →
parovoZZ © (2004-08-15 09:34) [2]ихгым, спасибо
← →
parovoZZ © (2004-08-15 12:17) [3]Не пойму, что здесь не так. Цвета - 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;
← →
cyborg © (2004-08-15 14:58) [4]Вот, вроде работает :), моя функция получения цвета пикселя (Фрипаскаль):
//Функция получения цвета точки
//Значения 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 20:09) [5]Мда, у меня от этих сдвигов голова уже сдвинулась.
← →
cyborg © (2004-08-16 08:30) [6]:)
в общем тебе вот это нужно
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 только свои подставь.
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.037 c