wX < x) nowX = x; } if(nowY < y) { nowY += 10; if(nowY > y) nowY = y; } else { nowY -= 10; if(nowY < y) nowY = y; } //贴上飞机图 SelectObject(bufdc,ship); BitBlt(mdc,nowX,nowY,100,74,bufdc,0,74,SRCAND); BitBlt(mdc,nowX,nowY,100,74,bufdc,0,0,SRCPAINT); //子弹的贴图,先判断子弹数目“bcount”的值是否为“0”。若不为0,则对子弹数组中各个还存在的子弹按照其所在的坐标(b[i].x,b[i].y)循环进行贴图操作 SelectObject(bufdc,bullet); if(bcount!=0) for(i=0;i<30;i++) if(b[i].exist) { //贴上子弹图 BitBlt(mdc,b[i].x,b[i].y,10,10,bufdc,0,10,SRCAND); BitBlt(mdc,b[i].x,b[i].y,10,10,bufdc,0,0,SRCPAINT); //设置下一个子弹的坐标。子弹是又右向左发射的,因此,每次其X轴上的坐标值递减10个单位,这样贴图会产生往左移动的效果。而如果子弹下次的坐标已超出窗口的可见范围(h[i].x<0),那么子弹设为不存在,并将子弹总数bcount变量值减1. b[i].x -= 10; if(b[i].x < 0) { bcount--; b[i].exist = false; } } //显示鼠标坐标 sprintf(str,"鼠标X坐标为%d ",x); TextOut(mdc,0,0,str,strlen(str)); sprintf(str,"鼠标Y坐标为%d ",y); TextOut(mdc,0,20,str,strlen(str)); BitBlt(hdc,0,0,640,480,mdc,0,0,SRCCOPY); tPre = GetTickCount(); w += 10; if(w==640) w = 0; } //****消息处理函数*********************************** // 1.处理WM_LBUTTONDOWN消息发射子弹 // 2.处理WM_MOUSEMOVE消息设定飞机贴图坐标 // 3.在窗口结束时恢复鼠标移动区域 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int i; switch (message) { case WM_KEYDOWN: //按键按下消息 if(wParam==VK_ESCAPE) //按下【Esc】键 PostQuitMessage(0); break; case WM_LBUTTONDOWN: //单击鼠标左键消息 for(i=0;i<30;i++) { if(!b[i].exist) { b[i].x = nowX; //子弹x坐标 b[i].y = nowY + 30; //子弹y坐标 b[i].exist = true; bcount++; //累加子弹数目 break; } } case WM_MOUSEMOVE: x = LOWORD(lParam); //取得鼠标X坐标 if(x > 530) //设置临界坐标 x = 530; else if(x < 0) x = 0; y = HIWORD(lParam); //取得鼠标y坐标 if(y > 380) y = 380; else if(y < 0) y = 0; break; case WM_DESTROY: //窗口结束消息 ClipCursor(NULL); //恢复鼠标移动区域 DeleteDC(mdc); DeleteDC(bufdc); DeleteObject(bg); DeleteObject(bullet); DeleteObject(ship); ReleaseDC(hWnd,hdc); PostQuitMessage(0); break; default: //其他消息 return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } 下面是这个例子的效果图: 我们移动鼠标,小飞机会跟着鼠标的移动而移动;点击鼠标,小飞机就会发射出绿色的子弹来;按下Esc键,这个小游戏就退出了。
当然,这个小游戏还有些的不足,比如小飞机对鼠标的跟随有小小的延迟,也没有进行WndProc函数中case分支的拆分(在这里感谢yao050421103的提醒)。
关于这个小游戏的改进,是以后我们需要去做的。比如后面我们会找机会用DirectX中的DirectInput函数(也是处理输出消息的函数)来写一下这个小游戏的升级版,无论是画面上还是实现效果上都将进行升级。
在
|