MFC坦克大战游戏制作
MFC坦克大战游戏制作
前言
现在的游戏制作一般是easyx,有没有直接只用mfc框架的,笔者研究了一番,做出了一个雏形,下面把遇到的问题总结出来
一、MFC框架制作游戏
初步设想,MFC可以选用 对话框 或者 单文档 结构,我们在上面画图,可以使用png的图片,这样保证能透明,然后使用鼠标和键盘操作 人物移动和子弹飞出,加上背景音乐,积分规则等等,就能制作出一份游戏来。这是游戏界面
二、遇到的技术难点
1.内存画图解决闪烁问题
MFC画图最麻烦的就是,闪烁问题,所以要尽量内存画图,然后一次性的输出。所有需要重绘的地方,使用 Invalidate(FALSE); 能保证最小程度上的闪烁
核心代码
CPaintDC dc(this); CDC memDC; memDC.CreateCompatibleDC(&dc); CBitmap bmp; GetClientRect(&m_client); bmp.CreateCompatibleBitmap(&dc, m_client.Width(), m_client.Height()); CBitmap* pOldBitmap = memDC.SelectObject(&bmp); CDC* pDC = &memDC; // 绘制到内存 DC //m_bg.Draw(memDC, m_client); //m_hero.Draw(memDC, m_heroPos); // 绘制背景 pDC->FillSolidRect(m_client, RGB(0, 120, 0)); // 或用背景刷填充
注意看pDC是一个内存画图的memDC指针
在需要画图的地方,pDC 是传递过来的 memeDC指针
CRect rctTank(m_ptPos.x, m_ptPos.y, m_ptPos.x + 2*m_nSize, m_ptPos.y + 2*m_nSize); CImage* pImg = nullptr; pImg = m_img; pImg->Draw(pDC->GetSafeHdc(), rctTank);
等内存画完图
// 一次性拷贝到屏幕 dc.BitBlt(0, 0, m_client.Width(), m_client.Height(), &memDC, 0, 0, SRCCOPY); //清理资源 memDC.SelectObject(pOldBitmap); bmp.DeleteObject();
2.设定timer保持界面更新
设置了三个timer,一个界面更新,二是判断是否碰撞(包括坦克、地方坦克、子弹之间的碰撞)
int nTimerID1 = 1; int nTimerID2 = 2; int nTimerID3 = 3; SetTimer(nTimerID1, 4, NULL);//一号定时器,4ms,全体发送 增加 SetTimer(nTimerID2, 2, NULL);//判断是否重叠(相撞) SetTimer(nTimerID3, 2000, NULL);//自动开火
第三个是 让地方坦克自己运动、开火
switch (nIDEvent) { case 1: Invalidate(FALSE); break; case 2://碰撞测试 { m_mtxJudgy.try_lock(); std::thread Overlay(Judgy, this); Overlay.detach(); m_mtxJudgy.unlock(); } break; case 3://自动开火 {
3.设计合适母类解决互动问题
我方坦克、地方坦克、子弹、都从一个母类派生来,母类的一些方法如下:
class MyObject { public: MyObject() { m_nSize = 32; }; ~MyObject() {}; void Draw(CDC* pDC); void Move(int nDirection) {};//设置运动方向or方向 bool IsOverlap(MyObject& obj);//判断两个物体是否碰撞 bool IsFriend(MyObject& OBJ); void SetSize(int nSize);//设置外形尺寸 void SetDirection(int nDir); void SetFriend(bool bFriend); void SetArmor(int nArmor); void SetSpeed(int nSpeed); int GetDirection();//访问m_nDirection int GetSize();//访问m_nSize bool GetFriend(); int GetArmor(); int GetSpeed(); public: int m_nSpeed;// right1 || top1 > bottom2 || top2 > bottom1) { return false; } return true; } // 情况2:其他各种情况都粗略搞成两个圆心 else { double dx = m_ptPos.x - obj.m_ptPos.x; double dy = m_ptPos.y - obj.m_ptPos.y; double dDis = sqrt(dx * dx + dy * dy); if (obj.GetSize() + m_nSize >= dDis) return true; else return false; } }
总结
1、给坦克设定一定的Armor,也就是血,受到子弹的撞击就减一,Armor减完就死了
2、给四周的墙体设定的Armor是999,所以是打不透的,给中间的障碍设定的是1,打完就没了
3、子弹的速度和伤害可以改,在界面最上面的button里面
游戏视频如下,简陋了点,但是能用
2025.05.29-20.58.48
MFC坦克大战源码没有用任何第三方库资源-CSDN文库
源码传到这里
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。