phaser3开发微信小游戏样例

Posted rysefgfzh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了phaser3开发微信小游戏样例相关的知识,希望对你有一定的参考价值。

写在前面

自从上一篇使用phaser3开发微信小游戏文章发布,有很多小伙伴发邮件,说自己编译时遇到各种各样的错误。所以这里写一下【最简单版本】的编译过程。

注意:下面的编译前提,是已经按照第一篇中的做法,修改了phaser3的源码,去除了window和document等等被阉割的属性。

注意:下面的编译前提,是已经按照第一篇中的做法,修改了phaser3的源码,去除了window和document等等被阉割的属性。

注意:下面的编译前提,是已经按照第一篇中的做法,修改了phaser3的源码,去除了window和document等等被阉割的属性。

重要的事说三遍!!!
第一篇文章地址在这里:
使用Phaser3进行微信小游戏开发

OK,废话不多说,我们开始。

我们的目标是:打包一个能够在小程序模拟器上,显示一张图片的自定义 phaser3 。
下文中的操作,都默认你已经读过了官方自定义打包教程,如果你还没有读过,请先通读一下第一篇文章中提到的官网教程。

设置 phaser 的配置文件

拷贝一份官方的 phaser-core.js 文件,重命名为 phaser-core-image.js 。然后进行筛检,保留我们需要的模块。文件中代码如下:

require('polyfills');
var CONST = require('const');
var Extend = require('utils/object/Extend');
var Phaser = {
    Cameras: {
        Scene2D: require('cameras/2d')
    },
    Events: require('events/index'),
    Game: require('core/Game'),
    GameObjects: {
        DisplayList: require('gameobjects/DisplayList'),
        UpdateList: require('gameobjects/UpdateList'),
        GameObjectFactory: require('gameobjects/GameObjectFactory'),
        GameObjectCreator: require('gameobjects/GameObjectCreator'),
        Image: require('gameobjects/image/Image'),
        Factories: {
            Image: require('gameobjects/image/ImageFactory'),
        },
    },
    Scale: require('scale'),
    Scene: require('scene/Scene'),
    Scenes: require('scene'),
    Textures: require('textures'),
    Tweens: require('tweens'),
};
Phaser = Extend(false, Phaser, CONST);
module.exports = Phaser;
global.Phaser = Phaser;

上面的模块中,我们保留了Camera,Game,GameObjects,Scale,Scene,Scenes,Textures,Tweens。其中 Tweens 也可以去掉,但是我们为了后面添加一个简单的 tween 动画作为示例,把这个模块保留下来。GameObjects 字段中,除了核心部分,我们只添加了一个 Image 类。

设置 webpack 配置文件

拷贝一份官方的 webpack.config-core.js 文件,重命名为 webpack.config-core-image.js ,然后修改其中的 entry 字段。文件内容如下:

