最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Phaser: how to load assets after preload? - Stack Overflow

programmeradmin5浏览0评论

I wonder whether it would be possible to load an asset dynamically at a given time in Phaser rather than loading everything in the preload function. The reason for this is simple: I have a game with three different levels, all of which have different background songs; and so I'd rather only load a single song at startup to reduce loading times.

Right now, my preload function looks like this:

preload: function()
{
    game.load.audio('pixel_world',
        ['assets/music/pixel_world_lo.ogg', 'assets/music/pixel_world_lo.mp3']);
    game.load.audio('second_source',
        ['assets/music/second_source_lo.ogg', 'assets/music/second_source_lo.mp3']);
    game.load.audio('reboot_plete',
        ['assets/music/reboot_plete_lo.ogg', 'assets/music/reboot_plete_lo.mp3']);
    game.load.image('pickup', 'assets/img/pickup.png');
}

I tried moving one of the game.load.audio() calls to the create function instead:

create: function()
{
    game.load.audio('pixel_world',
        ['assets/music/pixel_world_lo.ogg', 'assets/music/pixel_world_lo.mp3']);
    // good things follow...
}

However, the following calls fail:

this.cache.isSoundDecoded(level.song)
// Phaser.Cache.isSoundDecoded: Key "pixel_world" not found in Cache.

song = game.add.audio(level.song);
// Phaser.Cache.getSound: Key "pixel_world" not found in Cache.

Do you know how I can get this to work, or any other way to ensure that the three songs are not loaded at game startup? Thank you!

I wonder whether it would be possible to load an asset dynamically at a given time in Phaser rather than loading everything in the preload function. The reason for this is simple: I have a game with three different levels, all of which have different background songs; and so I'd rather only load a single song at startup to reduce loading times.

Right now, my preload function looks like this:

preload: function()
{
    game.load.audio('pixel_world',
        ['assets/music/pixel_world_lo.ogg', 'assets/music/pixel_world_lo.mp3']);
    game.load.audio('second_source',
        ['assets/music/second_source_lo.ogg', 'assets/music/second_source_lo.mp3']);
    game.load.audio('reboot_plete',
        ['assets/music/reboot_plete_lo.ogg', 'assets/music/reboot_plete_lo.mp3']);
    game.load.image('pickup', 'assets/img/pickup.png');
}

I tried moving one of the game.load.audio() calls to the create function instead:

create: function()
{
    game.load.audio('pixel_world',
        ['assets/music/pixel_world_lo.ogg', 'assets/music/pixel_world_lo.mp3']);
    // good things follow...
}

However, the following calls fail:

this.cache.isSoundDecoded(level.song)
// Phaser.Cache.isSoundDecoded: Key "pixel_world" not found in Cache.

song = game.add.audio(level.song);
// Phaser.Cache.getSound: Key "pixel_world" not found in Cache.

Do you know how I can get this to work, or any other way to ensure that the three songs are not loaded at game startup? Thank you!

Share Improve this question asked Dec 10, 2015 at 22:24 unpollitounpollito 1,0192 gold badges13 silver badges32 bronze badges
Add a ment  | 

1 Answer 1

Reset to default 7

From the documentation, that big unknown for noobs like me:

audio(key, urls, autoDecode) → {Phaser.Loader}

Adds an audio file to the current load queue.

The file is not loaded immediately after calling this method. The file is added to the queue ready to be loaded when the loader starts.

So basically, game.load.audio() after preload isn't loading the song, just adding it to a queue for later. In order to load the song, I also need to invoke game.load.start():

create: function()
{
    game.load.audio('pixel_world',
        ['assets/music/pixel_world_lo.ogg', 'assets/music/pixel_world_lo.mp3']);
    game.load.start(); // THIS!
    // good things follow...
}
发布评论

评论列表(0)

  1. 暂无评论