做大一下期期末设计时遇到一个问题,游戏运行时循环播放背景音乐这个情况下,如果音乐播放完毕,加入判断函数判断是否结束,如果结束则重新播放,但是在游戏中,音乐播放完毕到音乐重新开始播放中间会有一个间隙,这个间隙游戏也会卡顿,主函数代码如下:
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;}
至此,背景音乐的播放将不会影响游戏的运行。