Phaser入门
这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战
1、phaser代码提示配置
上一篇我们通过npm install -D phaser安装了phaser,没有安装过得记得再次安装一下。安装了之后由于phaser目前官方并不支持ts在vscode中的代码提示,所以我们需要phaser类型定义文件phaser.d.ts来增强代码提示,大家可以在官网下载(有点慢),或者在我的仓库进行下载。
将下载下来的phaser.d.ts文件放到src根目录下。
- 在src目录下的
index.ts文件中引入phaser,打印Phaser(大写的别写错了),如果能成功打印Phaser下面的成员方法,说明你引入成功了 - 打印Phaser时候大家可以后面加个
.,如果能显示Phaser的属性或者方法说明类型定义文件也生效了,如果没有生效,大家可以重启一下服务,或者看看是不是类型定义文件放错目录了,要放在src的根目录下面
2、初始化Game配置
- 在我们整个项目中,有一个顶级管理员,用它来管理我们的场景(后面会说),游戏界面的大小,是以什么方式渲染等等,这个管理员需要继承Phaser的
Phaser.Game类,并且在构造函数里面传入我们的配置。 - 在
insex.ts文件中创建游戏管理类并且让他继承Phaser.Game:
import 'phaser'
const config: Phaser.Types.Core.GameConfig = {}
class GameManager extends Phaser.Game{
constructor() {
super(config);
}
}
new GameManager();
- 这里
Phaser.Types.Core.GameConfig就是config的类型,别问我怎么知道的,默认不写这个类型,然后把鼠标悬浮到构造函数super上面,就会显示出config类型,如果你没有phaser.d.ts文件,那就不会显示了。 - 写这个的作用就是,当你在config里面写属性,就会有代码提示:
- 这时候打开浏览器,会显示一块黑色的方块就是我们的游戏面板了,控制台打开上面会显示Phaser的版本号,和当前渲染模式,下面我会挑一些常用的配置项进行说明。
1.基础三件套width、height、backgroundColor
- 游戏可视面板的宽高和背景色 注意:这里的宽高不需要加单位,number类型,背景色是16进制,不能写red、yellow......要是这样的格式:backgroundColor: 0xffff00
2. 控制台打印信息title、url、version、banner
- 可以修改默认控制台打印的phaser信息,可以通过
banner: false全部隐藏 banner: { hidePhaser: false }部分隐藏
3. 渲染方式type
- 视图的渲染方式,默认是
Phaser.AUTO即默认优先使用webGL渲染,如果不支持则使用canvas- Phaser.CANVAS
- Phaser.HEADLESS
- Phaser.WEBGL
4. 游戏帧率相关fps
- 是一个对象,里面有min、target、forceSetTimeOut等
- min:最小帧率,默认5
- target:帧率,默认是一秒60帧(建议不要超过120帧)
- forceSetTimeOut等:是否使用SetTimeOut代替requestAnimationFrame,默认false(兼容相关)
5. loader加载器配置
- 是一个对象,用来加载一些静态资源文件,图片,音频等
- baseURL:网络地址路径,比如:
<http://labs.phaser.io/assets/> - path:相对路径,比如:
images/sprites/ - maxParallelDownloads:资源每次加载的最大数量默认是32个
- crossOrigin:跨域配置
- responseType:响应头类型
- baseURL:网络地址路径,比如:
6. physics 物理引擎
- physics.default:哪种类型的物理引擎,默认我们使用
arcade - physics.arcade:
- debug: 是否开启debug模式,开启之后所有物体都会显示一个重力线,用来调试
- checkCollision.up(down、left、right):是否和整个世界(黑色的这个游戏主界面)的上下左右检测碰撞,如果不设置,物体可以掉到世界外
- gravity.x\gravity.y:水平、竖直方向所受的重力,设置0为不受重力影响
7. input 监听输入
- input: false,如果设为false则全游戏场景禁止监听键盘、鼠标、触摸等输入
- input: {} 对象类型
- keyboard:是否监听键盘输入
- mouse:是否监听鼠标输入
- touch:是否监听触摸输入
- gamepad:是否监听手柄输入
- activePointers:触摸最大触摸点数,默认为1
8. scene 场景
- 最重要的配置之一,可以是数组,也可以是对象,如果是数组则默认加载第一个,也可以通过配置选择默认加载的场景
目前config里面常用的配置就这些,后面用到新的会陆续介绍,过了英语一级的同学也可以直接在官方API查看。
3、场景
1.什么是场景?
我们的游戏其实就是由一个个不同的模块构成,或者一个个的界面,每一个界面都是一个游戏场景,比如说:王者荣耀界面
登录是一个场景,然后点击登录之后进到主页面又一个场景,然后选择英雄场景......每个游戏都是由许许多多个场景构成,每个场景里面有自己的逻辑。
2.开始创建场景
- 在
src目录下面新建scene目录,用来存放我们的场景文件,后面开发每一个场景都是一个ts文件 - 在scene文件夹中创建我们第一个场景
Boot.ts,每个场景都需要继承Phaser.Scene:- 构造函数里面的key就是场景的名称,后面我们进行场景调转需要通过这个key值跳转
- init:在场景初始化时被调用,这个函数可以通过调用
this.start(key, [params])来接受从其他场景或游戏传递的参数- params:其它场景传递的参数
- preload:在创建场景对象之前被调用,一般加载资源在这里完成,这些资源将被缓存当重新启动场景时,不会重新加载它们
- create:在加载资源时被调用,游戏对象、动画的创建在这里完成
- update:默认每秒调用60次,一般场景移动相关的逻辑写在这里
- time:游戏已经运行多长时间
- dealta:每帧渲染间隔时间
export class Boot extends Phaser.Scene{
constructor() {
super({
key: 'Boot'
});
}
init() {
console.log('Boot init');
}
preload() {
console.log('Boot preload');
}
create() {
console.log('Boot create');
}
}
- 在
index.ts文件中引入Boot场景,并加载到主游戏进程中
import { Boot } from './scene/Boot'
const config: Phaser.Types.Core.GameConfig = {
scene: [
Boot
]
}
- 运行会发现控制台依次打印:
Boot init
Boot preload
Boot create
- 场景的配置项也有很多,并不是只有key值
- key:场景名称,唯一key值
- active:设置成false,场景的update将不在执行,修改create,会发现1秒之后update将不再执行
create() { console.log('Boot create'); setTimeout(() => { this.scene.setActive(false); }, 1000) } - visible:设置场景是否可见
- pack:是否在场景开始之前进行文件加载
- cameras:相机相关
- physics:物理引擎,和全局配置一样可以覆盖
- loader:加载器配置
- plugins:插件相关
3.场景跳转
场景之间的跳转需要使用start(key, data)方法
- this.scene.sleep():使当前场景睡眠,update不再执行
- this.scene.start(场景key, 参数):场景跳转
- this.scene.restart():重启当前场景,不会触发constructor() 在scene文件夹下面创建Menu.ts场景,并在index.ts中引入,修改Boot中的create方法:
// Menu.ts
export class Menu extends Phaser.Scene{
constructor() {
super({
key: 'Menu'
});
}
init() {
console.log('Menu init');
}
preload() {
console.log('Menu preload');
}
create() {
console.log('Menu create');
}
update(time: number, delta: number) {
console.log(delta);
}
}
create() {
console.log('Boot create');
setTimeout(() => {
this.scene.sleep();
this.scene.start('Menu');
}, 1000)
}
运行,会发现1s之后Boot场景的update不再执行,并且已经跳转到Menu场景了。
4、最后
今天向大家介绍了场景相关的知识,具体场景还有很多配置,大家可以自己进行尝试,下一节会介绍资源的加载、动画的创建,以及简单的输入监听。今天的全部代码在这里