#include<windows.h>
#include "Globle.h"
#include <stdio.h>
int _stdcall WinMain(HINSTANCE hInstance,
HINSTANCE hPrelnstance,
LPSTR lpCmdLine,
int nShowCmd)
{
//1、设置窗体属性
WNDCLASSEX wcex;
// 结构体的大小
wcex.cbSize = sizeof(WNDCLASSEX);
// 窗体类的样式
wcex.style = CS_HREDRAW | CS_VREDRAW;
// *窗体回调函数
wcex.lpfnWndProc = (WNDPROC)WndProc;
// 窗体类额外字节数,通常为0
wcex.cbClsExtra = 0;
// 窗体实例额外字节数,通常为0
wcex.cbWndExtra = 0;
// *应用程序实例句柄
wcex.hInstance = hInstance;
wcex.hIcon = NULL; // 窗体大图标
wcex.hCursor = LoadCursor(NULL, IDC_ARROW); // 窗体鼠标光标样式
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); // 窗体背景色
wcex.lpszMenuName = NULL; // 窗体主菜单
// *窗体类名称
wcex.lpszClassName = "FW";
wcex.hIconSm = NULL; // 窗体小图标
//2、注册窗体
RegisterClassEx(&wcex);
//3、创建窗体
HWND hWnd = CreateWindow(
"FW", // *窗体类名称
"弹球游戏", // 窗体标题名
WS_OVERLAPPEDWINDOW, // 窗体外观样式
CW_USEDEFAULT, // 窗体在屏幕上的水平位置
0, // 窗体在屏幕上的垂直位置
CW_USEDEFAULT, // 窗口的宽度
0, // 窗口的高度
NULL, // 父窗体句柄
NULL, // 窗口菜单句柄
hInstance, // *创建窗体的应用程序实例句柄
NULL); // 创建窗体时的额外信息,通常为NULL
if (NULL == hWnd)
{
return FALSE;
}
//4、显示窗体
ShowWindow(hWnd, nShowCmd);
//5、 更新窗体
UpdateWindow(hWnd);
//6、主消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) // 从消息队列中获取消息
{
TranslateMessage(&msg); // 转换消息
DispatchMessage(&msg); // 分发消息给回调函数
}
return msg.wParam;
}
//7、消息处理
long CALLBACK WndProc(HWND hWnd, int message, int wParam, int lParam)
{
switch (message)
{
case WM_SIZE:
{
GetClientRect(hWnd,&Rect);
break;
}
case WM_TIMER:
{
x+=32,y+=85,z+=60;
a+=65;b+=35;c+=15;
DrawBall(hWnd);
if(BeginY>Rect.bottom-R)
{
KillTimer(hWnd,1);
MessageBox(hWnd,"GAME OVER !!!","info",MB_OK);
}
sprintf(s,"弹球游戏 Socor:%d",Socor);
SetWindowText(hWnd,s);
break;
}
case WM_DESTROY:
{
KillTimer(hWnd,1);
PostQuitMessage(0);
break;
}
case WM_CREATE:
{
SetTimer(hWnd,1,TimeSpeed,NULL);
GetClientRect(hWnd,&Rect);
break;
}
case WM_KEYDOWN:
{
switch(wParam)
{
case VK_RIGHT:
{
RightMoveBan(hWnd);
break;
}
case VK_LEFT:
{
LeftMoveBan(hWnd);
break;
}
}
}
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
void DrawBall(HWND hWnd)
{
HDC hDc = GetDC(hWnd);
PreDrawBall(hDc);
BallDirect();
AfterDrawBall(hDc);
ReleaseDC(hWnd,hDc);
}
void RightMoveBan(HWND hWnd)
{
HDC hDc = GetDC(hWnd);
PreDrawBall(hDc);
BeginRectX += BANSTEP ;EndRectX += BANSTEP ;
AfterDrawBall(hDc);
ReleaseDC(hWnd,hDc);
}
void LeftMoveBan(HWND hWnd)
{
HDC hDc = GetDC(hWnd);
PreDrawBall(hDc);
BeginRectX -= BANSTEP ;EndRectX -= BANSTEP ;
AfterDrawBall(hDc);
ReleaseDC(hWnd,hDc);
}
void PreDrawBall(HDC hDc)
{
HPEN hPen = CreatePen(PS_SOLID,1,RGB(255,255,255));
HBRUSH hBrush = CreateSolidBrush(RGB(255,255,255));
SelectObject(hDc,hBrush);
SelectObject(hDc,hPen);
Ellipse(hDc,BeginX,BeginY,BeginX+R,BeginY+R);
Rectangle(hDc,BeginRectX,BeginRectY,EndRectX,EndRectY);
DeleteObject(hBrush);
}
void AfterDrawBall(HDC hDc)
{
HPEN hPen = CreatePen(PS_SOLID,1,RGB(0,0,0));
SelectObject(hDc,hPen);
Ellipse(hDc,BeginX,BeginY,BeginX+R,BeginY+R);
DeleteObject(hPen);
HBRUSH hBrush = CreateSolidBrush(RGB(a,b,c));
SelectObject(hDc,hBrush);
Ellipse(hDc,BeginX,BeginY,BeginX+R,BeginY+R);
DeleteObject(hBrush);
hBrush = CreateSolidBrush(RGB(x,y,z));
SelectObject(hDc,hBrush);
Rectangle(hDc,BeginRectX,BeginRectY,EndRectX,EndRectY);
DeleteObject(hBrush);
}
void BallDirect()
{
if(BeginY+R >= 400 && BeginY<= BeginRectY && BeginX >=BeginRectX-R && BeginX<=EndRectX+R)
{
if(Dir == 0)
Dir = 1 ;
else
Dir = 2;
Socor ++ ;
}
if(BeginY>Rect.bottom-R && Dir == 0) //逆时针右下
{
// KillTimer(hWnd,1);
// MessageBox(hWnd,"GAME OVER !!!","info",MB_ABORTRETRYIGNORE);
Dir = 1 ;
}
else if(BeginX>Rect.right-2*R && Dir == 1)//逆时针右上
Dir = 2 ;
else if(BeginY<Rect.top + R && Dir == 2)//逆时针左上
Dir = 3 ;
else if(BeginX<Rect.left+R && Dir == 3)//逆时针左上
Dir = 0 ;
else if(BeginY>Rect.bottom-R && Dir == 3)//顺时针右上
{
// KillTimer(hWnd,1);
// MessageBox(hWnd,"GAME OVER !!!","info",MB_ABORTRETRYIGNORE);
Dir = 2;
}
else if(BeginX<Rect.left+R && Dir == 2) //顺时针右下
Dir = 1 ;
else if(BeginY<Rect.top + R && Dir == 1 ) //顺时针左下
Dir = 0 ;
else if(BeginX>Rect.right-2*R && Dir == 0)//顺时针右上
Dir = 3 ;
switch(Dir)
{
case 0:
BeginX += STEP ; BeginY += STEP ;break;
case 1:
BeginX += STEP ; BeginY -= STEP ;break;
case 2:
BeginX -= STEP ; BeginY -= STEP ;break;
case 3:
BeginX -= STEP ; BeginY += STEP ;break;
}
}