MFC学习笔记之四(音乐,文字输出,障碍物,弹窗)

2024-02-26 20:30

本文主要是介绍MFC学习笔记之四(音乐,文字输出,障碍物,弹窗),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

(十)背景声音的播放

游戏大多都是有背景声音的,因此我们也不能免俗。

播放声音需要头文件,还需要导入声音文件库:

#include "mmsystem.h"

#pragma comment(lib,"winmm.lib")//导入声音头文件库

总之,这两行连用就可以了(更多的我也不知道)。

这两行放在需要使用下面代码的源代码文件中的开始处。

 

其次,需要使用mciSendString()函数。

打开一个媒体文件需要使用命令:

mciSendString("openres\\我在人民广场吃炸鸡.mp3 alias bgMusic", NULL,0, NULL);

open表示打开,后面是路径。alias bgMusic表示将该媒体文件别名命名为bgMusic(也可以起名为别的)。后面三个参数作用暂时不管(我也不知道)。

播放一个媒体文件需要使用命令:

mciSendString("playbgMusic repeat", NULL, 0, NULL);

play表示播放,bgMusic表示被播放的媒体文件(可以用别名也可以用路径)(这里是上面打开的媒体文件的别名),repeat表示重复播放(单曲循环)。

这两行例如可以放在PreCreateWindow()函数中。

 


 

 

(十一)如何输出坐标(输出文字)

涉及到格式化输出的问题。代码如下:

CString x_;

x_.Format(_T("x:%d,y:%d"), myHero.xy.left, myHero.xy.top);

m_cacheDC.TextOut(50, 50,x_);

第一行命令的意思是,设置一个CString类型的变量x_;

第二行命令的意思是,格式化字符串(被双引号括起来的那些),其中%d表示是int或者double类型的变量,2个%d表示有2个,这两个变量分别为(myHero.xy.left,和myHero.xy.top),因此,输出的文字则为:


第三行则是普通的TextOut()函数,参照使用即可。

 

 

 

(十二)障碍物

游戏里一般都是有障碍物的,而障碍物,一般是不能被碰到的。

 

检测障碍物的原理很简单,检测将要移动到的位置,是否有障碍物(简单版的检测方法,是只检测某一边,例如往上移动,则只检测top那一边移动后的那一排坐标,是否有障碍物。复杂点的,则是检测全部图像中,非透明的地方)。

 

障碍物的标识,可以用地图的障碍物版(即,将地图中是障碍物的地方,标记为单一颜色,例如黑色。这样,有障碍物的地方就是黑色的,没有障碍物的地方为其他颜色,例如统一为白色)(需要注意,这个障碍物版的地图,其像素应该和大地图的实际大小统一。就是在Draw()函数中,绘画的大地图大小)。

 

这个障碍物版的地图,被一个CImage类型变量所加载,但不被绘画到缓冲DC之上,只是单纯用于检测而已。

 

但由于我之前做的Hero类(用于加载人物和怪物的类),因此,为了修改代码方便,则先移动,然后判断是否能移动,如果不能,则取消移动(位移更改回去)

 

其函数为:

bool Hero::CanMove(CImage&bg, int X, int Y)		//移动后判断是否应该取消移动,第一个参数为背景(黑白图),第二三个参数为该次移动的坐标变化量,有正负变化
{//判断是否能移动,根据面向判断(移动首先改变面向,然后才判断是否能移动)if (direct == 0)	//向下移动,变化量为Y{for (int i = xy.left; i < xy.right; i++)if (bg.GetPixel(i, xy.bottom) == RGB(0, 0, 0))return false;		//移动后下边那一边如果检测到黑色,说明不能移动return true;		//如果没检测到,说明可以移动}else if (direct == 3)	//向上{for (int i = xy.left; i < xy.right;i++)if (bg.GetPixel(i, xy.top) == RGB(0, 0, 0))return false;		//移动后上边那一边如果检测到黑色,说明不能移动return true;		//如果没检测到,说明可以移动}else if (direct == 1)	//往左移动{for (int i = xy.top; i < xy.bottom; i++)if (bg.GetPixel(xy.left, i) == RGB(0, 0, 0))return false;return true;}else if (direct == 2)	//往右移动{for (int i = xy.top; i < xy.bottom; i++)if (bg.GetPixel(xy.right, i) == RGB(0, 0, 0))return false;return true;}
}

键盘响应函数OnKeyDown()的代码为(注:较为繁琐,实际上是可以优化的,暂放弃优化):


void CChildView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{// TODO: 在此添加消息处理程序代码和/或调用默认值switch (nChar){case 'D':myHero.addX(10);if (!myHero.CanMove(m_bgblack, 10, 0))myHero.addX(-10);myHero.GetDirect() = 2;break;case 'A':myHero.addX(-10);if (!myHero.CanMove(m_bgblack, -10, 0))myHero.addX(10);myHero.GetDirect() = 1;break;case 'W':myHero.addY(-10);if (!myHero.CanMove(m_bgblack, 0,-10))myHero.addY(10);myHero.GetDirect() = 3;break;case 'S':myHero.addY(10);if (!myHero.CanMove(m_bgblack, 0, 10))myHero.addY(-10);myHero.GetDirect() = 0;break;case 'T':    //创建定时器  SetTimer(TIMER_HEROMOVE, 100, NULL);break;case 'I':    //撤销定时器  KillTimer(TIMER_HEROMOVE);}myHero.SetXY();myHero.addFrame();	//修改帧数myHero.SetClient(m_client);			//人物移动,设置背景图新的坐标
}

备注:

个人亲身感受而言,障碍物为矩形比较好用,假如用PS的画笔工具,似乎效果差很多(实际上,发生了不明问题,即明明是不是障碍物的地方,却过不去,但并不知道为什么)。

 

 

(十三)弹窗

先上代码:

void CChildView::OnLButtonDown(UINT nFlags, CPoint point)
{//TODO: 在此添加消息处理程序代码和/或调用默认值charbufPos[50];sprintf_s(bufPos,"你单击了点X:%d,Y:%d", point.x, point.y);AfxMessageBox(bufPos);
}


代码效果:

点击左键后,弹出一个窗口,其标题为“练习”(即程序名),内容为:“你单击了X:370,Y:63”(具体XY后面的值根据点击的地方而变化,范围为800x600内)。

注意,前两行可以用以下代码替换,效果是一样的(这种代码貌似是C风格):

         CString bufpos;

         bufpos.Format("你单击了点X:%d,Y:%d", point.x, point.y);

简单来说,AfxMessageBox()函数的作用是弹出一个弹窗。弹窗显示的内容为第一个参数(字符串类型)的内容,默认只有“确认”按钮。

更多关于AfxMessageBox()函数的功能,请参阅《MFC的一些函数》。

 

 

 

 


这篇关于MFC学习笔记之四(音乐,文字输出,障碍物,弹窗)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/750069

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

高效录音转文字:2024年四大工具精选!

在快节奏的工作生活中,能够快速将录音转换成文字是一项非常实用的能力。特别是在需要记录会议纪要、讲座内容或者是采访素材的时候,一款优秀的在线录音转文字工具能派上大用场。以下推荐几个好用的录音转文字工具! 365在线转文字 直达链接:https://www.pdf365.cn/ 365在线转文字是一款提供在线录音转文字服务的工具,它以其高效、便捷的特点受到用户的青睐。用户无需下载安装任何软件,只

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个