学习七十一雾央MFC游戏心得,初体验(六)



看了七十一雾央的博客后深有感触,决定学习一下,跟着操作,写下自己的心得。

初体验。

2015/06/14/

///by xbw

编译器 visual studio 2013 MFC应用程序


一、键盘响应

键盘响应,是贴图(人物)动起来,游戏都是有互动性的;;;

项目 --类向导---找到消息,搜索---WM_KEYDOWN;

确定 ,,我们会发现在cpp文件中出现了void CChildView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)函数

我们清空其中函数,上代码;--雾央老师

void CChildView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
	// TODO:  在此添加消息处理程序代码和/或调用默认值

	switch (nChar)
	{
	case 'd':         //游戏中按下的键当然应该不区分大小写了  
	case 'D':
		m_heroPos.left += 10;    //向右移动10个像素的单位  
		m_heroPos.right += 10;   //左边和右边都要移动哦  
		break;
	case 'a':
	case 'A':
		m_heroPos.left -= 10;
		m_heroPos.right -= 10;
		break;
	case 'w':
	case 'W':
		m_heroPos.top -= 10;
		m_heroPos.bottom -= 10;
		break;
	case 's':
	case 'S':
		m_heroPos.top += 10;
		m_heroPos.bottom += 10;
		break;
	}
}


在添加 变量定义 ,,CRect m_heroPos;

BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs) 
{
	m_bgcDC.CreateCompatibleDC(NULL);
	m_bgBitmap.LoadBitmap(IDB_BITMAP1);
	m_hero.Load(_T("images\\me.png"));
	m_hero.SetTransparentColor(RGB(0, 0, 255));
	m_heroPos.left = 100;    //人物左边贴在100的位置  
    m_heroPos.right = 100 + 60; //人物的右边等于左边加上人物的宽度  
	m_heroPos.top = 400;
	m_heroPos.bottom = 400 + 60;

	if (!CWnd::PreCreateWindow(cs))
		return FALSE;
	
	cs.dwExStyle |= WS_EX_CLIENTEDGE;
	cs.style &= ~WS_BORDER;
	cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS, 
		::LoadCursor(NULL, IDC_ARROW), reinterpret_cast<HBRUSH>(COLOR_WINDOW+1), NULL);
     
	return TRUE;
}

这步添加了贴图的初始位置,,,,

重点来了,这么了我半天,

void CChildView::OnPaint() 
{
	//CPaintDC dc(this); // 用于绘制的设备上下文
	CDC *cDC = this->GetDC();   //获得当前窗口的DC   
	GetClientRect(&m_client);   //获得窗口的尺寸
	m_bgcDC.SelectObject(&m_bgBitmap);
	cDC->BitBlt(0, 0, m_client.Width(), m_client.Height(), &m_bgcDC, 0, 0, SRCCOPY);
	m_hero.Draw(*cDC, m_heroPos);
	ReleaseDC(cDC); //释放DC   
}

看到了什么东西被注释了吗,没错,就是他,没注释之前,按下WSDA根本就没有反应,测试了半天,才发现,只要注释掉这句就可以了,

运行试试吧,是不是又成功了;

接下来我们再添加鼠标响应

二、鼠标响应

按照同样的方法,类向导,添加WM_LBUTTONDOWN 单击鼠标左键消息

 雾央老师还总结了如下,,,,

WM_LBUTTONDBLCLK 双击鼠标左键消息

WM_LBUTTONDOWN 单击鼠标左键消息

WM_LBUTTONUP 松开鼠标左键消息

WM_MBUTTONDBLCLK 双击鼠标中键(滚轮)消息

WM_MBUTTONDOWN 单击鼠标中键(滚轮)消息

WM_MBUTTONUP 松开鼠标中键(滚轮)消息

WM_RBUTTONDBLCLK 双击鼠标右键消息

WM_RBUTTONDOWN 单击鼠标右键消息

WM_RBUTTONUP 松开鼠标右键消息

WM_MOUSEMOVE 鼠标移动消息

WM_MOUSEWHEEL 鼠标滚轮转动消息
 又会出现相应的函数

void CChildView::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO:  在此添加消息处理程序代码和/或调用默认值
	m_heroPos.left = point.x;
	m_heroPos.right = m_heroPos.left + 60;
	m_heroPos.top = point.y;
	m_heroPos.bottom = m_heroPos.top + 60;
}


此时键盘跟鼠标都可以使贴图移动了;;;


补充一下,,,消息响应    ,,,


键盘

UINT nChar 指定特定键的虚键控代码。大家是不是很疑惑,我们收到按键消息后,怎么知道是哪个键被按下了呢?答案就是nChar这个参数了。大家如果按下了某个字母键,那么nChar存储的就是这个字母键的ASCII码,如果是上下左右键呢,那么就分别是VK_LEFT,VK_RIGHT,VK_UP,VK_DOWN这几个宏了。其他的键游戏中使用不多,我就不多说了,若有需要,大家百度“按键的虚拟值“即可查到。

     UINT nRepCnt,保存了键被重击的次数。

     UINT nFlags ,定扫描代码,键转换代码,前一个关键状态。


鼠标

参数一:nFlags

        指示是否各种虚拟键是否被按下。这个参数可以是任何以下值的组合:

MK_CONTROL 如果Ctrl键按下时设置这个标志。

MK_LBUTTON 如果鼠标左键按下时设置这个标志。

MK_MBUTTON 如果鼠标中键按下时设置这个标志。

MK_RBUTTON 如果鼠标右键按下时设置这个标志。

MK_SHIFT 如果Shift键按下时设置这个标志。


        这个大家也可以不用管,在我们的教程中几乎用不到。


       参数二:CPoint point

      大家查看CPoint类型就可以发现,它包含两个成员变量x和y,就分别是鼠标的位置了,注意是相对于窗口左上角的,我想大家都知道程序中窗口的左上角是(0,0)点,向右为x正方向,向下为y正方向吧。

       我们的程序就设定为点击鼠标左键后,将人物的左上角移动到鼠标的位置。

-----------引用雾央老师,,,,





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值