D29 - 「来互相伤害啊!」:天时地利

互殴之前当然要先有场地才行,让我们建立 Phaser 场景吧!

建立场景

首先建立 src\components\window-app-cat-vs-dog\scenes 资料夹,集中所有场景。

接着建立 scene-example.js 场景。

src\components\window-app-cat-vs-dog\scenes\scene-example.js

import Phaser from 'phaser';

export default class extends Phaser.Scene {
  constructor() {
    super({ key: '' })
  }
  preload() {
  }
  create() {
  }
  update() {
  }
}

接着根据 D27 规划的结果新增场景 scene-welcome.jsscene-main.jsscene-over.js

最後是新增一个特别的场景,专门用来预先载入所有素材、建立动画用的场景 scene-preload.js

所以目前档案为:

src\components\window-app-cat-vs-dog\scenes\scene-preload.js

import Phaser from 'phaser';

export default class extends Phaser.Scene {
  constructor() {
    super({ key: 'preload' })
  }
  preload() {
  }
  create() {
  }
  update() {
  }
}

src\components\window-app-cat-vs-dog\scenes\scene-welcome.js

import Phaser from 'phaser';

export default class extends Phaser.Scene {
  constructor() {
    super({ key: 'welcome' })
  }
  preload() {
  }
  create() {
  }
  update() {
  }
}

src\components\window-app-cat-vs-dog\scenes\scene-main.js

import Phaser from 'phaser';

export default class extends Phaser.Scene {
  constructor() {
    super({ key: 'main' })
  }
  preload() {
  }
  create() {
  }
  update() {
  }
}

src\components\window-app-cat-vs-dog\scenes\scene-over.js

import Phaser from 'phaser';

export default class extends Phaser.Scene {
  constructor() {
    super({ key: 'over' })
  }
  preload() {
  }
  create() {
  }
  update() {
  }
}

载入素材

接着在 scene-preload.js 场景中载入素材并建立动画。

src\components\window-app-cat-vs-dog\scenes\scene-preload.js

import Phaser from 'phaser';

import catWork from '@/assets/cat-vs-dog/cat-work.png';
import catBeaten from '@/assets/cat-vs-dog/cat-beaten.png';
import catWeapon from '@/assets/cat-vs-dog/cat-weapon.png';
import catAttack from '@/assets/cat-vs-dog/cat-attack.png';

import dogWork from '@/assets/cat-vs-dog/dog-work.png';
import dogBeaten from '@/assets/cat-vs-dog/dog-beaten.png';
import dogWeapon from '@/assets/cat-vs-dog/dog-weapon.png';
import dogAttack from '@/assets/cat-vs-dog/dog-attack.png';

import river from '@/assets/cat-vs-dog/river.png';

export default class extends Phaser.Scene {
  constructor() {
    super({ key: 'preload' })
  }

  preload() {
    // 载入图片
    const imgs = {
      'cat-weapon': catWeapon,
      'dog-weapon': dogWeapon,
      'river': river,
    };

    Object.entries(imgs).forEach(([key, value]) => {
      this.load.image(key, value);
    });

    // 载入 spritesheet
    const catSheets = {
      'cat-work': catWork,
      'cat-beaten': catBeaten,
      'cat-attack': catAttack,
    };
    const dogSheets = {
      'dog-work': dogWork,
      'dog-beaten': dogBeaten,
      'dog-attack': dogAttack,
    };

    Object.entries(catSheets).forEach(([key, value]) => {
      this.load.spritesheet(key, value,
        { frameWidth: 300, frameHeight: 300 }
      );
    });
    Object.entries(dogSheets).forEach(([key, value]) => {
      this.load.spritesheet(key, value,
        { frameWidth: 450, frameHeight: 450 }
      );
    });
  }
  create() {
    // 建立动画
    this.anims.create({
      key: 'cat-work',
      frames: this.anims.generateFrameNumbers('cat-work', { start: 0, end: 1 }),
      frameRate: 4,
      repeat: -1,
    });
    this.anims.create({
      key: 'cat-attack',
      frames: this.anims.generateFrameNumbers('cat-attack', { start: 0, end: 0 }),
      frameRate: 4,
      repeat: 1,
    });
    this.anims.create({
      key: 'cat-beaten',
      frames: this.anims.generateFrameNumbers('cat-beaten', { start: 0, end: 0 }),
      frameRate: 4,
      repeat: 1,
    });

    this.anims.create({
      key: 'dog-work',
      frames: this.anims.generateFrameNumbers('dog-work', { start: 0, end: 1 }),
      frameRate: 4,
      repeat: -1,
    });
    this.anims.create({
      key: 'dog-attack',
      frames: this.anims.generateFrameNumbers('dog-attack', { start: 0, end: 0 }),
      frameRate: 4,
      repeat: 1,
    });
    this.anims.create({
      key: 'dog-beaten',
      frames: this.anims.generateFrameNumbers('dog-beaten', { start: 0, end: 0 }),
      frameRate: 4,
      repeat: 1,
    });

    // 前往下一个场景
    this.scene.start('welcome');
  }
}

所谓的 spritesheet 是指这种图片:

Untitled

图片来源:How to create sprite sheets for Phaser 3 with TexturePacker

将连续动作组合起来的图片,透过 load.spritesheet 载入後,再使用 anims.generateFrameNumbers 进行分割,往後就可以在角色中使用动画了!

以上我们成功载入所有素材了,接下来让人物们登场吧!

总结

  • 建立场景
  • 载入所有素材并建立动画

以上程序码已同步至 GitLab,大家可以前往下载:

GitLab - D29


<<:  IT 铁人赛 k8s 入门30天 -- day29 Adding entries to Pod /etc/hosts with HostAliases

>>:  Day 29 隐私规划与UI设计定义实作

[day19]Vue实作-登入功能实作串接後端API(上)调整bootstrapvue

框架用好了之後,就是一些功能的串接罗, 还记得之前使用json串接的画面吗?现在要从网站的登入画面进...

Day 05 : 资料处理 Pandas (1)

excel 是很多人常用来处理报表与数据的工具,同样地在 python 也有一个套件常常在处理这件事...

Day29 - DeFi在红什麽?谈去中心化借贷、支付

既然DeFi是一个建立在区块链网路上的金融体系,透过智能合约,不需仰赖特定第三方授权或管理,让原本可...

[Day 5] 就决定是你了!艺文资讯整合平台

我最後选择了什麽主题 我後来用了第三种-Open API的方式 因为这样就不用自己想资料内容了~ 这...

[16] 建立登入 telegram 功能

接着建立登入功能 在流程控制这边追加 login 功能 controller\flowControl...