Code:
#include <windows.h>
#ifndef defs.h
#include "defs.h"
#endif
HBITMAP ScreenDisplay_Object = NULL;
HBITMAP gBALL = NULL;
HBITMAP gPAD1 = NULL;
HBITMAP gPAD2 = NULL;
const char g_szClassName[] = "myWindowClass";
const int BeginX = -10;
const int BeginY = 0;
const int ID_TIMER = 1;
typedef struct _BALLINFO {
int width;
int height;
int x;
int y;
int dx;
int dy;
}BALLINFO;
BALLINFO BALL_INFO;
BALLINFO PAD_INFO[1];
int CPI = 0;
void Bumprect(RECT* prc) {
if(BALL_INFO.x < 0) {
BALL_INFO.x = 0;
BALL_INFO.dx = BeginX;
if(BALL_INFO.dy < 82)
BALL_INFO.dy+= BeginY;
else
if(BALL_INFO.dy > -82 && BALL_INFO.dy <= 0)
BALL_INFO.dy-=BeginY;
} else
if(BALL_INFO.x + BALL_INFO.width >= prc->right) {
BALL_INFO.x = prc->right - BALL_INFO.width;
BALL_INFO.dx = -BeginX;
}
if(BALL_INFO.y < 0) {
BALL_INFO.y = 0;
BALL_INFO.dy = BeginY;
if(BALL_INFO.dx < 82 && BALL_INFO.dx >= 0)
BALL_INFO.dx+=BeginX;
else
if(BALL_INFO.dx > -82 && BALL_INFO.dy <= 0)
BALL_INFO.dx-=BeginY;
} else
if(BALL_INFO.y + BALL_INFO.height >= prc->bottom) {
BALL_INFO.y = prc->bottom - BALL_INFO.height;
BALL_INFO.dy = -BeginY;
}
}
void BumpPaddle() {
if(BALL_INFO.x < 0) {
if(BALL_INFO.x - BALL_INFO.width <= PAD_INFO[0].x) {
if(BALL_INFO.y + (BALL_INFO.height / 2) <= PAD_INFO[0].y + (PAD_INFO[0].height / 2) && BALL_INFO.y - (BALL_INFO.height / 2) >= PAD_INFO[0].y - (PAD_INFO[0].height / 2))
BALL_INFO.x = PAD_INFO[0].x + BALL_INFO.width;
BALL_INFO.dx = BeginX;
}
}
if(BALL_INFO.x >= 0) {
if(BALL_INFO.x + BALL_INFO.width >= PAD_INFO[1].x) {
BALL_INFO.x = PAD_INFO[1].x - BALL_INFO.width;
BALL_INFO.dx = -BeginX;
}
}
}
void UpdateBall(RECT* prc) {
BALL_INFO.x += BALL_INFO.dx;
BALL_INFO.y += BALL_INFO.dy;
Bumprect(prc);
BumpPaddle();
}
void DrawBall(HDC hdc, RECT* rct) { //More preporely, this could just as well be called Draw
HDC hdcBuffer = CreateCompatibleDC(hdc);
HBITMAP hbmNew = CreateCompatibleBitmap(hdc, rct->right, rct->bottom);
HBITMAP hbmOldBuffer = (HBITMAP)SelectObject(hdcBuffer, hbmNew);
HDC hdcMem = CreateCompatibleDC(hdc);
HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, gBALL);
FillRect(hdcBuffer, rct, (HBRUSH)GetStockObject(BLACK_BRUSH));
HDC hdcMem2 = CreateCompatibleDC(hdc);
HBITMAP hbmOld2 = (HBITMAP)SelectObject(hdcMem2, gPAD1);
HDC hdcMem3 = CreateCompatibleDC(hdc);
HBITMAP hbmOld3 = (HBITMAP)SelectObject(hdcMem3, gPAD2);
BitBlt(hdcBuffer, BALL_INFO.x, BALL_INFO.y, BALL_INFO.width, BALL_INFO.height, hdcMem, 0, 0, SRCAND);
SelectObject(hdcMem, gBALL);
BitBlt(hdcBuffer, BALL_INFO.x, BALL_INFO.y, BALL_INFO.width, BALL_INFO.height, hdcMem, 0, 0, SRCPAINT);
//Paddle 1
BitBlt(hdcBuffer, PAD_INFO[0].x, PAD_INFO[0].y, PAD_INFO[0].width, PAD_INFO[0].height, hdcMem2, 0, 0, SRCAND);
SelectObject(hdcMem2, gPAD1);
BitBlt(hdcBuffer, PAD_INFO[0].x, PAD_INFO[0].y, PAD_INFO[0].width, PAD_INFO[0].height, hdcMem2, 0, 0, SRCPAINT);
//Paddle 2
BitBlt(hdcBuffer, PAD_INFO[1].x, PAD_INFO[1].y, PAD_INFO[1].width, PAD_INFO[1].height, hdcMem3, 0, 0, SRCAND);
SelectObject(hdcMem3, gPAD2);
BitBlt(hdcBuffer, PAD_INFO[1].x, PAD_INFO[1].y, PAD_INFO[1].width, PAD_INFO[1].height, hdcMem3, 0, 0, SRCPAINT);
//Render everything
BitBlt(hdc, 0, 0, rct->right, rct->bottom, hdcBuffer, 0, 0, SRCCOPY);
SelectObject(hdcMem, hbmOld);
DeleteDC(hdcMem);
SelectObject(hdcMem2, hbmOld2);
DeleteDC(hdcMem);
SelectObject(hdcMem3, hbmOld3);
DeleteDC(hdcMem);
SelectObject(hdcBuffer, hbmOldBuffer);
DeleteDC(hdcBuffer);
DeleteObject(hbmNew);
}
void DrawPaddle(HDC hdc, HWND hwnd) {
BITMAP bm;
PAINTSTRUCT ps;
HDC hdcMem = CreateCompatibleDC(hdc);
HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, ScreenDisplay_Object);
GetObject(ScreenDisplay_Object, sizeof(bm), &bm);
BitBlt(hdc, PAD_INFO[CPI].x, PAD_INFO[CPI].y, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);
SelectObject(hdcMem, hbmOld); //81
DeleteDC(hdcMem);
EndPaint(hwnd, &ps);
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch(msg) {
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
DeleteObject(ScreenDisplay_Object);
PostQuitMessage(0);
break;
case WM_CREATE: {
BITMAP bm;
gBALL = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BALL));
if(gBALL == NULL)
MessageBox(hwnd, "Could not load object!", "Error!", MB_OK | MB_ICONEXCLAMATION);
GetObject(gBALL, sizeof(bm), &bm);
ZeroMemory(&BALL_INFO, sizeof(gBALL));
BALL_INFO.width = bm.bmWidth;
BALL_INFO.height = bm.bmHeight;
BALL_INFO.dx = BeginX;
BALL_INFO.dy = BeginY;
BALL_INFO.x = 377;
BALL_INFO.y = 260;
gPAD1 = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_PAD1));
ScreenDisplay_Object = gPAD1;
if(gPAD1 == NULL)
MessageBox(hwnd, "Could not load object!", "Error!", MB_OK | MB_ICONEXCLAMATION);
GetObject(gPAD1, sizeof(bm), &bm);
ZeroMemory(&PAD_INFO[0], sizeof(gPAD1));
PAD_INFO[0].width = bm.bmWidth;
PAD_INFO[0].height = bm.bmHeight;
PAD_INFO[0].x = 0;
PAD_INFO[0].y = 260;
gPAD2 = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_PAD2));
ScreenDisplay_Object = gPAD2;
if(gPAD2 == NULL)
MessageBox(hwnd, "Could not load object!", "Error!", MB_OK | MB_ICONEXCLAMATION);
GetObject(gPAD2, sizeof(bm), &bm);
ZeroMemory(&PAD_INFO[1], sizeof(gPAD2));
PAD_INFO[1].width = bm.bmWidth;
PAD_INFO[1].height = bm.bmHeight;
PAD_INFO[1].x = 755;
PAD_INFO[1].y = 260;
SetTimer(hwnd, ID_TIMER, 45, NULL);
}
break;
case WM_TIMER: {
RECT rcClient;
HDC hdc = GetDC(hwnd);
GetClientRect(hwnd, &rcClient);
ScreenDisplay_Object = gBALL;
UpdateBall(&rcClient);
DrawBall(hdc, &rcClient);
ReleaseDC(hwnd, hdc);
}
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
WNDCLASSEX wc;
HWND hwnd;
MSG Msg;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = g_szClassName;
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if(!RegisterClassEx(&wc)) {
MessageBox(NULL, "Window Registration Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK);
return 0;
}
hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, g_szClassName, "PONG!", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL, hInstance, NULL);
if(hwnd == NULL) {
MessageBox(NULL, "Window Creation Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&Msg, NULL, 0, 0) > 0) {
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
Basicaly this creates a ball that gets sent to the left, and it should collide with the first paddle (0)... But it doesnt, it just goes straight into the first paddle. Bah, damn my poor applied math skills -,-.