C语言中使用多线程播放游戏背景音乐

做大一下期期末设计时遇到一个问题,游戏运行时循环播放背景音乐这个情况下,如果音乐播放完毕,加入判断函数判断是否结束,如果结束则重新播放,但是在游戏中,音乐播放完毕到音乐重新开始播放中间会有一个间隙,这个间隙游戏也会卡顿,主函数代码如下:

int main()
{
	//初始化背景音乐
	MUSIC bgm;
	bgm.OpenFile("res/music/bgm.mp3");

	//设置屏幕刷新率
	int nfps = 120;
	//初始化全局数据及图形
	initgr();
	//初始化启动页
	initmenu();
	//创建game对象并赋值
	Game game(10, 20, 24, 24);
	//方块长和宽
	game.m_base_x = 20;
	game.m_base_y = 20;
	//方块下落速度
	game.m_droptime = nfps / 2;
	//方块左右移动速度
	game.m_movxtime = 10;
	//设置刷新模式为手动刷新
	setrendermode(RENDER_MANUAL);
	//播放背景音乐
	bgm.Play(0,7000);
	//游戏主循环
	for (; is_run(); delay_fps(nfps)) 
	{
		//判断背景音乐是否播放完毕,如果是,从头开始播放
		if (bgm.GetPlayStatus() == MUSIC_MODE_STOP) 
		{
			//从头开始播放
			bgm.Play(0);
		}
		//游戏逻辑更新
		game.update();
		//游戏图形更新
		game.render();
	}
	//关闭画布
	closegraph();
	//关闭背景音乐
	bgm.Stop();
	bgm.Close();
	return 0;
}

其中,判断音乐是否结束的函数放在了绘制图形的循环函数里面。

在网上了解了一些多线程相关知识,我决定用多线程的方式来解决背景音乐的问题,以解决游戏卡顿的问题。

引用了GitHub开源项目nullpomino的资源文件以及EGE图形库中的俄罗斯方块的核心算法。
游戏页面如下:
C语言中使用多线程播放游戏背景音乐_第1张图片
C语言中使用多线程播放游戏背景音乐_第2张图片
下面开始讲解如何使用多线程的方式来解决该问题。
首先,配置pthread.h头文件
详见文章:https://www.cnblogs.com/chenjx85/p/10574752.html
按照其方法配置和pthread.h头文件

随后,我将背景音乐播放独立为一个函数,代码如下:

void * bgmplay(void * args)
{
	//初始化背景音乐
	MUSIC bgm;
	bgm.OpenFile("res/music/bgm.mp3");
	//播放背景音乐
	bgm.Play(0, 7000);
	//判断背景音乐是否播放完毕,如果是,从头开始播放
	while (1)
	{
		if (bgm.GetPlayStatus() == MUSIC_MODE_STOP)
		{
			//从头开始播放
			bgm.Play(0);
		}
	}
}

主函数中使用pthread_t 创建线程标识符
使用pthread_create 函数创建线程,具体代码如下

int main()
{
	//初始化线程标识符
	pthread_t t1;
	//设置屏幕刷新率
	int nfps = 120;
	//初始化全局数据及图形
	initgr();
	//初始化启动页
	initmenu();
	//创建背景音乐播放线程
	pthread_create(&t1, NULL, bgmplay, NULL);
	//创建game对象并赋值
	Game game(10, 20, 24, 24);
	//方块长和宽
	game.m_base_x = 20;
	game.m_base_y = 20;
	//方块下落速度
	game.m_droptime = nfps / 2;
	//方块左右移动速度
	game.m_movxtime = 10;
	//设置刷新模式为手动刷新
	setrendermode(RENDER_MANUAL);
	
	//游戏主循环
	for (; is_run(); delay_fps(nfps)) 
	{
		//游戏逻辑更新
		game.update();
		//游戏图形更新
		game.render();
	}
	//关闭画布
	closegraph();
	//关闭背景音乐
	/*bgm.Stop();
	bgm.Close();*/
	return 0;
}

至此,背景音乐的播放将不会影响游戏的运行。

你可能感兴趣的:(C语言中使用多线程播放游戏背景音乐)