javascript - Typescript Sprite 动画

标签 javascript typescript sprite game-physics

我正在开发一款小型马里奥游戏。

但我不知道如何对 Sprite 进行动画处理。例如,我有一个正在运行的 mario.gif 文件(马里奥没有在 gif 中运行)

Click here for the mario picture.

图片尺寸为 60 x 20 像素。 目前,这是我的代码。

class Character {

    public y_: number;
    public x_: number;
    public nFrames: number = 30;

    constructor(public _x: number, public _y: number) {
        this._x = _x;
        this._y = _y;
    };

 sprite: HTMLImageElement;

    setSpriteUrl(input: string) : void {
        this.sprite = new Image();
        this.sprite.src = input;
    }

drawSprite(): void {
        ctx.save();
        ctx.beginPath();
        ctx.drawImage(this.sprite, 0, 0, 15, 20, this._x, this._y, 20, 20);
            ctx.restore;
      }
}

然后

var mario = new Character(40, 50);
mario.setSpriteUrl("graphics/mario/small/Running-mario.gif");

图片宽度为60像素,有4张马里奥的奔跑图像。图片的高度也是20像素。
60/4 = 15。

ctx.drawImage(this.sprite, 0, 0, 15, 20, this._x, this._y, 20, 20);

这会让我觉得我可以从 15 到 30,它会选择下一个马里奥图像。相反,它给了我图片中的 2 个正在运行的马里奥。
它是如何工作的?如何选择马里奥的各个运行阶段?


如果这样做了,是否应该使用 for 循环和计时器来为 Sprite 设置动画?对我来说,这似乎不是最佳实践。因为我有更多的 Sprite 要制作动画,然后只有马里奥和运行。

最佳答案

drawImage的签名是

ctx.drawImage(image, dx, dy)
ctx.drawImage(image, dx, dy, dWidth, dHeight)
ctx.drawImage(image, sx, sy, sWidth, sHeight, dx, dy)
ctx.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight)

(sx, sy) 是源图像中切片的起始位置,从该位置开始复制。 (sWidth × sHeight) 是该切片的大小。

由于您的 Sprite 帧是水平定向的,因此您需要增加 sx 的值来绘制下一帧。

class Character {

    frameWidth: number = 15;
    frameHeight: number = 20;

    constructor(
        public x: number,
        public y: number) { }

    sprite: HTMLImageElement;

    setSpriteUrl(input: string) : void {
        this.sprite = new Image();
        this.sprite.src = input;
    }

    drawSprite(frameIndex: number): void {
        ctx.save();
        ctx.beginPath();
        ctx.drawImage(this.sprite,
            frameIndex * this.frameWidth, 0,   // Start of slice
            this.frameWidth, this.frameHeight, // Size of slice
            this.x, this.y);                   // Destination position
        ctx.restore();
    }
}

关于javascript - Typescript Sprite 动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37244234/

相关文章:

reactjs - TypeScript 与 Redux 容器斗争

angular - 如何将ts文件中接收到的参数显示到html页面

reactjs - Material UI Typescript - createStyles 问题

css - 使用 aspnet 图像框架的 css 中的 Sprite

cocos2d-iphone - Cocos2d 如何让一个 Sprite 跟随另一个 Sprite ?

javascript - 如何使用 JavaScript 从 LDAP 服务器提取信息?

javascript - 让 django 代码在页面加载后运行

javascript - Azure 帐户共享访问签名

java - 如何将子弹对准枪?

javascript - typescript 如何将新项目添加到空对象数组