新人求助,怎样在音乐游戏中怎么让音符随着节奏出现

本人想做一个微信音游小游戏,但是做的时候发现以我目前掌握的只是不能一直在一个固定的时间节点产生音符,我现在想到的方法如下:

以在1.6秒产生一个音符为例,在1.6s与1.6+0.05s之间检测update第一次得到的超过1.6s的时间,在这个时间中做出产生音符的动作,然后在1.65s后再设置一个时间段来让temp这个变量归零。

var temp=0;
cc.Class({
extends: cc.Component,

  update(dt){
    var timeNow=cc.audioEngine.getCurrentTime(BGM_id);
    if(timeNow>1.6&&timeNow<1.6+0.05){
        temp++;
        if(temp===1){
         //产生音符动作的代码在这里写
        }
    }
    if(timeNow>1.6+0.05&&timeNow<1.6+0.05+0.05)
    {
        temp=0;
    }
}

});

缺点是占用了0.1s(两个固定时间段,上面例子中固定时间段设为0.05)的时间,而且如果很多音符在在一个密集的时间段中出现的话要创建很多作用与temp相同的变量,应该会很麻烦。请问大家有没有比较优秀的方法能实现这个功能?

1赞

var timeNow;
var endTime=120;
cc.Class({
extends: cc.Component,

update(dt){
    timeNow=cc.audioEngine.getCurrentTime(BGM_id);
    this.a(1.6);
},
a (startTime){
    if(timeNow>startTime&&timeNow<endTime){
        endTime=timeNow;
        //产生动作的代码在这里编写
    }
}

});

以1.6s产生一个音符动作为例,假设1.6s后的第一帧为1.62
又想了一种方法,大体上是这样的,创建一个全局变量endTime,一开始endTime为整首歌曲的总时长,因为我们timeNow(这首歌曲已经播放的时长)是在(1.6,endTime)这个范围内的。如果想要只让游戏在1.6s后的第一帧产生动作,只需要在产生这个动作以后将endTime变为1.6s后第一帧的时间即可,也就是将范围变为(1.6,1.62)。
但是,由于我做的游戏整首歌曲需要产生很多音符,大部分音符产生的动作都是不一样的,所以需要创建许多全局变量,这是缺点。
优点就是节省了判断的时间,只占用了1.6s后的第一帧。
希望有大佬有更好的方案交流一下,初学者表示以目前的书评大概只能想到这里了,但是我还会继续学习的,欢迎大家发表自己的意见~

    我没有做过音游,不过也有做一个音游demo的想法,对于音符动画产生这点我也想了一下。我觉得你将 (当前时间>某个时间&&当前时间<某个时间) 来判断的做法不太合适,一方面是显得罗嗦;另一方面是我猜测这样做去判断如果某些卡顿的时候,两帧间隔由于逻辑处理或渲染导致时间过长也许会导致漏掉某个音符(这点我不确定,不知道处理音频的线程是怎样的机制 如果有人了解能告知的话,非常感谢 )。

    我的想法是每首曲子中所有音符动画相关数据事先肯定需要配置好,在每关开始游戏的时候将这些配置表数据读取出来,例如:

/**
 * 读取配置表后的音符(节奏点)配置数组,按照音符动画出现时间排序(简化问题只写了time一个属性,实际中区分不同类型的音符至少还需要一个类型属性做区分)
 * time为每个音符出现的时间
 */
let KEYS = [
	{
		time: 0.15
	},
	{
		time: 0.16
	},
	{
		time: 0.16
	},
	{
		time: 0.80
	},
	{
		time: 2.20
	}
];

update(dt) {
	let timeNow = cc.audioEngine.getCurrentTime(id); // 当前曲子已播放时间
	while(1) {
		if (KEYS.length === 0) {
			// 所有音符动画都已播放
			return;
		}
		if (KEYS[0].time > timeNow) {
			// 未到播音符动画的时间
			return;
		}

		let key = KEYS.shift(); // 当前需要播放的音符数据
		// 以下省略执行产生音符的相关操作
	}
}

    因为没有音游经验也不了解一些成熟音游的实现方式,如果有什么错误或更好的方式的话麻烦告知。顺便向题主求一下美术经验(我是个美术苦手。。。):blush:

1赞

你的方法感觉很棒,因为学的比较少,我还没接触过配置表这部分的知识,你说完了以后感觉程序方便可以优化很多了,非常感谢,又拓展思路了。
程序员表示没有美术经验欸,不过我做的动作大概就是用对象池和cc.action组成的一系列动作,只需要美术人员画一些音符的图片就行,其实我想做的是类似Just Shapes & Beats这样的游戏

嗯,我现在感觉用配置设计会好一些,三楼的方法能更好一些,因为你的this.time是一直加update中的dt,这样的this.time有可能是不等于delay的,所以只能检测超过delay的第一帧,然后产生音符。我测试了很多次没有几次是正好与某个时间点相等的