Skip to content

Phaser-CE 游戏引擎学习笔记

最近做了个小游戏,以下是对用到的知识点和常用代码片段进行归纳。

官方文档:https://www.phaser-china.com/docs/Index.html

以场景(state)的方式初始化游戏

官方给出的例子中没有使用 state 来初始化游戏,state 方式如下:

js
import { Game } from "phaser-ce";

// 初始化游戏
const game = new Game(800, 600, Phaser.CANVAS, "");

class State1 {
  preload() {
    console.log("preload");
    game.load.image("bg", "assets/images/bg.png");
    game.load.spritesheet("face01", "assets/images/face01.png", 118, 76, 24);
  }
  init(params) {}
  create() {
    console.log("create");
  }
  update() {}
  render() {}
}

game.state.add("state1", State1);
game.state.start("state1");

loader

https://www.phaser-china.com/docs/Phaser.Loader.html

加载 pack

js
game.load.pack("image", "assets/auto-pack.json", null, this);

其他

参考官网

通过创建组的方式来调整层级

js
groups.bgLayer = game.add.group();
groups.layer1 = game.add.group();
groups.layer2 = game.add.group();

在组中创建精灵

js
groups.bgLayer.create(0, 0, "bg");

带有 spritesheet 动画的精灵

js
sprites["face01"] = groups.ashCanLayer.create(45, 700, "face01");
sprites["face01"].animations.add("animationLoop");
sprites["face01"].animations.play("animationLoop", 30, true);

应用物理引擎 arcade

js
// 开启物理引擎
game.physics.arcade.enable(sprites["demo"]);
// 设置弹起
sprites["demo"].body.bounce.y = 0.2;
// 设置重力
sprites["demo"].body.gravity.y = gravity;
// 设置世界边界限制
sprites["demo"].body.collideWorldBounds = true;

物理刚体设置

js
sprites["ground"] = groups.bgLayer.create(0, game.height - 122, "ground");
game.physics.arcade.enable(sprites["ground"]);
sprites["ground"].body.immovable = true;

arcade 碰撞检测,组内元素

js
game.physics.arcade.collide(groups.trashLayer);

arcade 碰撞检测,对外

js
game.physics.arcade.collide(groups.trashLayer, sprites["ground"]);

拖拽控制

js
// 启用输入控制
sprites["demo"].inputEnabled = true;
// 允许拖拽,第一个参数 true 代表拖拽的时候鼠标位于精灵中心
sprites["demo"].input.enableDrag(true);
// 设置拖拽边界
sprites["demo"].input.boundsRect = new Rectangle(0, 0, 750, game.height - 122);
sprites["demo"].events.onDragStart.add(() => {});
sprites["demo"].events.onDragUpdate.add(() => {});
sprites["demo"].events.onDragStop.add((sprite, pointer) => {});

判断某个点是否在精灵边界内

js
Phaser.Rectangle.containsPoint(sprite.getBounds(), pointer);

设置文字区域限制

js
const text = new Text(game, 0, 0, "0", {
  boundsAlignH: "center",
  boundsAlignV: "middle",
  font: "38px Arial",
  fill: "#fff",
});
text.setTextBounds(172, 180, 80, 40);

将文字加入一个分组

js
groups.bgLayer.add(text);

定时器

js
game.time.events.loop(1000, () => {});

asset-pack 的格式定义

分组结构

json
{
  "group1": [],
  "group2": []
}

image 类型

json
{
  "group1": [
    {
      "type": "image",
      "key": "bg",
      "url": "./assets/images/bg.png",
      "overwrite": false
    }
  ],
  "group2": []
}

spritesheet 类型

json
{
  "group1": [
    {
      "type": "spritesheet",
      "key": "face02",
      "url": "./assets/sheet/[email protected]",
      "frameWidth": 121,
      "frameHeight": 82,
      "frameMax": 5,
      "margin": 0,
      "spacing": 0
    }
  ],
  "group2": []
}

atlas 纹理

json
{
  "group1": [
    {
      "type": "atlas",
      "key": "face01",
      "textureURL": "./assets/atlas/face01-atlas.png",
      "atlasURL": "./assets/atlas/face01-atlas.json",
      "format": "TEXTURE_ATLAS_JSON_HASH"
    }
  ],
  "group2": []
}

audio

稍后整理

video

稍后整理

debug

展示输入信息

js
game.debug.inputInfo(32, 32, "#000");

展示图形边界

js
game.debug.geom(new Rectangle(172, 180, 80, 40));

最后编辑时间:

Version 4.2 (core-1.3.4)