【问题标题】:accessing texture after initial loading in pixi.js在 pixi.js 中初始加载后访问纹理
【发布时间】:2014-05-09 15:37:07
【问题描述】:

我正在为我当前的 javascript 项目使用 pixi.js 渲染引擎。我正在使用assetloader加载在json中定义的spritesheet。问题是我需要在资产加载器使用的 onComplete 事件完成之后创建精灵或影片剪辑。但是,在那之后似乎无法访问纹理缓存。下面是一些代码,演示了我遇到的问题。

var spriteSheet = [ "test.json" ];
loader = new PIXI.AssetLoader(spriteSheet); // only using the flappy bird sprite sheet as a test 
loader.onComplete = OnAssetsLoaded;
loader.load();

function OnAssetsLoaded() {
    var sprite = PIXI.Sprite.fromFrame("someFrame.png"); //this works
}

var sprite2 = PIXI.Sprite.fromFrame("someFrame2.png"); //This does not work, tells me "someFrame2" is not in the texture cache

【问题讨论】:

    标签: javascript caching textures sprite pixi.js


    【解决方案1】:

    必须先完全加载精灵表,然后才能将图像存储到缓存中。加载 Sprite 表后,这些资源将存在于缓存中,直到您将其删除。

    您上面的代码失败的原因是因为var sprite2... 行在精灵表完成加载之前执行。


    此示例将每秒不断地向舞台添加一个新的 Sprite。

    //build stage
    var stage = new PIXI.Stage(0x66FF99);
    var renderer = PIXI.autoDetectRenderer(400, 300);
    document.body.appendChild(renderer.view);
    
    //update renderer
    requestAnimFrame( animate );
    function animate() {
        requestAnimFrame( animate ); 
        renderer.render(stage);
    }
    
    //Flag will prevent Sprites from being created until the Sprite sheet is loaded.
    var assetsReadyFlag = false;
    
    //load sprite sheet
    var loader = new PIXI.AssetLoader([ "test.json" ]);
    loader.onComplete = function(){
        assetsReadyFlag = true;
    };
    loader.load();
    
    //Add a new bird every second
    setInterval( addBird, 1000);
    function addBird()
    {
        //assets must be loaded before creating sprites
        if(!assetsReadyFlag) return;
    
        //create Sprite
        var bird = PIXI.Sprite.fromFrame("bird.png");
        bird.anchor.x = bird.anchor.y = 0.5;
        bird.x = Math.random() * stage.width;
        bird.y = Math.random() * height;
        stage.addChild(bird);
    };
    

    【讨论】:

    • 感谢您回答这个问题。我有点困惑。我假设 ('var sprite2 ..') 是在精灵表加载后执行的,因为它是在 ('loader.load()') 之后执行的。从全局范围调用函数有什么我不知道的吗?
    • 我也刚刚弄清楚如何使用code 标记。对上面可怕的格式感到抱歉。
    • Sprite 是在调用 load() 之后创建的,但图像加载过程是异步的,这是正确的。发生的情况是 Sprite 在您调用 load() 之后立即创建,但在纹理完成下载之前。
    • 那么我该如何解决这个问题。
    • 那么正确的解决方案就是您在示例中显示的内容。您应该在 onComplete 函数中创建 Sprite。您可以编辑您的问题以显示您通过这种方式遇到的问题的示例吗?
    猜你喜欢
    • 1970-01-01
    • 2018-01-17
    • 2022-12-14
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多