设为首页 加入收藏

TOP

(Visual C++)游戏开发笔记十三:游戏输入消息处理(二)鼠标消息处理 (五)
2014-11-23 20:17:26 】 浏览:1034
Tags:Visual 游戏 开发 笔记 十三 输入 消息 处理 鼠标
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函数(也是处理输出消息的函数)来写一下这个小游戏的升级版,无论是画面上还是实现效果上都将进行升级。


首页 上一页 2 3 4 5 下一页 尾页 5/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇(Visual C++)游戏开发笔记之十.. 下一篇(Visual C++)游戏开发笔记十五..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目