【问题标题】:Phaser 3: load spritesheet for animation with unequal dimensionsPhaser 3:为尺寸不等的动画加载精灵表
【发布时间】:2021-10-25 12:05:02
【问题描述】:

我正在尝试使用 Phaser 3 框架。

为了加载 spritesheet 并创建它的动画,我首先加载 spritesheet:

this.load.spritesheet('player', 'assets/spritesheets/player.png',{frameWidth:16,frameheight:16});

然后我按如下方式创建动画:

this.anims.create({
    key:"player_anim",
    frames: this.anims.generateFrameNumbers("player"),
    frameRate:8,
    repeat:-1,
});

这很好用,但如果我的尺寸不相等,例如

this.load.spritesheet('1health', 'assets/spritesheets/1health.png',{frameWidth:96,frameheight:32});

this.anims.create({
    key:"1health_anim",
    frames: this.anims.generateFrameNumbers("1health"),
    frameRate:4,
    repeat:-1,
});

我收到以下错误:

SpriteSheet frame dimensions will result in zero frames for texture: 1health

generateFrameNumbers: Frame 0 missing from texture: 1health
generateFrameNumbers: Frame 0 missing from texture: 1health

如果我打印console.log(this.anims.generateFrameNumbers("player"));

输出是:

[
    {
        "key": "player",
        "frame": 0
    },
    {
        "key": "player",
        "frame": 1
    },
    {
        "key": "player",
        "frame": 2
    },
    {
        "key": "player",
        "frame": 3
    }
]

但是对于不等维度的精灵,我得到一个空数组。

Phaser's Documentation 中,似乎可以为精灵表使用不同的尺寸。

任何帮助或指点将不胜感激。

编辑 这是我尝试使用的图片

【问题讨论】:

    标签: javascript sprite phaser-framework sprite-sheet


    【解决方案1】:

    我认为您的精灵表 1health.png 有问题 你检查过它的大小吗?

    在这一行尝试不同的维度: this.load.spritesheet('1health', 'assets/spritesheets/1health.png',{frameWidth:94,frameheight:30});

    看看它是否工作没有任何错误? 也许图像 1healt 的尺寸不正确。

    如果你给我一个链接,我可以在 Phaser 中检查你的图片吗?

    编辑

    对我来说一切都很好,这是我在场景中显示精灵的方式:

    在loading.js中:

    this.load.spritesheet('6bQOE', 'img/6bQOE.png', {frameWidth: 96, frameHeight: 32});
    

    游戏玩法:

    let animConfig = {
        key: "gameAnim",
        frames: this.anims.generateFrameNumbers("6bQOE", { frames: [ 0,1,2 ] }),
        frameRate: 12,
        repeat: -1,
    };
    this.anims.create(animConfig);
    this.gameAnimation = this.anims.create(config);
    
    // display the sprite
    this.anim = this.add.sprite(width/2 + 400, height/2+5, '6bQOE');
    this.anim.anims.play("gameAnim");
    

    但是您有两个完全相同的框架,所以我不明白您要做什么?在这些帧之间切换没有任何区别,总是有一颗红心和两颗黑心。

    也许您不需要任何动画,您可以使用以下方式设置帧:

    this.anim.setFrame(0); // 3 red hearths
    this.anim.setFrame(1); // 2 red hearths
    

    【讨论】:

    • 谢谢,我添加了我在问题中使用的精灵表(在第一个中,我将它们彼此相邻,另一个我将它们放在彼此之上;我使用了一个名为piskel 来创建它们)。同样尝试 94 x 30 的尺寸也不起作用,但如果我使用 32x32 它可以工作,但当然会导致不良的精灵动画。
    • @A.JAlhorr 我已经编辑了我的答案,但老实说我不明白你想要完成什么。
    • 谢谢它有效,所以我错过了generateFrameNumbers 函数的附加参数。两个框架也略有不同(我不太擅长艺术:/);我打算让心脏的光影移动,黑色的心脏上掉下一点点“血”像素。别担心,我只是熟悉了移相器框架,不会在我的公司决定做的任何事情中处理艺术......
    猜你喜欢
    • 2017-08-11
    • 2021-12-21
    • 2021-09-28
    • 2020-06-01
    • 2017-05-27
    • 2012-07-09
    • 2020-03-08
    • 2020-01-27
    • 2020-01-21
    相关资源
    最近更新 更多