文字与声音

一、显示文字

(一)代码实例

// 窗口(WIDTH * 0.85, 20)起位置显示坚持了多少秒
TCHAR s[20];
setbkmode(TRANSPARENT); // 文字字体透明
_stprintf_s(s, _T("%d秒"), liveSecond);
settextcolor(WHITE); // 设定文字颜色
settextstyle(40, 0, _T("黑体"));//  设定文字大小、样式
outtextxy(WIDTH * 0.85, 20, s); //  输出文字内容
// 设置字体显示属性
setbkmode(TRANSPARENT);
settextcolor(RGB(255, 0, 0));
settextstyle(60, 0, _T("宋体"));
if (gameStatus == 1) {// 输出游戏胜利
    outtextxy(WIDTH * 0.35, HEIGHT * 0.35, _T("游戏胜利 :)"));
}
else if (gameStatus == -1) { // 输出游戏失败
    outtextxy(WIDTH * 0.35, HEIGHT * 0.35, _T("游戏失败 :("));
}

(二)TCHAR

数据类型TCHAR, 这个类型在UNICODE环境下将映射为wchar_t类型;在ASCII环境下映射为char类型。并不是所有的Windows操作系统都支持UNICODE编码的API(例如早期的Windows98), 这就造成了两种结果:某些版本的Windows应该应用wchar_t来保存字符, 某些平台的Windows应该使用char类型来保存字符, 显然这两种类型的变量是无法混用的。

typedef   unsigned   char   CHAR;  
typedef   unsigned   wchar_t   WCHAR;   
 
#ifdef   UNICODE  
    typedef   wchar_t   TCHAR;   
#else  
    typedef   unsigned   char   TCHAR;  
#endif 

TCHAR 就是当你的字符设置为什么就是什么
例如:

程序编译为 ANSI, TCHAR 就是相当于 CHAR
当程序编译为 UNICODE, TCHAR 就相当于 WCHAR

char :单字节变量类型,最多表示256个字符,

wchar_t :宽字节变量类型,用于表示Unicode字符

宽字符和窄字符的区别:宽字符,一个字符占用两个字节;窄字符,一个字符占用一个字节。

(三)_T

_T是将字符串转换为TCHAR类型,而_L是将字符串转换为WCHAR类型,两者的区别就在于TCHAR类型和WCHAR类型。

#ifdef   UNICODE  
    #define __T(x)      L ## x  
#else  
    #define __T(x)      x  
#endif 

先说WCHAR类型,宽字符类型。一般的字符类型为CHAR。而_T类型是微软为了能够保证WCHAR类型和CHAR类型两者在平台上能够通用设计出来的一个类型。
当没有定义_UNICODE时,TCHAR就是普通的char类型,而当定义了UNICODE宏时,TCHAR就转为了WCHAR类型,即_L类型。

使用例子:

TCHAR msg[] = _T("学习C++");

(四)outtextxy

以下代码截取自easyx.h225-226行:

void outtextxy(int x, int y, LPCTSTR str);    // Output a string at the specified location
void outtextxy(int x, int y, TCHAR c);        // Output a char at the specified location

参数

x:字符串输出时头字母的 x 轴的坐标值。

y:字符串输出时头字母的 y 轴的坐标值。

str:待输出的字符串的指针。

c:待输出的字符。

二、播放音乐

(一)循环播放音乐

1.代码

mciSendString(_T("open game_music.mp3 alias bkmusic"), NULL, 0, NULL);//打开背景音乐//game_music.mp3要替换为相应文件名
mciSendString(_T("play bkmusic repeat"), NULL, 0, NULL);  // 循环播放

2.mciSendString()播放音乐时的使用

(1)mciSendString()是WindowsAPI函数,因此使用这个函数应首先包含<windows.h>头文件, 同时,还需要包含<mmsystem.h>及winmm库文件,包含库文件格式为 #pragma comment ( lib, "winmm.lib" )。
(2)打开音乐文件:

mciSendString("open 文件路径/音乐名.mp3 alias bgm",0,0,0);

当不需要这个函数有返回值时,后边的两个参数选择0即可
当播放结束后无发消息目标句柄时,参数也选0或NULL
alias bgm -- 将文件路径及音乐名起别名bgm,后边即可用bgm代替要播放的路径及音乐
(3)播放音乐

mciSendString("play bgm ",0,0,0);

play -- 播放(除play外,还可以用这些命令 pause 暂停 resume 继续 close 关闭 )
如写成"play bgm repeat" -- 则循环播放
(4)调整音量

mciSendString("setaudio bgm volume to 100", 0, 0, 0);

100 -- 音量值(整数,取值0 -- 1000)

(二)播放一次音乐

代码

void PlayMusicOnce(const TCHAR fileName[80]) // 播放一次音乐函数
{
    TCHAR cmdString1[50];
    _stprintf_s(cmdString1, _T("open %s alias tmpmusic"), fileName);    // 生成命令字符串
    mciSendString(_T("close tmpmusic"), NULL, 0, NULL); // 先把前面一次的音乐关闭
    mciSendString(cmdString1, NULL, 0, NULL); // 打开音乐
    mciSendString(_T("play tmpmusic"), NULL, 0, NULL); // 仅播放一次
}

play 音乐别名,最后没有repeat。

posted @ 2022-11-21 21:38  ImreW  阅读(7)  评论(0编辑  收藏  举报