[游戏模版19] Win32 物理引擎 匀速运动

 

>_<:Learning the physical engine

>_<:resource

>_<:code

[游戏模版19] Win32 物理引擎 匀速运动

  1 #include <windows.h>

  2 // C 运行时头文件

  3 #include <stdlib.h>

  4 #include <cstdio>

  5 #include <malloc.h>

  6 #include <memory.h>

  7 #include <tchar.h>

  8 #include <time.h>

  9 #include <string>

 10 #include <cmath>

 11 

 12 // 全局变量:

 13 HINSTANCE hInst;                                // 当前实例

 14 HBITMAP bg , ball[2];

 15 HDC hdc,mdc,bufdc;

 16 HWND hWnd;

 17 DWORD tPre,tNow,tCheck;

 18 RECT rect;//窗口矩形

 19 int x[2];

 20 int y[2];

 21 int vx[2];

 22 int vy[2];

 23 

 24 // 此代码模块中包含的函数的前向声明:

 25 ATOM                MyRegisterClass(HINSTANCE hInstance);

 26 BOOL                InitInstance(HINSTANCE, int);

 27 LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);

 28 INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

 29 void                MyPaint(HDC hdc);

 30 

 31 

 32 int APIENTRY _tWinMain(HINSTANCE hInstance,

 33                      HINSTANCE hPrevInstance,

 34                      LPTSTR    lpCmdLine,

 35                      int       nCmdShow){

 36 

 37     MSG msg;

 38     MyRegisterClass(hInstance);

 39     // 执行应用程序初始化:

 40     if (!InitInstance (hInstance, nCmdShow)){

 41         return FALSE;

 42     }

 43     // 主消息循环:

 44     while (GetMessage(&msg, NULL, 0, 0)){

 45         TranslateMessage(&msg);

 46         DispatchMessage(&msg);

 47     }

 48     return (int) msg.wParam;

 49 }

 50 

 51 //  函数: MyRegisterClass()

 52 //

 53 //  目的: 注册窗口类。

 54 ATOM MyRegisterClass(HINSTANCE hInstance){

 55     WNDCLASSEX wcex;

 56 

 57     wcex.cbSize = sizeof(WNDCLASSEX);

 58 

 59     wcex.style            = CS_HREDRAW | CS_VREDRAW;

 60     wcex.lpfnWndProc    = WndProc;

 61     wcex.cbClsExtra        = 0;

 62     wcex.cbWndExtra        = 0;

 63     wcex.hInstance        = hInstance;

 64     wcex.hIcon            = NULL;

 65     wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);

 66     wcex.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);

 67     wcex.lpszMenuName    = "Beautifulzzzz";

 68     wcex.lpszClassName    = "Beautifulzzzz";

 69     wcex.hIconSm        = NULL;

 70 

 71     return RegisterClassEx(&wcex);

 72 }

 73 

 74 //

 75 //   函数: InitInstance(HINSTANCE, int)

 76 //

 77 //   目的: 保存实例句柄并创建主窗口

 78 //

 79 //   注释:

 80 //

 81 //        在此函数中,我们在全局变量中保存实例句柄并

 82 //        创建和显示主程序窗口。

 83 //        棋盘拼接以及调用InitGame()开始棋局

 84 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow){

 85    HBITMAP bmp;

 86    hInst = hInstance; // 将实例句柄存储在全局变量中

 87 

 88    hWnd = CreateWindow("Beautifulzzzz","Beautifulzzzz", WS_OVERLAPPEDWINDOW,

 89       CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

 90 

 91    if (!hWnd)

 92    {

 93       return FALSE;

 94    }

 95 

 96    MoveWindow(hWnd,10,10,600,450,true);

 97    ShowWindow(hWnd, nCmdShow);

 98    UpdateWindow(hWnd);

 99 

100    hdc=GetDC(hWnd);

101    mdc=CreateCompatibleDC(hdc);

102    bufdc=CreateCompatibleDC(hdc);

103 

104    bmp=CreateCompatibleBitmap(hdc,600,480);

105    SelectObject(mdc,bmp);

106 

107    bg=(HBITMAP)LoadImageA(NULL,"bg.bmp",IMAGE_BITMAP,640,480,LR_LOADFROMFILE);

108    ball[0]=(HBITMAP)LoadImageA(NULL,"ball0.bmp",IMAGE_BITMAP,52,26,LR_LOADFROMFILE);

109    ball[1]=(HBITMAP)LoadImageA(NULL,"ball1.bmp",IMAGE_BITMAP,52,26,LR_LOADFROMFILE);

110 

111    GetClientRect(hWnd,&rect);//取得内部窗口区域的大小;

112 

113    x[0]=50;y[0]=50;vx[0]=4;vy[0]=4;

114    x[1]=380;y[1]=380;vx[1]=-4;vy[1]=-4;

115 

116    SetTimer(hWnd,1,10,NULL);

117    MyPaint(hdc);

118 

119    return TRUE;

120 }

121 

122 //

123 //  函数: WndProc(HWND, UINT, WPARAM, LPARAM)

124 //

125 //  目的: 处理主窗口的消息。

126 //

127 //  WM_COMMAND    - 处理应用程序菜单

128 //  WM_PAINT    - 绘制主窗口

129 //  WM_DESTROY    - 发送退出消息并返回

130 //

131 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){

132     int wmId, wmEvent;

133     PAINTSTRUCT ps;

134 

135     switch (message){

136     case WM_TIMER:

137         A:MyPaint(hdc);

138         break;

139     case WM_PAINT:

140         hdc = BeginPaint(hWnd, &ps);

141         goto A;// TODO: 在此添加任意绘图代码...

142         EndPaint(hWnd, &ps);

143         break;

144     case WM_DESTROY:

145         DeleteDC(mdc);

146         DeleteDC(bufdc);

147         DeleteObject(bg);

148         DeleteObject(ball[0]);

149         DeleteObject(ball[1]);

150 

151         KillTimer(hWnd,1);

152         ReleaseDC(hWnd,hdc);

153 

154         PostQuitMessage(0);

155         break;

156     default:

157         return DefWindowProc(hWnd, message, wParam, lParam);

158     }

159     return 0;

160 }

