700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > C语言中使用多线程播放游戏背景音乐

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

时间:2022-04-22 01:34:27

相关推荐

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图形库中的俄罗斯方块的核心算法。

游戏页面如下:

下面开始讲解如何使用多线程的方式来解决该问题。

首先,配置pthread.h头文件

详见文章:/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;}

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。