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

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头文件
详见文章: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语言中使用多线程播放游戏背景音乐相关推荐

  1. 播放游戏背景音乐 步骤

    播放游戏背景音乐 步骤 1.书写音乐播放的service public class MusicService extends Service {private static final int MUS ...

  2. c语言中全局变量多线程调用-局部变量、静态局部变量、全局变量与静态全局变量分析

    基本概念: 作用域:起作用的区域,也就是可以工作的范围. 代码块:所谓代码块,就是用{}括起来的一段代码. 数据段:数据段存的是数,像全局变量就是存在数据段的 代码段:存的是程序代码,一般是只读的. ...

  3. 【多线程】c语言中的多线程

    线程 Thread:专业术语称之为程序执行流的最小单元 .线程是不会执行程序的,可以理解成线程就是一个载体,将 要执行的代码 运送到CPU进行处理. 多线程就是多个线程同时并发执行. 1. 为什么用多 ...

  4. C语言中的多线程简介

    线程 Thread 专业术语称之为程序执行流的最小单元 .线程是不会执行程序的,可以理解成线程就是一个载体,将 要执行的代码 运送到CPU进行处理. 多线程就是多个线程同时并发执行. (注意并发与并行 ...

  5. c语言中锁的作用,C语言中的多线程死锁

    我是C的新手,在下面的多线程场景中,N个线程从一个二进制文件中读取,并写入自己的单独文件,例如线程1写入文件1,线程2写入文件2,等等. 这对~2/3个线程有效,但对于其他线程,它似乎陷入了死锁,但我 ...

  6. 电脑c语言小游戏,C语言中的一个小游戏的排行榜系统...

    我把你的代码改了一下,我已经运行过了,你看看 #include #include #include int play(int suiji); void paihangbang(struct p a[1 ...

  7. c语言中的多线程的实现

    一.多线程的概念及程序实现 1.什么是多线程? 线程:(LWP)线程是轻量级的进程,进程是资源分配的最小单位,线程是调度的最小单位.(同一个进程下)线程共用同一个进程的资源.多线程在切换的时候要比多进 ...

  8. HTML中插入自动播放的背景音乐-亲测有效

    很简单,使用audio标签把它放在body或head里面就行 <audio src="yp/sybj.mp3" id="dd" autoplay=&quo ...

  9. c语言中的猜字谜游戏

    #include <stdio.h> #include <string.h> #include <windows.h>    //定义了Windows的所有资料型态 ...

最新文章

  1. 通过几个问题深入分析Vue中的diff原理
  2. 《Android编程权威指南》-读书笔记(七) -处理旋转设备
  3. ASP.NET Core 1.0到底是什么?
  4. Elasticsearch集群节点配置详解
  5. python mvc_python mvc设计模式(一)
  6. 抗艾滋病药物行业调研报告 - 市场现状分析与发展前景预测
  7. 如何发布第一个属于自己的npm包
  8. react怎么引入jquery_在react里面使用jquery插件
  9. Ubuntu系统安装Java JDK和HDFView
  10. SQL往表里添加字段
  11. 什么是资本的本质?到如何认清一个人的本质?
  12. 带CAN唤醒能力的TJA1043
  13. PyQt5 打造GUI爬虫 小说下载器
  14. WEB基础之:CSS字体
  15. echarts二次渲染时宽高为0图表不显示
  16. jquery给input赋值 val()方法
  17. 6个炒菜习惯 丢失营养
  18. 游戏设计艺术 第2版 第30章 读书笔记
  19. CUBA 使用 Spring 查询接口
  20. Unity 2.Space Shooter(碰撞器Collider,WebGL,刚体中属性,(定时)实例化、销毁游戏对象,触碰OnTriggerEnter/Exit,爆炸效果,音频,文字,定时调方法)

热门文章

  1. Link-time optimization LTO分析
  2. java毕业设计巴音学院学生资料管理系统Mybatis+系统+数据库+调试部署
  3. O泡恶搞v1.0安卓
  4. Office2003与Office2007/2010共存方法
  5. 「三年河东、三年河西」ADAS新一轮竞赛“重构”市场格局
  6. iDeneb v1.6 安装教程(含中文自定义详细驱动说明)
  7. ORB-SLAM3从理论到代码实现(六):地图回环优化
  8. 例说数学学习中的四基
  9. springboot模拟天猫整站,分类管理系统后端设计实现(分页以及增加删除)
  10. fastadmin框架将上传图片提示由英文更改为中文