什么是 Phaser
Phaser.js 是一个基于javascript语言的高性能的,快速的,跨平台的 h5游戏开发框架。目前已经官方版本已经更新到3.4了。其内置了两种物理引擎,arcade物理引擎和 matter物理引擎。用于2D游戏开发。相较于国内的cocos-creator,layaair,白鹭三个游戏开发引擎来说,phaser 比较轻量,游戏各个场景完全用代码去编写,没有前三个那么强大的UI编辑器,因此开发效率相对来讲就低了很多。但Phaser 依然非常好用。
创建本地环境——创建文件
根据官方介绍,phaser 必须运行在服务器环境中,因此需要搭建好本地服务器,官方有初始模板,但仍建议自己用 node.js weback 定制一个,用起来也比较顺手。简单说一下window系统下的安装过程:
- 安装nodejs 以及 webpack 4.x webpack-cli
- 在除了C盘以外的盘符弄一个新文件夹打开命令行 执行
npm init根据指示初始化一个项目,之后会生成一个文件夹,然后在此文件夹下创建如下目录结构,src 目录中 最主要的是 index.html 以及 game.js 。其他文件按照自己需求自己创建
创建本地环境——安装依赖
- 安装相关依赖文件,由于项目将使用 es6 的语法,因此需要对兼容做处理,那么就要安装babel 相关的所有依赖。
npm install @babel/core @babel/plugin-transform-runtime @babel/preset-env @babel/runtime @babel/runtime-corejs3 babel-loader --save-dev - 需要把编写的脚本自动引入到html 文件中,就需要安装 htmlWebpackPlugin 插件
npm install htmlWebpackPlugin --save-dev - 多环境打包需要用到nodejs环境变量, 还有抽离多环境下公用的打包配置,以及创建本地开发环境。就需要安装cross-env,webpack-dev-server,webpack-merge
npm install cross-en webpack-dev-serve webpack-merge --save-dev - 开发中需要引入图片,音频等资源就需要 url-loader,file-loader
npm install url-loader file-loader - 然后要js 混淆和html压缩的需要安装uglifyjs-webpack-plugin
npm install uglifyjs-webpack-plugin - 最后打包生产环境的时候希望 每次打包的文件是一个新的话,需要安装 clean-webpack-plugin
npm install clean-webpack-plugin --save-dev
创建环境——编写打包配置
- 不哔哔 上代码。
- 最开始是项目配置的代码,也就是config文件夹下的 config.js
module.exports = {
dev: {
assetsSubDirectory: 'static',
assetsPublicPath: '/',
},
build: {
assetsSubDirectory: 'static',
assetsPublicPath: './',
}
}
- 其次是build文件下的所有文件代码
- common.config.js
const htmlWebpackPlugin = require('html-webpack-plugin');
const config = require('../config');
module.exports = {
context: path.resolve(__dirname, '../'),
entry: {
app: "./src/game.js"
},
stats: {
children: false
},
module: {
rules: [{
test: /\.(jpg|png|gif|jpeg|webp|svg|eot|ttf|woff|woff2)$/,
exclude: /node_modules/,
use: {
loader: 'url-loader',
options: {
limit: 0,
esModule: false,
outputPath: "static"
}
}
}, {
test: /\.js$/,
exclude: /node_modules/,
use: [{
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env'],
plugins: [[
"@babel/plugin-transform-runtime",
{ "corejs": 3 }
]]
}
}]
}]
},
output: {
filename: "js/[name]_[hash:8].js",
path: path.resolve(__dirname, '../dist'),
publicPath: process.env.NODE_ENV === 'production'
? config.build.assetsPublicPath
: config.dev.assetsPublicPath
},
plugins: [
new htmlWebpackPlugin({
template: path.resolve(__dirname, '../src/index.html'),
inject: true,
minify: { //压缩HTML文件
removeComments: true, //移除HTML中的注释
collapseWhitespace: true //删除空白符与换行符
}
})
],
optimization: {
splitChunks: {
name: 'common'
}
}
}
- dev.config.js
const merge = require('webpack-merge');
const common = require('./common.config');
const webpack = require('webpack');
const path = require('path');
module.exports = merge(common, {
mode: "development",
devtool: 'inline-source-map',
devServer: {
contentBase: path.resolve(__dirname, '../src'),
hot: true,
host: "localhost",
port: 8080,
quiet: false
},
})
- prod.config.js 代码
const webpack = require('webpack');
const merge = require('webpack-merge');
const common = require('./common.config');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
module.exports = merge(common, {
mode: "production",
plugins: [
new CleanWebpackPlugin()
],
optimization: {
splitChunks: {
chunks: "all"
}
}
})
- 接着是执行脚本的代码配置 package.json
{
"name": "demo_01",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "cross-env NODE_ENV=development webpack-dev-server --open --config build/dev.config.js",
"build": "cross-env NODE_ENV=production webpack --config build/prod.config.js"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"@babel/core": "^7.8.7",
"@babel/plugin-transform-runtime": "^7.8.3",
"@babel/preset-env": "^7.8.7",
"@babel/runtime": "^7.8.7",
"@babel/runtime-corejs3": "^7.8.7",
"babel-loader": "^8.0.6",
"clean-webpack-plugin": "^3.0.0",
"copy-webpack-plugin": "^5.1.1",
"cross-env": "^7.0.2",
"file-loader": "^5.1.0",
"html-webpack-plugin": "^3.2.0",
"uglifyjs-webpack-plugin": "^2.2.0",
"url-loader": "^3.0.0",
"webpack": "^4.42.0",
"webpack-cli": "^3.3.11",
"webpack-dev-server": "^3.10.3",
"webpack-merge": "^4.2.2"
},
"dependencies": {
"phaser": "^3.22.0"
}
}
- 最后就是入口模板index.html,和入口文件了game.js,本篇只是简单介绍如何搭建phaser 本地的开发环境,因此 game.js 里面可以什么都没有。index.html 本身也不需要什么其他复杂的东西,简单的样式和一个游戏场景的容器 canvas,场景容器canvas 是非必需的,phaser 在初始化的时候,如果你不指定容器,它会自动在body标签里面创建一个。index.html 代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>飞刀游戏</title>
</head>
<style>
html,
body {
height: 100vh;
width: 100vw;
margin: 0;
padding: 0;
box-sizing: border-box;
}
#container {
height: 100%;
width: 100%;
}
</style>
<body>
<div id="container"></div>
</body>
</html>
搭建本地环境——测试结果
到此,整个环境的搭建就结束了,在当前项目根目录打开命令行,执行 npm start,如果不出意外,浏览器会自动打开。如果控制台没有任何报错,基本上就成功了。因为html没有写任何内容,因此页面上不会显示任何东西。
搭建本地环境——结束
关于phaser 的环境搭建就简单记录在这,下回再分享利用 Phaser 开发一个比较low的游戏