javascript Phaser 3:如何根据与玩家的距离设置对象的音量?

nlejzf6q  于 2023-01-24  发布在  Java
关注(0)|答案(1)|浏览(111)

我正在用Phaser 3编写一个游戏,我有一个移动的手推车。我为手推车添加了一个声音,但是无论玩家离它有多远,只要手推车开始移动,它就可以听到。我想设置手推车的音量,如果玩家离它很远,声音基本上会被静音,并且它的音量会根据它的接近程度而增加/减少。
我找到了this link,并尝试将其应用到我的代码中,但没有成功,所以我尝试对其进行一些修改,看看是否可以使其工作。
我现在的代码是这样的:

preload() {
  this.load.audio("cartSound", "assets/audios/cart.mp3");
}

startCart1Movement() {
  this.startCartSound();
}

startCartSound() {
  this.distanceThreshold = 400;
  this.distanceToObject = Phaser.Math.Distance.Between(
    this.player.x, this.player.y, this.cart1.x, this.cart1.y
  );
  this.cartSound.setVolume(
    1 - (this.distanceToObject / this.distanceThreshold)
  );
  this.cartSound.play();
}

startCartSound函数是完整读取的,因为如果我在末尾添加一个console.log,计算机将读取它,但cart声音仍然没有变化。
有人能帮我吗?先谢谢你了。

rqmkfv5c

rqmkfv5c1#

这个例子应该可以在这里工作,一个使用或多或少相同代码的工作例子,它工作了。只要点击画布,你应该听到不同。(也许对你来说,400px阈值太或太,声音差异无法生效)

    • 这里有一个简短的演示:**
  • (您可以调整速度和要测试的最大距离的值,即听到声音的距离)*
document.body.style = 'margin:0;';

var player
var soundPoint
var sound
var playing = false;

var config = {
    type: Phaser.AUTO,
    width: 536,
    height: 183,
    physics: {
        default: 'arcade',
    },
    scene: {
        preload,
        create,
        update
    },
    banner: false
}; 

function preload(){
    this.load.audio('sound', [  'https://labs.phaser.io/assets/audio/CatAstroPhi_shmup_normal.ogg',  'https://labs.phaser.io/assets/audio/CatAstroPhi_shmup_normal.mp3'
    ]);
}

function create () {
    this.add.text(10,10, 'Click to toggle Sound')
        .setScale(1.5)
        .setOrigin(0)
        .setStyle({fontStyle: 'bold', fontFamily: 'Arial'});
    
    this.label = this.add.text(10,40, '')
        .setScale(1)
        .setOrigin(0)
        .setStyle({fontStyle: 'bold', fontFamily: 'Arial'});

    player = this.add.rectangle(20, 80, 30, 30, 0x6666ff);
    
    soundPoint = this.add.circle(config.width / 2, 50, 9,  0xff0000);
    
    this.physics.add.existing(player);
    
    player.body.setVelocity(50,0)
    
    sound = this.sound.add('sound');

    this.input.on('pointerdown', () => {
        if(!playing){
            sound.play({loop:true});
        } else {
            this.sound.stopByKey('sound');
        }
        playing = !playing;
    });
}

function update () {
    this.physics.world.wrap(player, 4);
    let maxDistance = config.width / 2.5;
    let distance = Phaser.Math.Distance.Between(soundPoint.x, soundPoint.y, player.x, player.y);
    console.info(distance)
    
    if(playing &&  sound){
        let newVolume = 1 - distance / maxDistance;
        
        // prevent negative numbers
        newVolume = Math.max(newVolume, 0);
        sound.setVolume(newVolume);
        this.label.setText(` Sound Volume: ${(newVolume * 100).toFixed(2)} %`)
    }
    
}

new Phaser.Game(config);
<script src="https://cdn.jsdelivr.net/npm/phaser@3.55.2/dist/phaser.js"></script>
    • 重要信息**:注意,如果你不检查音量可能会得到负。这可能会导致问题,你可以防止这行代码newVolume = Math.max(newVolume, 0);

相关问题