implement sounds
This commit is contained in:
@@ -62,6 +62,11 @@ window.GameWindow = class {
|
|||||||
|
|
||||||
// Mouse buttons
|
// Mouse buttons
|
||||||
document.addEventListener('click', function (event) {
|
document.addEventListener('click', function (event) {
|
||||||
|
// Create sound engine (It has to be created after user interaction)
|
||||||
|
if(!minecraft.soundManager.isCreated()) {
|
||||||
|
minecraft.soundManager.create(minecraft.worldRenderer);
|
||||||
|
}
|
||||||
|
|
||||||
// Handle in-game mouse click
|
// Handle in-game mouse click
|
||||||
minecraft.onMouseClicked(event.button);
|
minecraft.onMouseClicked(event.button);
|
||||||
|
|
||||||
|
|||||||
@@ -45,6 +45,9 @@ window.Minecraft = class {
|
|||||||
this.world = new World(this);
|
this.world = new World(this);
|
||||||
this.worldRenderer.scene.add(this.world.group);
|
this.worldRenderer.scene.add(this.world.group);
|
||||||
|
|
||||||
|
// Create sound manager
|
||||||
|
this.soundManager = new SoundManager();
|
||||||
|
|
||||||
// Create player
|
// Create player
|
||||||
this.player = new Player(this, this.world);
|
this.player = new Player(this, this.world);
|
||||||
this.inventory = new Inventory();
|
this.inventory = new Inventory();
|
||||||
@@ -200,7 +203,19 @@ window.Minecraft = class {
|
|||||||
// Destroy block
|
// Destroy block
|
||||||
if (button === 0) {
|
if (button === 0) {
|
||||||
if (hitResult != null) {
|
if (hitResult != null) {
|
||||||
this.world.setBlockAt(hitResult.x, hitResult.y, hitResult.z, 0);
|
// Get previous block
|
||||||
|
let typeId = this.world.getBlockAt(hitResult.x, hitResult.y, hitResult.z);
|
||||||
|
let block = Block.getById(typeId);
|
||||||
|
|
||||||
|
if (typeId !== 0) {
|
||||||
|
let soundName = block.getSound().getBreakSound();
|
||||||
|
|
||||||
|
// Play sound
|
||||||
|
this.soundManager.playSound(soundName, hitResult.x + 0.5, hitResult.y + 0.5, hitResult.z + 0.5, 1.0);
|
||||||
|
|
||||||
|
// Destroy block
|
||||||
|
this.world.setBlockAt(hitResult.x, hitResult.y, hitResult.z, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -227,13 +242,17 @@ window.Minecraft = class {
|
|||||||
if (!placedBoundingBox.intersects(this.player.boundingBox)) {
|
if (!placedBoundingBox.intersects(this.player.boundingBox)) {
|
||||||
let typeId = this.inventory.getItemInSelectedSlot();
|
let typeId = this.inventory.getItemInSelectedSlot();
|
||||||
if (typeId !== 0) {
|
if (typeId !== 0) {
|
||||||
|
|
||||||
// Place block
|
// Place block
|
||||||
this.world.setBlockAt(x, y, z, typeId);
|
this.world.setBlockAt(x, y, z, typeId);
|
||||||
|
|
||||||
// Handle block abilities
|
// Handle block abilities
|
||||||
let block = Block.getById(typeId);
|
let block = Block.getById(typeId);
|
||||||
block.onBlockPlaced(this.world, x, y, z, hitResult.face);
|
block.onBlockPlaced(this.world, x, y, z, hitResult.face);
|
||||||
|
|
||||||
|
// Play sound
|
||||||
|
let sound = block.getSound();
|
||||||
|
let soundName = sound.getStepSound();
|
||||||
|
this.soundManager.playSound(soundName, hitResult.x + 0.5, hitResult.y + 0.5, hitResult.z + 0.5, sound.getPitch() * 0.8);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,6 +43,9 @@ window.Player = class {
|
|||||||
this.prevFovModifier = 0;
|
this.prevFovModifier = 0;
|
||||||
this.fovModifier = 0;
|
this.fovModifier = 0;
|
||||||
this.timeFovChanged = 0;
|
this.timeFovChanged = 0;
|
||||||
|
|
||||||
|
this.distanceWalked = 0;
|
||||||
|
this.nextStepDistance = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
respawn() {
|
respawn() {
|
||||||
@@ -242,6 +245,9 @@ window.Player = class {
|
|||||||
travel(forward, vertical, strafe) {
|
travel(forward, vertical, strafe) {
|
||||||
let prevSlipperiness = this.getBlockSlipperiness() * 0.91;
|
let prevSlipperiness = this.getBlockSlipperiness() * 0.91;
|
||||||
|
|
||||||
|
let prevX = this.x;
|
||||||
|
let prevZ = this.z;
|
||||||
|
|
||||||
let value = 0.16277136 / (prevSlipperiness * prevSlipperiness * prevSlipperiness);
|
let value = 0.16277136 / (prevSlipperiness * prevSlipperiness * prevSlipperiness);
|
||||||
let friction;
|
let friction;
|
||||||
|
|
||||||
@@ -268,6 +274,28 @@ window.Player = class {
|
|||||||
this.motionX *= slipperiness;
|
this.motionX *= slipperiness;
|
||||||
this.motionY *= 0.98;
|
this.motionY *= 0.98;
|
||||||
this.motionZ *= slipperiness;
|
this.motionZ *= slipperiness;
|
||||||
|
|
||||||
|
let blockX = MathHelper.floor_double(this.x);
|
||||||
|
let blockY = MathHelper.floor_double(this.y - 0.2);
|
||||||
|
let blockZ = MathHelper.floor_double(this.z);
|
||||||
|
let typeId = this.world.getBlockAt(blockX, blockY, blockZ);
|
||||||
|
|
||||||
|
let distanceX = this.x - prevX;
|
||||||
|
let distanceZ = this.z - prevZ;
|
||||||
|
|
||||||
|
// Step sound
|
||||||
|
this.distanceWalked += Math.sqrt(distanceX * distanceX + distanceZ * distanceZ) * 0.6;
|
||||||
|
if (this.distanceWalked > this.nextStepDistance && typeId !== 0) {
|
||||||
|
this.nextStepDistance++;
|
||||||
|
|
||||||
|
let block = Block.getById(typeId);
|
||||||
|
let sound = block.getSound();
|
||||||
|
|
||||||
|
// Play sound
|
||||||
|
if (!block.isLiquid()) {
|
||||||
|
this.minecraft.soundManager.playSound(sound.getStepSound(), this.x, this.y, this.z, sound.getPitch());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
getBlockSlipperiness() {
|
getBlockSlipperiness() {
|
||||||
|
|||||||
@@ -0,0 +1,88 @@
|
|||||||
|
window.SoundManager = class {
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this.audioLoader = new THREE.AudioLoader();
|
||||||
|
this.audioListener = null;
|
||||||
|
|
||||||
|
this.soundPool = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
create(worldRenderer) {
|
||||||
|
this.scene = worldRenderer.scene;
|
||||||
|
|
||||||
|
this.audioListener = new THREE.AudioListener();
|
||||||
|
worldRenderer.camera.add(this.audioListener);
|
||||||
|
|
||||||
|
// Load initial sound pool
|
||||||
|
for (let i in Block.sounds) {
|
||||||
|
let sound = Block.sounds[i];
|
||||||
|
|
||||||
|
// Load sound types
|
||||||
|
this.loadSoundPool(sound.getStepSound());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
loadSoundPool(name) {
|
||||||
|
let pool = [];
|
||||||
|
let amount = 4;
|
||||||
|
|
||||||
|
// Load all sounds into pool
|
||||||
|
let path = name.replace(".", "/");
|
||||||
|
for (let i = 0; i < amount; i++) {
|
||||||
|
let sound = this.loadSound('src/resources/sound/' + path + (i + 1) + '.ogg');
|
||||||
|
pool.push(sound);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Register sound pool
|
||||||
|
this.soundPool[name] = pool;
|
||||||
|
}
|
||||||
|
|
||||||
|
loadSound(path) {
|
||||||
|
let scope = this;
|
||||||
|
|
||||||
|
// Create sound
|
||||||
|
let sound = new THREE.PositionalAudio(this.audioListener);
|
||||||
|
sound.setRefDistance(0.1);
|
||||||
|
sound.setRolloffFactor(6);
|
||||||
|
sound.setFilter(sound.context.createBiquadFilter());
|
||||||
|
|
||||||
|
// Load sound
|
||||||
|
this.audioLoader.load(path, function (buffer) {
|
||||||
|
sound.setBuffer(buffer);
|
||||||
|
scope.scene.add(sound);
|
||||||
|
});
|
||||||
|
|
||||||
|
return sound;
|
||||||
|
}
|
||||||
|
|
||||||
|
playSound(name, x, y, z, pitch) {
|
||||||
|
let pool = this.soundPool[name];
|
||||||
|
|
||||||
|
if (typeof pool === "undefined") {
|
||||||
|
// Load sound pool
|
||||||
|
this.loadSoundPool(name);
|
||||||
|
} else if (pool.length > 0) {
|
||||||
|
// Play random sound in pool
|
||||||
|
let sound = pool[Math.floor(Math.random() * pool.length)];
|
||||||
|
|
||||||
|
// Stop previous sound
|
||||||
|
if (sound.isPlaying) {
|
||||||
|
sound.stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update position
|
||||||
|
sound.position.set(x, y, z);
|
||||||
|
|
||||||
|
// Update pitch
|
||||||
|
sound.filters[0].frequency.setValueAtTime(12000 * pitch, sound.context.currentTime);
|
||||||
|
|
||||||
|
// Play sound
|
||||||
|
sound.play();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
isCreated() {
|
||||||
|
return !(this.audioListener === null);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -2,7 +2,18 @@ window.Block = class {
|
|||||||
|
|
||||||
static blocks = new Map();
|
static blocks = new Map();
|
||||||
|
|
||||||
|
static sounds = {};
|
||||||
|
|
||||||
static create() {
|
static create() {
|
||||||
|
// Sounds
|
||||||
|
Block.sounds.stone = new Sound("stone", 1.0);
|
||||||
|
Block.sounds.wood = new Sound("wood", 1.0);
|
||||||
|
Block.sounds.gravel = new Sound("gravel", 1.0);
|
||||||
|
Block.sounds.grass = new Sound("grass", 1.0);
|
||||||
|
Block.sounds.cloth = new Sound("cloth", 1.0);
|
||||||
|
Block.sounds.sand = new Sound("sand", 1.0);
|
||||||
|
|
||||||
|
// Blocks
|
||||||
Block.STONE = new BlockStone(1, 0);
|
Block.STONE = new BlockStone(1, 0);
|
||||||
Block.GRASS = new BlockGrass(2, 1);
|
Block.GRASS = new BlockGrass(2, 1);
|
||||||
Block.DIRT = new BlockDirt(3, 2);
|
Block.DIRT = new BlockDirt(3, 2);
|
||||||
@@ -17,8 +28,12 @@ window.Block = class {
|
|||||||
this.id = id;
|
this.id = id;
|
||||||
this.textureSlotId = textureSlotId;
|
this.textureSlotId = textureSlotId;
|
||||||
|
|
||||||
|
// Bounding box
|
||||||
this.boundingBox = new BoundingBox(0.0, 0.0, 0.0, 1.0, 1.0, 1.0);
|
this.boundingBox = new BoundingBox(0.0, 0.0, 0.0, 1.0, 1.0, 1.0);
|
||||||
|
|
||||||
|
// Default sound
|
||||||
|
this.sound = Block.sounds.stone;
|
||||||
|
|
||||||
// Register block
|
// Register block
|
||||||
Block.blocks.set(id, this);
|
Block.blocks.set(id, this);
|
||||||
}
|
}
|
||||||
@@ -60,6 +75,14 @@ window.Block = class {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
isLiquid() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
getSound() {
|
||||||
|
return this.sound;
|
||||||
|
}
|
||||||
|
|
||||||
getBoundingBox(world, x, y, z) {
|
getBoundingBox(world, x, y, z) {
|
||||||
return this.boundingBox;
|
return this.boundingBox;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,9 @@ window.BlockDirt = class extends Block {
|
|||||||
|
|
||||||
constructor(id, textureSlotId) {
|
constructor(id, textureSlotId) {
|
||||||
super(id, textureSlotId);
|
super(id, textureSlotId);
|
||||||
|
|
||||||
|
// Sound
|
||||||
|
this.sound = Block.sounds.gravel;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -2,6 +2,9 @@ window.BlockGrass = class extends Block {
|
|||||||
|
|
||||||
constructor(id, textureSlotId) {
|
constructor(id, textureSlotId) {
|
||||||
super(id, textureSlotId);
|
super(id, textureSlotId);
|
||||||
|
|
||||||
|
// Sound
|
||||||
|
this.sound = Block.sounds.grass;
|
||||||
}
|
}
|
||||||
|
|
||||||
getTextureForFace(face) {
|
getTextureForFace(face) {
|
||||||
|
|||||||
@@ -2,6 +2,9 @@ window.BlockLeave = class extends Block {
|
|||||||
|
|
||||||
constructor(id, textureSlotId) {
|
constructor(id, textureSlotId) {
|
||||||
super(id, textureSlotId);
|
super(id, textureSlotId);
|
||||||
|
|
||||||
|
// Sound
|
||||||
|
this.sound = Block.sounds.grass;
|
||||||
}
|
}
|
||||||
|
|
||||||
getOpacity() {
|
getOpacity() {
|
||||||
|
|||||||
@@ -2,6 +2,9 @@ window.BlockLog = class extends Block {
|
|||||||
|
|
||||||
constructor(id, textureSlotId) {
|
constructor(id, textureSlotId) {
|
||||||
super(id, textureSlotId);
|
super(id, textureSlotId);
|
||||||
|
|
||||||
|
// Sound
|
||||||
|
this.sound = Block.sounds.wood;
|
||||||
}
|
}
|
||||||
|
|
||||||
getTextureForFace(face) {
|
getTextureForFace(face) {
|
||||||
|
|||||||
@@ -2,6 +2,9 @@ window.BlockSand = class extends Block {
|
|||||||
|
|
||||||
constructor(id, textureSlotId) {
|
constructor(id, textureSlotId) {
|
||||||
super(id, textureSlotId);
|
super(id, textureSlotId);
|
||||||
|
|
||||||
|
// Sound
|
||||||
|
this.sound = Block.sounds.sand;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -5,6 +5,9 @@ window.BlockTorch = class extends Block {
|
|||||||
|
|
||||||
this.boundingBox = new BoundingBox(0.4, 0.0, 0.4, 0.6, 0.6, 0.6);
|
this.boundingBox = new BoundingBox(0.4, 0.0, 0.4, 0.6, 0.6, 0.6);
|
||||||
|
|
||||||
|
// Sound
|
||||||
|
this.sound = Block.sounds.wood;
|
||||||
|
|
||||||
// Create data faces
|
// Create data faces
|
||||||
this.dataFaces = [
|
this.dataFaces = [
|
||||||
EnumBlockFace.WEST,
|
EnumBlockFace.WEST,
|
||||||
|
|||||||
@@ -12,6 +12,10 @@ window.BlockWater = class extends Block {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
isLiquid() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
canInteract() {
|
canInteract() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
window.Sound = class {
|
||||||
|
|
||||||
|
constructor(name, pitch) {
|
||||||
|
this.name = name;
|
||||||
|
this.pitch = pitch;
|
||||||
|
}
|
||||||
|
|
||||||
|
getBreakSound() {
|
||||||
|
return "step." + this.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
getStepSound() {
|
||||||
|
return "step." + this.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
getPitch() {
|
||||||
|
return this.pitch;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -106,6 +106,8 @@ loadTexture([
|
|||||||
"src/js/net/minecraft/client/gui/screens/GuiControls.js",
|
"src/js/net/minecraft/client/gui/screens/GuiControls.js",
|
||||||
"src/js/net/minecraft/client/gui/screens/GuiIngameMenu.js",
|
"src/js/net/minecraft/client/gui/screens/GuiIngameMenu.js",
|
||||||
"src/js/net/minecraft/client/GameWindow.js",
|
"src/js/net/minecraft/client/GameWindow.js",
|
||||||
|
"src/js/net/minecraft/client/sound/SoundManager.js",
|
||||||
|
"src/js/net/minecraft/client/world/block/sound/Sound.js",
|
||||||
"src/js/net/minecraft/client/world/block/Block.js",
|
"src/js/net/minecraft/client/world/block/Block.js",
|
||||||
"src/js/net/minecraft/client/world/block/BlockStone.js",
|
"src/js/net/minecraft/client/world/block/BlockStone.js",
|
||||||
"src/js/net/minecraft/client/world/block/BlockGrass.js",
|
"src/js/net/minecraft/client/world/block/BlockGrass.js",
|
||||||
|
|||||||
Reference in New Issue
Block a user