互殴之前当然要先有场地才行,让我们建立 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.js
、scene-main.js
、scene-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 是指这种图片:
图片来源:How to create sprite sheets for Phaser 3 with TexturePacker
将连续动作组合起来的图片,透过 load.spritesheet
载入後,再使用 anims.generateFrameNumbers
进行分割,往後就可以在角色中使用动画了!
以上我们成功载入所有素材了,接下来让人物们登场吧!
以上程序码已同步至 GitLab,大家可以前往下载:
<<: IT 铁人赛 k8s 入门30天 -- day29 Adding entries to Pod /etc/hosts with HostAliases
框架用好了之後,就是一些功能的串接罗, 还记得之前使用json串接的画面吗?现在要从网站的登入画面进...
excel 是很多人常用来处理报表与数据的工具,同样地在 python 也有一个套件常常在处理这件事...
既然DeFi是一个建立在区块链网路上的金融体系,透过智能合约,不需仰赖特定第三方授权或管理,让原本可...
我最後选择了什麽主题 我後来用了第三种-Open API的方式 因为这样就不用自己想资料内容了~ 这...
接着建立登入功能 在流程控制这边追加 login 功能 controller\flowControl...