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

 

>_<:Learning the physical engine

>_<:resource

>_<:code

  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 }

 

posted @ 2014-05-18 14:26  beautifulzzzz  阅读(568)  评论(0编辑  收藏  举报