[游戏模版15] Win32 飞机射击

 

>_<:Only give you the code,try to understand it!

>_<:picture resource

  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 <string>
  9 
 10 
 11 //定义结构,飞机子弹
 12 struct BULLET{
 13     int x,y;
 14     bool exist;
 15 };
 16 
 17 // 全局变量:
 18 HINSTANCE hInst;                                // 当前实例
 19 
 20 HBITMAP bg,ship,bullet;//背景图,飞机图,子弹图
 21 HDC hdc,mdc,bufdc;
 22 HWND hWnd;
 23 int x,y,nowX,nowY;//鼠标坐标,飞机坐标(贴图坐标)
 24 int w=0,bcount;//滚动背景所要剪切的宽度,子弹数目
 25 BULLET b[30];//存储飞机发出的子弹
 26 
 27 // 此代码模块中包含的函数的前向声明:
 28 ATOM                MyRegisterClass(HINSTANCE hInstance);
 29 BOOL                InitInstance(HINSTANCE, int);
 30 LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
 31 INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
 32 void                MyPaint(HDC hdc);
 33 
 34 int APIENTRY _tWinMain(HINSTANCE hInstance,
 35                      HINSTANCE hPrevInstance,
 36                      LPTSTR    lpCmdLine,
 37                      int       nCmdShow){
 38 
 39     MSG msg;
 40     MyRegisterClass(hInstance);
 41     // 执行应用程序初始化:
 42     if (!InitInstance (hInstance, nCmdShow)){
 43         return FALSE;
 44     }
 45     // 主消息循环:
 46     while (GetMessage(&msg, NULL, 0, 0)){
 47         TranslateMessage(&msg);
 48         DispatchMessage(&msg);
 49     }
 50     return (int) msg.wParam;
 51 }
 52 
 53 //  函数: MyRegisterClass()
 54 //
 55 //  目的: 注册窗口类。
 56 ATOM MyRegisterClass(HINSTANCE hInstance){
 57     WNDCLASSEX wcex;
 58 
 59     wcex.cbSize = sizeof(WNDCLASSEX);
 60 
 61     wcex.style            = CS_HREDRAW | CS_VREDRAW;
 62     wcex.lpfnWndProc    = WndProc;
 63     wcex.cbClsExtra        = 0;
 64     wcex.cbWndExtra        = 0;
 65     wcex.hInstance        = hInstance;
 66     wcex.hIcon            = NULL;
 67     wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
 68     wcex.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);
 69     wcex.lpszMenuName    = "Beautifulzzzz";
 70     wcex.lpszClassName    = "Beautifulzzzz";
 71     wcex.hIconSm        = NULL;
 72 
 73     return RegisterClassEx(&wcex);
 74 }
 75 
 76 //   函数: InitInstance(HINSTANCE, int)
 77 //
 78 //   目的: 保存实例句柄并创建主窗口
 79 //
 80 //   注释:
 81 //
 82 //        在此函数中,我们在全局变量中保存实例句柄并
 83 //        创建和显示主程序窗口。
 84 //        1.设定飞机的初始位置
 85 //        2.设定鼠标位置及隐藏
 86 //        3.设定鼠标光标移动区域
 87 //
 88 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow){
 89 
 90    HBITMAP bmp;
 91    POINT pt,lt,rb;
 92    RECT rect;
 93 
 94    hInst = hInstance; // 将实例句柄存储在全局变量中
 95 
 96    hWnd = CreateWindow("Beautifulzzzz","Beautifulzzzz", WS_OVERLAPPEDWINDOW,
 97       CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
 98 
 99    if (!hWnd)
100    {
101       return FALSE;
102    }
103 
104    MoveWindow(hWnd,10,10,640,480,true);
105    ShowWindow(hWnd, nCmdShow);
106    UpdateWindow(hWnd);
107 
108    hdc=GetDC(hWnd);
109    mdc=CreateCompatibleDC(hdc);
110    bufdc=CreateCompatibleDC(hdc);
111 
112    bmp=CreateCompatibleBitmap(hdc,640,480);
113    SelectObject(mdc,bmp);
114 
115    bg=(HBITMAP)LoadImageA(NULL,"bg.bmp",IMAGE_BITMAP,648,480,LR_LOADFROMFILE);
116    ship=(HBITMAP)LoadImageA(NULL,"ship.bmp",IMAGE_BITMAP,100,148,LR_LOADFROMFILE);
117    bullet=(HBITMAP)LoadImageA(NULL,"bullet.bmp",IMAGE_BITMAP,10,20,LR_LOADFROMFILE);
118 
119    x=300;
120    y=300;
121    nowX=300;
122    nowY=300;
123 
124    //设定鼠标光标位置
125    pt.x=300;
126    pt.y=300;
127    ClientToScreen(hWnd,&pt);
128    SetCursorPos(pt.x,pt.y);
129 
130    ShowCursor(false);//隐藏鼠标光标
131 
132    //限制鼠标光标移动区域
133    GetClientRect(hWnd,&rect);
134    lt.x=rect.left;
135    lt.y=rect.top;
136    rb.x=rect.right;
137    rb.y=rect.bottom;
138    ClientToScreen(hWnd,&lt);
139    ClientToScreen(hWnd,&rb);
140    rect.left=lt.x;
141    rect.top=lt.y;
142    rect.right=rb.x;
143    rect.bottom=rb.y;
144    ClipCursor(&rect);
145 
146 
147    SetTimer(hWnd,1,50,NULL);
148    MyPaint(hdc);
149 
150    return TRUE;
151 }
152 
153 //
154 //  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
155 //
156 //  目的: 处理主窗口的消息。
157 //
158 //  WM_COMMAND    - 处理应用程序菜单
159 //  WM_PAINT    - 绘制主窗口
160 //  WM_DESTROY    - 发送退出消息并返回
161 //
162 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){
163     int i;
164     int wmId, wmEvent;
165     PAINTSTRUCT ps;
166 
167     switch (message)
168     {
169     case WM_KEYDOWN:          //按下消息
170         if(wParam==VK_ESCAPE) //按下[esc]
171             PostQuitMessage(0);
172         break;
173     case WM_LBUTTONDOWN:      //单击鼠标左键消息
174         for(i=0;i<30;i++)
175         {
176             if(!b[i].exist)
177             {
178                 b[i].x=nowX;
179                 b[i].y=nowY+30;
180                 b[i].exist=true;
181                 bcount++;
182                 break;
183             }
184         }
185     case WM_MOUSEMOVE:
186         x=LOWORD(lParam);    //取得鼠标x坐标
187         if(x>530)
188             x=530;
189         else if(x<0)
190             x=0;
191 
192         y=HIWORD(lParam);
193         if(y>380)
194             y=380;
195         else if(y<0)
196             y=0;
197 
198         break;
199     case WM_TIMER:
200         A:MyPaint(hdc);
201         break;
202     case WM_PAINT:
203         hdc = BeginPaint(hWnd, &ps);
204         // TODO: 在此添加任意绘图代码...
205         EndPaint(hWnd, &ps);
206         break;
207     case WM_DESTROY:
208         ClipCursor(NULL);//回复鼠标移动区域
209 
210         DeleteDC(mdc);
211         DeleteDC(bufdc);
212         DeleteObject(bg);
213         DeleteObject(bullet);
214         DeleteObject(ship);
215         ReleaseDC(hWnd,hdc);
216 
217         PostQuitMessage(0);
218         break;
219     default:
220         return DefWindowProc(hWnd, message, wParam, lParam);
221     }
222     return 0;
223 }
224 
225 //1.设定飞机坐标并进行贴图
226 //2.设定所有子弹坐标并进行贴图
227 //3.显示真正的鼠标坐标所在的坐标
228 void MyPaint(HDC hdc){
229     char str[20]="";
230     int i;
231 
232     //贴上背景图
233     SelectObject(bufdc,bg);
234     BitBlt(mdc,0,0,w,480,bufdc,640-w,0,SRCCOPY);
235     BitBlt(mdc,w,0,640-w,480,bufdc,0,0,SRCCOPY);
236 
237 
238     //飞机坐标向鼠标坐标位置靠近
239     if(nowX<x){
240         nowX+=10;
241         if(nowX>x)
242             nowX=x;
243     }else{
244         nowX-=10;
245         if(nowX<x)
246             nowX=x;
247     }
248 
249     if(nowY<y){
250         nowY-=10;
251         if(nowY<y)
252             nowY=y;
253     }else{
254         nowY+=10;
255         if(nowY>y)
256             nowY=y;
257     }
258 
259     //贴上飞机图
260     SelectObject(bufdc,ship);
261     BitBlt(mdc,nowX,nowY,100,74,bufdc,0,74,SRCAND);
262     BitBlt(mdc,nowX,nowY,100,74,bufdc,0,0,SRCPAINT);
263 
264     SelectObject(bufdc,bullet);
265     if(bcount!=0)
266         for(i=0;i<30;i++)
267             if(b[i].exist){
268                 //贴上子弹图
269                 BitBlt(mdc,b[i].x,b[i].y,10,10,bufdc,0,10,SRCAND);
270                 BitBlt(mdc,b[i].x,b[i].y,10,10,bufdc,0,0,SRCPAINT);
271 
272                 b[i].x-=10;
273                 if(b[i].x<0){
274                     bcount--;
275                     b[i].exist=false;
276                 }
277             }
278 
279     //显示鼠标坐标
280     sprintf(str,"x坐标:  %d   ",x);
281     TextOutA(mdc,0,0,str,strlen(str));
282     sprintf(str,"y坐标:  %d   ",y);
283     TextOutA(mdc,0,20,str,strlen(str));
284 
285     BitBlt(hdc,0,0,640,480,mdc,0,0,SRCCOPY);
286 
287     w+=10;
288     if(w==640)
289         w=0;
290 }

 

posted @ 2014-05-17 14:57  beautifulzzzz  阅读(912)  评论(0编辑  收藏  举报