Bitmaps bit a bit Hola mi problema es que quiero conseguir la matriz RGB de los mapas de bits, pero aun soy un poco novato, me gustaría poder hacer una especie de deteccion de colisiones pixel a pixel para mis videojuegos, pero no consigue averiguar como fuciona (siempre hay errores^^), creo que el problema esta en el createdibsection
pero mejor me ayudais vosotros^^.Este es el código que he hecho:
#include <Windows.h>
//Prototipo
LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);
//Variables globales
int x = 0;
int y = 0;
int AnchoVentana;
int AlturaVentana;
HDC hDCAux;
HBITMAP g_Bitmap;
//Funciones auxiliares
bool CrearVentana(HINSTANCE hInstancia, HWND& hVentana, UINT Ancho, UINT Altura, LPCWSTR ClaseVentana, LPCWSTR TituloVentana, int& nCmdShow);
void Inicializar(HWND hVentana);
bool bitmap(HDC hDC);
int WINAPI wWinMain(HINSTANCE hInstancia, HINSTANCE hInstaciaPrev, LPWSTR lpszCmdParam, int nCmdShow )
{
HWND hVentana;
MSG Mensaje;
CrearVentana(hInstancia, hVentana, 500, 500,L"Mi Ventana", L"Practica 1", nCmdShow);
while(TRUE == GetMessage(&Mensaje, 0, 0, 0))
{
if (PeekMessage(&Mensaje, NULL, 0, 0, PM_REMOVE) )
{
if (Mensaje.message == WM_QUIT)
break;
TranslateMessage(&Mensaje);
DispatchMessage(&Mensaje);
}
else
{
HDC hDCPant = GetDC(hVentana);
bitmap(hDCPant);
BitBlt(hDCPant, 0, 0, AnchoVentana, AlturaVentana, hDCAux, 0, 0, SRCCOPY);
ReleaseDC(hVentana, hDCPant);
Controles();
}
}
return Mensaje.wParam;
}
bool CrearVentana(HINSTANCE hInstancia, HWND& hVentana, UINT Ancho, UINT Altura, LPCWSTR ClassName, LPCWSTR WindowName, int& nCmdShow)
{
WNDCLASSEX ClaseVentana;
ClaseVentana.hInstance = hInstancia;
ClaseVentana.lpszClassName = ClassName;
ClaseVentana.lpfnWndProc = WindowProcedure;
ClaseVentana.style = CS_HREDRAW || CS_VREDRAW;
ClaseVentana.cbSize = sizeof(WNDCLASSEX);
ClaseVentana.hIcon = LoadIcon(NULL, IDI_APPLICATION);
ClaseVentana.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
ClaseVentana.hCursor = LoadCursor(NULL, IDC_ARROW);
ClaseVentana.lpszMenuName = NULL;
ClaseVentana.cbClsExtra = 0;
ClaseVentana.cbWndExtra = 0;
ClaseVentana.hbrBackground = (HBRUSH)(COLOR_BACKGROUND + 1);
if (!RegisterClassEx(&ClaseVentana))return false;
if (ClaseVentana.lpszMenuName != NULL)
AlturaVentana += GetSystemMetrics(SM_CYMENU);
AnchoVentana = Ancho + GetSystemMetrics(SM_CXFIXEDFRAME)*2;
AlturaVentana = Altura + GetSystemMetrics(SM_CYFIXEDFRAME)*2;
int X = (GetSystemMetrics(SM_CXSCREEN) - AnchoVentana) / 2;
int Y = (GetSystemMetrics(SM_CYSCREEN) - AlturaVentana) / 2;
hVentana = CreateWindowEx(0,
ClassName,
WindowName,
WS_POPUPWINDOW | WS_CAPTION | WS_MINIMIZEBOX,
X, Y,
AnchoVentana, AlturaVentana,
NULL,
NULL,
hInstancia,
NULL);
if(!hVentana)
return false;
ShowWindow(hVentana, nCmdShow);
UpdateWindow(hVentana);
return true;
}
LRESULT CALLBACK WindowProcedure(HWND hVentana, UINT Mensaje, WPARAM wParam, LPARAM lParam)
{
switch(Mensaje)
{
case WM_CREATE:
Inicializar(hVentana);
break;
case WM_DESTROY:
DeleteObject(hDCAux);
DeleteObject(g_Bitmap);
PostQuitMessage(0);
break;
case WM_PAINT:
HDC hDC;
PAINTSTRUCT ps;
hDC = BeginPaint(hVentana, &ps);
EndPaint(hVentana, &ps);
break;
}
return DefWindowProc(hVentana, Mensaje, wParam, lParam);
}
void Inicializar(HWND hVentana)
{
HDC hDC;
hDC = GetDC(hVentana);
hDCAux = CreateCompatibleDC(hDC);
g_Bitmap = CreateCompatibleBitmap(hDC, AnchoVentana, AlturaVentana);
SelectObject(hDCAux, g_Bitmap);
DeleteObject(hDC);
}
bool bitmap(HDC hDC)
{
BITMAPINFOHEADER bmiHeader;
RGBQUAD nColores[256];
//Lectura del archivo, crea el handle al archivo
HANDLE hFile = CreateFile(L"ladron.bmp",
GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(hFile == INVALID_HANDLE_VALUE)
return false;
BITMAPFILEHEADER bmfHeader;//Bufer de la cabecera del archivo
DWORD dwBytesRead;
//Leer la cabecera del archivo del Bitmap
BOOL bOK = ReadFile(hFile,
&bmfHeader, sizeof(BITMAPFILEHEADER),
&dwBytesRead, NULL);
if ( (!bOK) || (dwBytesRead != sizeof(BITMAPFILEHEADER) ) || (bmfHeader.bfType != 0x4D42) )
{
CloseHandle(hFile);
return false;
}
BITMAPINFO* pBitmapInfo = (new BITMAPINFO);//Buffer de la información de la cabecera
if(pBitmapInfo != NULL)
{ //Lee la cabecera de informacion del Bitmap.
bOK = ReadFile(hFile, pBitmapInfo, sizeof(BITMAPINFOHEADER),
&dwBytesRead, NULL);
if ( (!bOK) || (dwBytesRead != sizeof(BITMAPINFOHEADER) ) )
{
CloseHandle(hFile);
return false;
}
if(pBitmapInfo->bmiHeader.biSize != sizeof(BITMAPINFOHEADER))
SetFilePointer(hFile, pBitmapInfo->bmiHeader.biSize - sizeof(BITMAPINFOHEADER),
NULL, FILE_CURRENT);
//Leer la informacion del color del Bitmap
bOK = ReadFile(hFile, nColores,
pBitmapInfo->bmiHeader.biHeight * pBitmapInfo->bmiHeader.biWidth * sizeof(RGBQUAD),
&dwBytesRead, NULL);
PBYTE pBitmapBits;
HBITMAP handleBitmap;
handleBitmap = CreateDIBSection(hDC,
pBitmapInfo, DIB_RGB_COLORS,
(PVOID*)&pBitmapBits, NULL, 0);
LPBYTE lpBits = (LPBYTE) GlobalAlloc(GMEM_FIXED, pBitmapInfo->bmiHeader.biSizeImage);
GetDIBits(hDC, handleBitmap, 0, (WORD)pBitmapInfo->bmiHeader.biHeight, lpBits, pBitmapInfo, DIB_RGB_COLORS);
if ( (handleBitmap != NULL) && (pBitmapBits != NULL) )
{
//Coloca el puntero al inicio del archivo
SetFilePointer(hFile, bmfHeader.bfOffBits, NULL, FILE_BEGIN);
//Aquí se lee el archivo y se copian los bytes
//en pCBmpBits
bool bOk = ReadFile(hFile, pBitmapBits,
pBitmapInfo->bmiHeader.biSizeImage, &dwBytesRead, NULL);
if (bOk)
{
return true;
}
}
}
}
-Seguramente habrá muchas cosas mal , espero vuestra ayuda para sacar la matriz RGB y como leerla, para hacer comparaciones entre dos mapas de bits. |