mirror of
https://github.com/scratchfoundation/scratch-vm.git
synced 2024-12-23 14:32:59 -05:00
Merge pull request #891 from ericrosenbaum/bugfix/audioplayer-clone-state
Audio effects state for clones
This commit is contained in:
commit
115184a2a3
3 changed files with 42 additions and 8 deletions
|
@ -16,6 +16,11 @@ class Scratch3SoundBlocks {
|
|||
this.runtime.on('PROJECT_STOP_ALL', this._clearEffectsForAllTargets);
|
||||
this.runtime.on('PROJECT_START', this._clearEffectsForAllTargets);
|
||||
}
|
||||
|
||||
this._onTargetCreated = this._onTargetCreated.bind(this);
|
||||
if (this.runtime) {
|
||||
runtime.on('targetWasCreated', this._onTargetCreated);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -88,6 +93,23 @@ class Scratch3SoundBlocks {
|
|||
return soundState;
|
||||
}
|
||||
|
||||
/**
|
||||
* When a Target is cloned, clone the sound state.
|
||||
* @param {Target} newTarget - the newly created target.
|
||||
* @param {Target} [sourceTarget] - the target used as a source for the new clone, if any.
|
||||
* @listens Runtime#event:targetWasCreated
|
||||
* @private
|
||||
*/
|
||||
_onTargetCreated (newTarget, sourceTarget) {
|
||||
if (sourceTarget) {
|
||||
const soundState = sourceTarget.getCustomState(Scratch3SoundBlocks.STATE_KEY);
|
||||
if (soundState && newTarget) {
|
||||
newTarget.setCustomState(Scratch3SoundBlocks.STATE_KEY, Clone.simple(soundState));
|
||||
this._syncEffectsForTarget(newTarget);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the block primitives implemented by this package.
|
||||
* @return {object.<string, Function>} Mapping of opcode to Function.
|
||||
|
@ -208,6 +230,15 @@ class Scratch3SoundBlocks {
|
|||
util.target.audioPlayer.setEffect(effect, soundState.effects[effect]);
|
||||
}
|
||||
|
||||
_syncEffectsForTarget (target) {
|
||||
if (!target || !target.audioPlayer) return;
|
||||
const soundState = this._getSoundState(target);
|
||||
for (const effect in soundState.effects) {
|
||||
if (!soundState.effects.hasOwnProperty(effect)) continue;
|
||||
target.audioPlayer.setEffect(effect, soundState.effects[effect]);
|
||||
}
|
||||
}
|
||||
|
||||
clearEffects (args, util) {
|
||||
this._clearEffectsForTarget(util.target);
|
||||
}
|
||||
|
|
|
@ -131,17 +131,15 @@ class RenderedTarget extends Target {
|
|||
'control_start_as_clone', null, this
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Audio player
|
||||
*/
|
||||
/**
|
||||
* Initialize the audio player for this sprite or clone.
|
||||
*/
|
||||
initAudio () {
|
||||
this.audioPlayer = null;
|
||||
if (this.runtime && this.runtime.audioEngine) {
|
||||
if (this.isOriginal) {
|
||||
this.audioPlayer = this.runtime.audioEngine.createPlayer();
|
||||
} else {
|
||||
this.audioPlayer = this.sprite.clones[0].audioPlayer;
|
||||
}
|
||||
this.audioPlayer = this.runtime.audioEngine.createPlayer();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -940,6 +938,10 @@ class RenderedTarget extends Target {
|
|||
this.runtime.requestRedraw();
|
||||
}
|
||||
}
|
||||
if (this.audioPlayer) {
|
||||
this.audioPlayer.stopAllSounds();
|
||||
this.audioPlayer.dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -56,6 +56,7 @@ class Sprite {
|
|||
const newClone = new RenderedTarget(this, this.runtime);
|
||||
newClone.isOriginal = this.clones.length === 0;
|
||||
this.clones.push(newClone);
|
||||
newClone.initAudio();
|
||||
if (newClone.isOriginal) {
|
||||
newClone.initDrawable();
|
||||
this.runtime.fireTargetWasCreated(newClone);
|
||||
|
|
Loading…
Reference in a new issue