Added license files and improved audio engine
This commit is contained in:
+108
-27
@@ -4,58 +4,139 @@ bkcore.Audio = {};
|
||||
bkcore.Audio.sounds = {};
|
||||
|
||||
bkcore.Audio.init = function(){
|
||||
bkcore.Audio._ctx = new (window.AudioContext||window.webkitAudioContext);
|
||||
bkcore.Audio._panner = bkcore.Audio._ctx.createPanner();
|
||||
bkcore.Audio._panner.connect(bkcore.Audio._ctx.destination);
|
||||
if(window.AudioContext||window.webkitAudioContext){
|
||||
bkcore.Audio._ctx = new (window.AudioContext||window.webkitAudioContext)();
|
||||
bkcore.Audio._panner = bkcore.Audio._ctx.createPanner();
|
||||
bkcore.Audio._panner.connect(bkcore.Audio._ctx.destination);
|
||||
}
|
||||
else {
|
||||
bkcore.Audio._ctx = null;
|
||||
}
|
||||
|
||||
bkcore.Audio.posMultipler = 1.5;
|
||||
};
|
||||
|
||||
bkcore.Audio.init();
|
||||
|
||||
bkcore.Audio.addSound = function(src, id, loop, callback){
|
||||
bkcore.Audio.addSound = function(src, id, loop, callback, usePanner){
|
||||
var ctx = bkcore.Audio._ctx;
|
||||
var audio = new Audio();
|
||||
audio.src = src;
|
||||
audio.addEventListener('canplay', callback, false);
|
||||
audio.loop = loop;
|
||||
audio.load();
|
||||
|
||||
if(ctx){
|
||||
var mediasrc = ctx.createMediaElementSource(audio);
|
||||
mediasrc.connect(bkcore.Audio._panner);
|
||||
var audio = { src: null, gainNode: null, bufferNode: null, loop: loop };
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.responseType = 'arraybuffer';
|
||||
|
||||
xhr.onload = function(){
|
||||
ctx.decodeAudioData(xhr.response, function(b){
|
||||
// Create Gain Node
|
||||
var gainNode = ctx.createGain();
|
||||
|
||||
if(usePanner === true){
|
||||
gainNode.connect(bkcore.Audio._panner);
|
||||
}
|
||||
else {
|
||||
gainNode.connect(ctx.destination);
|
||||
}
|
||||
|
||||
// Add the audio source
|
||||
audio.src = b;
|
||||
|
||||
//Remember the gain node
|
||||
audio.gainNode = gainNode;
|
||||
|
||||
callback();
|
||||
}, function(e){
|
||||
console.error('Audio decode failed!', e);
|
||||
});
|
||||
};
|
||||
|
||||
xhr.open('GET', src, true);
|
||||
xhr.send(null);
|
||||
}
|
||||
else {
|
||||
// Workaround for old Safari
|
||||
audio.addEventListener('canplay', function(){
|
||||
audio.pause();
|
||||
audio.currentTime = 0;
|
||||
|
||||
callback();
|
||||
}, false);
|
||||
|
||||
audio.autoplay = true;
|
||||
audio.loop = loop;
|
||||
audio.src = src;
|
||||
}
|
||||
|
||||
bkcore.Audio.sounds[id] = audio;
|
||||
};
|
||||
|
||||
bkcore.Audio.play = function(id){
|
||||
if(bkcore.Audio.sounds[id].currentTime > 0){
|
||||
bkcore.Audio.sounds[id].pause();
|
||||
bkcore.Audio.sounds[id].currentTime = 0;
|
||||
var ctx = bkcore.Audio._ctx;
|
||||
|
||||
if(ctx){
|
||||
var sound = ctx.createBufferSource();
|
||||
sound.connect(bkcore.Audio.sounds[id].gainNode);
|
||||
|
||||
sound.buffer = bkcore.Audio.sounds[id].src;
|
||||
sound.loop = bkcore.Audio.sounds[id].loop;
|
||||
|
||||
bkcore.Audio.sounds[id].gainNode.gain.value = 1;
|
||||
bkcore.Audio.sounds[id].bufferNode = sound;
|
||||
|
||||
sound.start ? sound.start(0) : sound.noteOn(0);
|
||||
}
|
||||
else {
|
||||
if(bkcore.Audio.sounds[id].currentTime > 0){
|
||||
bkcore.Audio.sounds[id].pause();
|
||||
bkcore.Audio.sounds[id].currentTime = 0;
|
||||
}
|
||||
|
||||
bkcore.Audio.sounds[id].play();
|
||||
}
|
||||
bkcore.Audio.sounds[id].play();
|
||||
};
|
||||
|
||||
bkcore.Audio.stop = function(id){
|
||||
bkcore.Audio.sounds[id].pause();
|
||||
bkcore.Audio.sounds[id].currentTime = 0;
|
||||
var ctx = bkcore.Audio._ctx;
|
||||
|
||||
if(ctx){
|
||||
if(bkcore.Audio.sounds[id].bufferNode !== null){
|
||||
bkcore.Audio.sounds[id].bufferNode.disconnect();
|
||||
bkcore.Audio.sounds[id].bufferNode = null;
|
||||
}
|
||||
}
|
||||
else {
|
||||
bkcore.Audio.sounds[id].pause();
|
||||
bkcore.Audio.sounds[id].currentTime = 0;
|
||||
}
|
||||
};
|
||||
|
||||
bkcore.Audio.volume = function(id,volume){
|
||||
bkcore.Audio.sounds[id].volume = volume;
|
||||
bkcore.Audio.volume = function(id, volume){
|
||||
var ctx = bkcore.Audio._ctx;
|
||||
|
||||
if(ctx){
|
||||
bkcore.Audio.sounds[id].gainNode.gain.value = volume;
|
||||
}
|
||||
else {
|
||||
bkcore.Audio.sounds[id].volume = volume;
|
||||
}
|
||||
};
|
||||
|
||||
bkcore.Audio.setListenerPos = function(vec){
|
||||
var panner = bkcore.Audio._panner;
|
||||
var vec2 = vec.normalize();
|
||||
panner.setPosition(
|
||||
vec2.x * bkcore.Audio.posMultipler,
|
||||
vec2.y * bkcore.Audio.posMultipler,
|
||||
vec2.z * bkcore.Audio.posMultipler
|
||||
);
|
||||
if(bkcore.Audio._ctx){
|
||||
var panner = bkcore.Audio._panner;
|
||||
var vec2 = vec.normalize();
|
||||
panner.setPosition(
|
||||
vec2.x * bkcore.Audio.posMultipler,
|
||||
vec2.y * bkcore.Audio.posMultipler,
|
||||
vec2.z * bkcore.Audio.posMultipler
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
bkcore.Audio.setListenerVelocity = function(vec){
|
||||
var panner = bkcore.Audio._panner;
|
||||
panner.setVelocity(vec.x, vec.y, vec.z);
|
||||
if(bkcore.Audio._ctx){
|
||||
var panner = bkcore.Audio._panner;
|
||||
panner.setVelocity(vec.x, vec.y, vec.z);
|
||||
}
|
||||
};
|
||||
@@ -114,8 +114,8 @@ bkcore.hexgl.HexGL.prototype.reset = function()
|
||||
this.gameplay.start();
|
||||
|
||||
bkcore.Audio.play('bg');
|
||||
bkcore.Audio.volume('wind', 0.05);
|
||||
bkcore.Audio.play('wind');
|
||||
bkcore.Audio.volume('wind', 0.35);
|
||||
}
|
||||
|
||||
bkcore.hexgl.HexGL.prototype.restart = function()
|
||||
@@ -173,7 +173,7 @@ bkcore.hexgl.HexGL.prototype.initGameplay = function()
|
||||
|
||||
bkcore.Audio.play('bg');
|
||||
bkcore.Audio.play('wind');
|
||||
bkcore.Audio.volume('wind',0.05);
|
||||
bkcore.Audio.volume('wind', 0.35);
|
||||
}
|
||||
|
||||
bkcore.hexgl.HexGL.prototype.displayScore = function(f, l)
|
||||
|
||||
@@ -628,7 +628,6 @@ bkcore.hexgl.ShipControls.prototype.collisionCheck = function(dt)
|
||||
|
||||
if(collision.r < 255)
|
||||
{
|
||||
if(this.boost > 0) bkcore.Audio.stop('boost');
|
||||
bkcore.Audio.play('crash');
|
||||
|
||||
// Shield
|
||||
|
||||
@@ -87,23 +87,28 @@ bkcore.hexgl.tracks.Cityscape = {
|
||||
sounds: {
|
||||
bg: {
|
||||
src: 'audio/bg.mp3',
|
||||
loop: true
|
||||
loop: true,
|
||||
usePanner: false
|
||||
},
|
||||
crash: {
|
||||
src: 'audio/crash.mp3',
|
||||
loop: false
|
||||
loop: false,
|
||||
usePanner: true
|
||||
},
|
||||
destroyed: {
|
||||
src: 'audio/destroyed.mp3',
|
||||
loop: false
|
||||
loop: false,
|
||||
usePanner: false
|
||||
},
|
||||
boost: {
|
||||
src: 'audio/boost.mp3',
|
||||
loop: false
|
||||
loop: false,
|
||||
usePanner: true
|
||||
},
|
||||
wind: {
|
||||
src: 'audio/wind.mp3',
|
||||
loop: true
|
||||
loop: true,
|
||||
usePanner: true
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -91,7 +91,7 @@ bkcore.threejs.Loader.prototype.load = function(data)
|
||||
this.loadImage(i, data.images[i]);
|
||||
|
||||
for(var s in data.sounds)
|
||||
this.loadSound(data.sounds[s].src, s, data.sounds[s].loop);
|
||||
this.loadSound(data.sounds[s].src, s, data.sounds[s].loop, data.sounds[s].usePanner);
|
||||
|
||||
this.progressCallback.call(this, this.progress);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user