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