'use strict';
const webpack = require('webpack');
const UglifyJSPlugin = require('uglifyjs-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const path = require('path');
module.exports = {
   mode: 'production',
   entry: {
       'phaser-core': `./phaser-core-image.js`, // 这里对应你的 phaser 配置文件
       'phaser-core.min': './phaser-core-image.js' // 同上
   },
   resolve: {
       alias: {
           'eventemitter3': path.resolve(__dirname, './node_modules/eventemitter3')
       },
       modules: [ 'node_modules/phaser/src' ]
   },
   output: {
       path: `${__dirname}/dist/`,
       filename: '[name].js',
       library: 'Phaser',
       libraryTarget: 'umd',
       sourceMapFilename: '[file].map',
       devtoolModuleFilenameTemplate: 'webpack:///[resource-path]',
       devtoolFallbackModuleFilenameTemplate: 'webpack:///[resource-path]?[hash]',
       umdNamedDefine: true
   },
   performance: { hints: false },
   optimization: {
       minimizer: [
           new UglifyJSPlugin({
               include: /\\.min\\.js$/,
               parallel: true,
               sourceMap: false,
               uglifyOptions: {
                   compress: true,
                   ie8: false,
                   ecma: 5,
                   output: {comments: false},
                   warnings: false
               },
               warningsFilter: () => false
           })
       ]
   },
   plugins: [
       new webpack.DefinePlugin({
           "typeof CANVAS_RENDERER": JSON.stringify(true),
           "typeof WEBGL_RENDERER": JSON.stringify(true),
           "typeof EXPERIMENTAL": JSON.stringify(false),
           "typeof PLUGIN_CAMERA3D": JSON.stringify(false),
           "typeof PLUGIN_FBINSTANT": JSON.stringify(false)
       }),
       new CleanWebpackPlugin()
   ],
   devtool: 'source-map'
};

这个文件内容看起来很多,但是仔细看,需要改动的部分就两行,只需要把 entry 改成我们的自定义的 phaser 配置文件就可以了。上面代码修改的部分,有注释。即使不懂 webpack 也不用担心,只要能大致看明白配置就可以了。

编译

打开目录下的 package.json 文件,在 scripts 字段新增一行命令,【 “buildcoreimage”: “webpack --config webpack.config-core-image.js --display-modules”, 】。这条语句其实就是利用 npm 执行 webpack 的命令,可以网上搜索 package.json 字段的意义,有很多教程。
打开 VScode 的 terminal ,或者运行 cmd ,进入当前文件夹,输入 npm run buildcoreimage ,这时 webpack 就会开始打包了。大约会停顿几秒或者十几秒,然后编译完成。正常情况是下面这样的:
在这里插入图片描述
如果不正常。。。你再回顾一下,看看有没有哪一步漏了。
这时,在当前目录下, dist 文件夹内会出现三个文件:

在这里插入图片描述
到这里就编译完了。phaser-core.js 是未压缩版本,phaser-core.min.js 是压缩过的版本,可以看到他们的大小差别很大。

新建工程

用微信小游戏开发工具,新建一个小游戏项目,使用 测试id 就可以了。然后把自带的模板删除,仅仅保留 game.js,game.json,project.config.json 。然后按照我们自己的工程结构,重新创建文件夹。我的工程结构如下:
在这里插入图片描述

	|--assets  		保存示例图片,后面直接使用node.js在工程目录开启服务,访问这张图片,也可以不用这个文件夹,有任意可以通过 url 访问的图片都可以,注意开发工具要设置不校验合法域名
	|--src     		游戏相关的全部代码
		|--config	存放游戏配置文件
		|--lib		存放 phaser 核心文件
		|--scenes	存放场景文件
	|--game.js 		微信小游戏入口文件
	|--game.json	微信小游戏配置文件
	|--project.config.json	工程配置文件

工程代码详解

game.js

// 引入phaser
import {
  Phaser
} from './src/lib/phaser-core.min.js'
// 引入配置文件
import * as screen from './src/configs/screen.js'
// 引入场景文件
import Game from './src/scenes/Game.js'
// 创建游戏
const game = new Phaser.Game({
  width: screen.screeWidth, // 屏幕宽度
  height: screen.screeHeight, // 屏幕高度
  zoom: 1,
  type: Phaser.CANVAS,
  parent: null,
  canvas: screen.canvas, // 创建的canvas
  backgroundColor: '#BA55D3',
  scene:[Game]
});

非常标准的 Phaser.Game ,其中加注释的几行字段,是从 screen.js 中导出的,具体值下面会讲。

screen.js

const canvas = wx.createCanvas(); // 创建canvas,这个 canvas 将是 phaser 使用的
const screeWidth = canvas.width; // 屏幕宽度
const screeHeight = canvas.height; // 屏幕高度
export {
  canvas,
  screeWidth,
  screeHeight
}

这里导出一个canvas 和 屏幕宽高三个变量,供其他模块使用。

Game.js

import {
  Phaser
} from '../lib/phaser-core.min.js'
import * as screen from '../configs/screen.js'
export default class Game extends Phaser.Scene {
  constructor() {
    super('game');
  }
  init() {
    let that = this;
    const akl = wx.createImage();
    akl.onload = () => {
      // 小提示,添加纹理图的函数是异步的,也就是说立即调用这个方法后
      // 'akl'这个key对应的图片还不可用,看下面的用法
      that.textures.addImage('akl', akl);
    }
    akl.src = 'http://localhost:8080/assets/akl.png'
  }
  create() {
    let that = this;
    // 这里设置一个定时事件,每30ms检查一次 'akl' 这个key对应的图片是否可用
    // 如果可用,就调用我们的自定义方法
    this.timeEvent = setInterval(() => {
      if (that.textures.exists('akl')) {
        that.addImageToCanvas();
      }
    }, 30);
  }
  addImageToCanvas() {
    clearInterval(this.timeEvent);
    this.hero = this.add.image(screen.screeWidth / 2, screen.screeHeight / 2, 'akl');
    this.hero.setDisplaySize(screen.screeWidth * 0.8, screen.screeWidth * 0.8);
    this.hero.rotation = -Math.PI / 180 * 45;
    this.tweens.add({
      targets: this.hero,
      duration: 2000,
      rotation: Math.PI / 180 * 45,
      yoyo: true,
      repeat: 3
    });
  }
}

这就是主要游戏场景了。我们自定义一个 Game 类,继承自 Phaser.Scene ,然后实现了2个方法 init() 和 create() ,并添加了一个自定义方法 addImageToCanvas() 。
由于没有编译 load 模块,所以我们只能手动编码加载图片,并放入 TextureManager 中。实现部分在 init() 函数,而且注释中说明了需要注意的部分,addImage 是异步的,自己写加载代码,需要特别注意。
在 create() 函数中,我们定时检查图片资源是否可用,当图片可用时,我们就把它添加到游戏中。
在 addImageToCanvas() 函数,我们添加一张图片到屏幕中间,同时给它创建了一个tween动画。

运行结果

整个游戏到这里就结束了,启动我们的后端服务确保图片可以访问,单击编译,大约几秒钟,应该就可以显示出来了。贴一张我的运行结果:
在这里插入图片描述
我使用 phaser3.50.0 进行编译的,所以可以看到运行成功后,控制台打印出了熟悉的 phaser 标志。

下载【工程源码】以及【适配微信小游戏环境的phaser3源文件】

如果顺利的显示出图片,恭喜你,你已经完成了使用 phaser3 开发小游戏的第一步,酌情增加你需要的模块,拓展你的游戏吧。
或者。。。你没能成功,没关系,我也是改了很久才显示出第一张图片。你可以检查一下报错信息,使用未压缩的 phaser-core.js 代替 phaser-core.min.js,这样可以直观的看到是哪一行报错,快速定位到错误,然后解决。

如果你想先体验一下使用 phaser3 的快感,添加QQ 1501843499,验证消息填写:体验phaser3,好友验证通过后,我会把这篇文章的整个小游戏工程打包发给你,包括文章中使用的已经适配好小游戏环境的 phaser3 。或者,发送邮件也可以,我会以邮件附件的形式发给你,邮箱地址在下面。

感谢各位的阅读。如果觉得不错就点个赞吧。如果有什么问题,可以发送邮件到1501843499@qq.com,我有时间看到就会回复。

以上是关于phaser3开发微信小游戏样例的主要内容,如果未能解决你的问题,请参考以下文章

使用phaser3进行游戏开发系列一

使用phaser3进行游戏开发系列一

vscode 开发微信小程序环境配置

Egret白鹭开发微信小游戏分享功能

使用Phaser3进行微信小游戏开发

Unity开发微信小游戏步骤