161 

162 //MyPaint()

163 //1、窗口贴图

164 //2、计算小球贴图坐标并判断小球是否碰撞窗口边缘

165 void MyPaint(HDC hdc){

166     SelectObject(bufdc,bg);

167     BitBlt(mdc,0,0,640,480,bufdc,0,0,SRCCOPY);

168 

169     SelectObject(bufdc,ball[0]);

170     BitBlt(mdc,x[0],y[0],26,26,bufdc,26,0,SRCAND);

171     BitBlt(mdc,x[0],y[0],26,26,bufdc,0,0,SRCPAINT);

172 

173     SelectObject(bufdc,ball[1]);

174     BitBlt(mdc,x[1],y[1],26,26,bufdc,26,0,SRCAND);

175     BitBlt(mdc,x[1],y[1],26,26,bufdc,0,0,SRCPAINT);

176 

177     BitBlt(hdc,0,0,640,480,mdc,0,0,SRCCOPY);

178 

179     for(int i=0;i<2;i++){

180     //计算x轴方向贴图坐标与速度

181         x[i]+=vx[i];

182         if(x[i]<=0){

183             x[i]=0;

184             vx[i]=-vx[i];

185         }else if(x[i]>=rect.right-26){

186             x[i]=rect.right-26;

187             vx[i]=-vx[i];

188         }

189 

190         //计算y轴方向坐标及速度

191         y[i]+=vy[i];

192         if(y[i]<=0){

193             y[i]=0;

194             vy[i]=-vy[i];

195         }else if(y[i]>=rect.bottom-26){

196             y[i]=rect.bottom-26;

197             vy[i]=-vy[i];

198         }

199     }

200 

201     if((x[0]-x[1])*(x[0]-x[1])+(y[0]-y[1])*(y[0]-y[1])<=1000){

202         vx[0]=-vx[0];vy[0]=-vy[0];

203         vx[1]=-vx[1];vy[1]=-vy[1];

204     }

205 }

 

你可能感兴趣的:(Win32)