《HTML5游戏开发的基本流程》


* 1. HTML5的简述
* 2. HTML5游戏开发所需的环境与工具
* 2.1. 开发环境
* 2.1.1. 浏览器
* 2.1.2. 开发语言
* 2.1.3. 开发平台
* 2.2. 开发工具
* 2.2.1. 代码编辑器
* 2.2.2. 版本控制器
* 2.2.3. 游戏引擎
* 3. HTML5游戏程序开发前所需的准备工作
* 3.1. 游戏策划文档
* 3.1.1. 主策划
* 3.1.2. 玩法策划
* 3.1.3. 关卡策划
* 3.1.4. 剧情策划
* 3.2. 游戏画面设计
* 3.2.1. 原画设计
* 3.2.2. 场景制作
* 3.2.3. 角色制作
* 3.2.4. 动画制作
* 3.2.5. 界面设计
* 4. 基于p2物理引擎的HTML5游戏开发
* 4.1. 确定游戏文件架构
* 4.1.1. .git
* 4.1.2. img
* 4.1.3. video
* 4.1.4. index.html
* 4.1.5. p2.js
* 4.1.6. game.js
* 4.1.7. README.md
* 4.2. 准备好游戏的素材
* 4.2.1. 图片
* 4.2.2. 音频
* 4.3. 编写游戏入口文件 index.html
* 4.4. 编写游戏主逻辑代码 game.js
* 4.4.1. 创建游戏舞台
* 4.4.2. 创建物理世界
* 4.4.3. 初始化物理世界
* 4.4.4. 图片资源加载
* 4.4.5. 物理世界的显示映射
* 4.4.6. 碰撞检测
* 4.4.7. 激活物理世界
* 4.4.8. 渲染画面
* 4.4.9. 人机交互逻辑
* 4.4.10. 图片绘制
* 4.4.11. 开始游戏
* 4.4.12. 游戏音效
* 4.4.13. 计分系统
* 4.5. 调试游戏
* 5. HTML5游戏编写代码完成后的工作
* 5.1. 打包
* 5.1.1. Electron概述
* 5.1.2. 下载Electron
* 5.1.3. 构建游戏项目并打包
* 5.1.4. 运行游戏
* 5.2. 发布





第一章:HTML5的简述

2007年1月9日,苹果公司前首席执行官史蒂夫·乔布斯发布了第一代的 iPhone 手机,与其同时,还拉开了拒绝支持 flash 的帷幕,挥舞起 HTML5 这块大旗。在当时,网络上大部分的多媒体都是 flash 格式的多媒体,而 HTML5 的标准还没被制定完成,iphone 不支持 flash 就意味着网络上的 flash 多媒体应用在 iphone 上无法使用。

对此,史蒂夫·乔布斯一边在抵制 flash,一边在极力吹捧 HTML5,甚至还联合众多浏览器厂商参与到 HTML5 标准的制定中,同时鼓吹重度依赖 flash 的公司转投到 HTML5 的怀抱。2010年4月30日,史蒂夫·乔布斯在网络上发布了著名的《Flash之我见》,从此,苹果面对 flash 由被动变成了主动。随着苹果开发的一款完全开源的 HTML5 渲染引擎 WebKit 的使用越来越广泛,越来越多的公司看到了 HTML5 的前景,越来越多的网页开发者能够在不依赖 flash 的情况下创造先进的图形、排版、动画和动态效果。

2014年10月29日,万维网联盟宣布,HTML5 标准规范制定完成。这一消息一出,flash 似乎走到了尽头。2015年1月,Youtube 抛弃 Flash,把站下的视频默认播放方式切换为 HTML5;2015年12月,Adobe 合并 HTML5 与 flash 动画制作软件,更名为 Animate CC;2016年12月,谷歌浏览器开始全面支持 HTML5 。

目前,无论是 iphone 还是 Android 平台,都已经不再支持 flash ,意味着在移动领域,flash 几乎不存在了。而在 PC 领域,flash 还常常可见,尤其在国内,仍有相当一部分视频网站或网页广告仍然采用 flash ,从而导致国内的浏览器普遍采用双核 Webkit + IE 和支持 flash 来保持国内的用户体验。

第二章:HTML5游戏开发所需的环境与工具

本章主要介绍 HTML5 游戏的运行环境和一些开发工具。

2.1. 开发环境

2.1.1. 浏览器

HTML5 游戏的运行必须是在支持 HTML5 的环境中,所以在 HTML5 游戏开发之前要先配置好支持 HTML5 的开发环境,然后在开发过程中在开发环境中进行调试和修改代码的错误。

很方便的是,HTML5 游戏的开发环境并不像客户端游戏的配置那么繁杂,只需要下载一个支持 HTML5 的浏览器,运行后便是一个 HTML5 游戏的开发环境。目前市面上最新的浏览器几乎都支持 HTML5,所以可以随便选择一款主流浏览器作为开发环境。

在众多主流的浏览器中,选择 Chrome 或者 Firefox ,即谷歌浏览器或者火狐浏览器作为开发环境是最佳的选择。因为 Chrome 启动速度和载入网页速度相当快,而且自带的调试工具非常好用,常作为开发环境是第一选择。而 Firefox 相比较于 Chrome 更加稳定和安全,而且辅助开发的插件相当丰富,一般 HTML5 游戏在 Chrome 开发环境上开发完成后,还会用 Firefox 再测试一遍。一般 HTML5游戏 在这两款浏览器通过测试后,就可以做到兼容市面上大多数的浏览器。

2.1.2. 开发语言

HTML5 游戏的首要开发语言是 JavaScript,因为只有 JavaScript 代码运行在 HTML5 环境的浏览器才能调用 W3C 定义的 HTML5 标准 API。

另外,市面上有一些游戏引擎并非支持 JavaScript,而是使用 TypeScript、CoffeeScript 这类面向对象语言编写游戏逻辑代码,最终编译成 JavaScript 代码运行。

一般情况下,开发 HTML5 小游戏直接采用原生 JavaScript 语言开发即可;而开发 HTML5 中大型游戏,则需要选择一款 HTML5 游戏引擎或 HTML5 游戏框架来作为开发的基础,在这些基础上深入开发。

2.1.3. 开发平台

理论上来说,在任何一个平台都能开发 HTML5,因为 HTML5 具有很好的跨平台性,几乎每一个平台都能开发 HTML5 游戏,如 Windows、Mac、Linux、IOS、Android 等等。但一般选择在 Windows 或者 Mac 下开发 HTML5 游戏,因为这两个平台可用的开发工具更加丰富和成熟;而如果开发的 HTML5 游戏是多人同时在线的网络游戏,选择 Linux 来开发游戏的服务器端即后台部分更加合适;更多地,如果开发的 HTML5 游戏是手机游戏,则需要在 IOS、Android 平台下作运行测试。

2.2. 开发工具

2.2.1. 代码编辑器

在 HTML5 游戏代码的编写阶段,选择一款好用的代码编辑器可以大大提升开发速度。

如今,web 代码编辑器比较流行的有:Sublime text、Atom、Visual studio code。这三款编辑器在 Windows/Linux/Mac 多个平台都可使用。其中,Sublime text 编辑器启动速度极快、扩展性高、稳定性强,缺点是中文支持不够好;Atom 编辑器是开源软件,可定制性强、插件丰富,缺点是启动速度慢、不够稳定;Visual studio code 编辑器是 Microsoft 公司的开源软件,其启动速度快、扩展性高、稳定性强,插件丰富,相当于 Atom 的进化版。

一般情况下,HTML5 游戏的代码编写首选 Visual studio code 编辑器,因为 HTML5 游戏代码的编写可能不单只使用 HTML、CSS、JavaScript 语言编写的前端部分,可能还会包括使用 Node.js、PHP 语言来开发的后台部分。而 Visual studio code 能满足使用多种语言编写代码共同开发 HTML5 游戏项目,可以大大提高开发效率。

同样的,Sublime text 编辑器也能满足使用多种语言编写代码共同开发 HTML5 游戏项目。如果 HTML5 游戏项目中不涉及中文的编写,一般会首选 Sublime text 编辑器。

2.2.2. 版本控制器

版本控制器是对某项目文件夹进行跟踪,当文件发生改动时,会记录文件改动的位置并生成一个版本,当文件发生误改、误删时,可以恢复文件到之前的版本。

Git 是一个开源的分布式版本控制系统,常在多人协作开发的项目用于同步管理项目。当项目在开发中代码运行后发生巨大错误而难以修复时,使用 Git 就可以将项目回退到上一个稳定的版本从而避免产生巨大的损失。

HTML5 游戏项目在启动时就应使用 Git 来对项目进行管理。因为 JavaScript 脚本语言并不像编译型的严谨语言,当项目变得十分巨大时,JavaScript 代码容易发生命名冲突等等问题,而且问题会变得很难解决导致重写代码,所以使用版本控制可以很快速地将项目恢复到稳定版本。

2.2.3. 游戏引擎

游戏引擎是游戏发展至今,开发者总结、整合出来的一套应用于游戏开发的通用、可复用程序,包括:渲染引擎、物理引擎、动画引擎、碰撞检测系统、资源管理系统、场景管理系统、音效控制系统、网络通信系统等等。

在开发 HTML5 游戏时,如果要从头开始编写代码的话,就要从渲染程序、碰撞程序、音效程序等等基础程序开始编写,会大大降低开发速度和增加重复工作,而一款合格的游戏引擎恰好就已经包括这类基础程序,所以选择一款成熟游戏引擎来开发中大型游戏项目,能让开发者专注于游戏逻辑程序的开发,大大提高了开发速度和稳定性。

由于游戏引擎本身就已经具备了一定规模,所以适合开发中大型的游戏。而开发小型游戏时,可以自由、灵活地选择某些程序库,如物理引擎来辅助开发。

目前国内有三款成熟的 HTML5 游戏引擎:Layabox、Egret、Hilo。其中,Layabox 的性能最高,支持2D/3D渲染,适合中大型游戏开发;Egret 开发工具丰富,支持2D/3D渲染,适合多人协作开发;Hilo 是一款轻量级的专注于开发跨终端互动游戏的游戏 HTML5 游戏引擎,适合开发小型游戏。

第三章:HTML5游戏程序开发前所需的准备工作

3.1. 游戏策划文档

无论是开发 HTML5 游戏,还是开发别的客户端游戏,在程序开发之前,都要进行游戏的策划,并把策划方案写成文档形式供程序开发人员参考与执行。对于不同类型、规模的游戏,游戏策划的内容也会变得不一样,一般情况下,游戏策划包括以下部分:

3.1.1. 主策划

主策划是游戏项目的总策划,内容包括了游戏的整体概念、游戏的玩法设计、游戏的开发日程管理等。

3.1.2. 玩法策划

将主策划中的玩法设计部分细化,将游戏的初步玩法设计从概念转变为具体。换句话说,玩法策划就是将游戏玩法粗无巨细地描述并记录到文档中。

比如,初步的玩法设计是玩家用鼠标在屏幕上随意涂鸦一幅画,然后 NPC 就会评价画并出价收购,同时玩家可以与 NPC 谈判以获取更好的价格。根据这一初步的玩法设计,玩法策划就要制定更加具体的规则,如规定不同的 NPC 会对不同类型的画有不同的高低评价、不同的 NPC 与玩家的谈判能力也不一样、定义谈判的方式、定义玩家什么情况下的画会一毛不值等等细节。

3.1.3. 关卡策划

进一步地,关卡策划又对玩法策划更加地细化,目的是保持原有核心玩法的基础上,不断加入新的元素或者更新旧的游戏元素,来丰富游戏的整体。关卡策划的内容包括关卡场景的设计、关卡流程的设计、关卡难度的设计、关卡NPC的设计等等内容。

3.1.4. 剧情策划

剧情设计常常与关卡策划密不可分,两者互相协调、推进游戏的开发。剧情策划的内容包括游戏世界观的架构、游戏人物的背景故事、游戏任务的故事发展、游戏人物与玩家交互的对白等等内容。

3.2. 游戏画面设计

为了尽快能让程序开发人员上手开发程序,游戏画面设计常常与游戏策划是同步进行的。当游戏的策划阶段将要到达尾声时,游戏画面设计人员就要完成一定量的游戏素材供程序开发人员使用。

3.2.1. 原画设计

原画设计是将游戏的人、物设计概念可视化。比如游戏策划人员提出了一个宏伟壮观的场景概念,原画设计人员就要根据这个场景概念通过颜色、线条等画法初步画出这个宏伟壮观的场景。

3.2.2. 场景制作

场景制作是根据场景原画来设计并制作出符合程序开发的格式文件。比如一个三维的场景,场景制作人员要在三维场景制作的软件中制作三维场景并输出能应用于游戏引擎或程序的格式文件供程序开发人员使用。

3.2.3. 角色制作

角色制作是根据角色原画来设计并制作符合用于制作动画的格式文件。比如一个二维游戏人物角色,角色制作人员要将完整的人物角色的身体分离成多张图片供动画制作人员制作人物动画。

3.2.4. 动画制作

动画制作是对场景或角色添加动画效果并生成应用于游戏引擎或程序的格式文件供程序开发人员使用。

3.2.5. 界面设计

界面设计又称用户界面设计,是除游戏虚拟世界的场景和人物以外,包括按钮、文字、窗口等等用于与玩家交互的游戏设计元素。

第四章 基于p2物理引擎的HTML5游戏开发

本章节通过编写代码来实现一款小游戏来讲述 HTML5 游戏开发的基本流程。

假设要实现的这款小游戏是一款双人打乒乓球的游戏,即两个玩家通过控制各自的球拍去击打乒乓球的游戏。为了增加游戏的趣味性,这款游戏不采用现实的乒乓球体育规则,而是只要乒乓球落在地上,就当作一局结束。由于是双人游戏,所以电脑屏幕前左边的玩家通过键盘 WASD 键来控制游戏左边的球拍的方向,右边的玩家通过方向键来控制右边的球拍移动。在乒乓球每次发球后,只要乒乓球落到了左边的地上,则右边玩家得1分,否则则左边玩家得分。根据这个简单的游戏策划,游戏画面设计也可以很简洁:

游戏画面截图

接下来正式开始开发这款 HTML5 小游戏的程序。

4.1. 确定游戏文件架构

游戏项目会随着开发的过程而逐渐增大文件量,往往很容易产生大量冗余文件而导致游戏项目变得难以管理,所以一般要在最开始的时候在游戏项目文件夹下做好游戏文件的分类,为不同类别的文件建立相应的文件夹以便管理。

project/├─ .git/
├─ img/
├─ video/├─ index.html
├─ p2.js
├─ game.js
├─ README.md

4.1.1. .git

.git 是使用 git 版本控制器对游戏项目文件初始化后生成的文件夹,在游戏开发的过程中一般不需理会。

4.1.2. img

img 文件夹用于保存游戏的图片素材,是游戏运行时访问最多的文件夹之一。

4.1.3. video

video 文件夹用于保存游戏的音效素材,也是游戏运行时访问最多的文件夹之一。

4.1.4. index.html

index.html 是游戏项目的核心文件之一,同时也是游戏的入口文件,作为游戏执行前第一个要访问的文件。

4.1.5. p2.js

p2.js 是于默奥大学的视觉交互模拟课程的成果——用 Javascript 编写的 HTML5 2D物理引擎,集成了各种复杂的物理公式和算法,可以应用于游戏开发中轻松地实现碰撞、反弹等物理现象的模拟。

4.1.6. game.js

game.js 是游戏项目的核心文件之一,基于p2 和 h5 canvas 来编写代码从而实现游戏的逻辑。

4.1.7. README.md

README.md 一般作为游戏的介绍文档。

4.2. 准备好游戏的素材

把游戏开发的编写代码过程中所要访问到的素材事先存放到相应的位置。

4.2.1. 图片

project/img├─ ball.png //球
├─ bat.png  //球拍
├─ bg.png   //背景
├─ table.png    //乒乓桌

4.2.2. 音频

project/img├─ attack.wav   //击球
├─ score.mp3    //得分

4.3. 编写游戏入口文件 index.html

HTML5 与 HMLT4 的差异是 HTML5 增加了不少的标签和定义了更多的API,同时语法也更为简洁明了。比如 HTML5 中使用 <!DOCTYPE html> 代替了 HTML4中的 长长的头文件。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>《左右互搏乒乓球》</title>
</head>
<body><!-- 引入 p2 物理引擎 --><script src="p2.js"></script><!-- 加载游戏逻辑代码 --><script src="game.js"></script></body>
</html>

4.4. 编写游戏主逻辑代码 game.js

本节将详细介绍 HTML5 游戏的逻辑代码编写过程。

4.4.1. 创建游戏舞台

HTML5 游戏与 HTML5 网页的不同之处在于 HTML5 游戏是在一个固定好的区域内进行游戏画面渲染,这个区域大小一般情况下是指 <canvas> 标签定义好的大小;而 HTML5 网页渲染超文本的范围更大。

理论上来说,基于 <canvas> 标签来实现的效果,使用 “div+css+js” 网页编写的方式也能实现。但是使用 <canvas> 的标准绘图 API 所实现的效果,无论从执行效率还是开发效率都比网页的编写方式高上一大截。

所以,以下代码的作用是创建一个宽为800像素、高为400像素的 <canvas> 区域以2d渲染方式作为游戏的显示舞台。

//创建显示舞台
var canvas = document.createElement("canvas");
var ctx = canvas.getContext("2d");
canvas.width = 800;
canvas.height = 400;
canvas.style.backgroundColor = "#333";
canvas.style.backgroundImage = "url(img/bg.png)";
document.body.appendChild(canvas);

4.4.2. 创建物理世界

既然选择采用了 p2 物理引擎,那么在编写代码之前,首先要搞清楚,物理引擎怎么与渲染引擎协调工作。

<canvas> 定义了许多 API 支持脚本化客户端绘图操作,换句话说,就是 <canvas> 仅仅具备绘图的功能,游戏逻辑的编写还是要依靠 JavaScript 语言。但是,当游戏项目需要对现实世界有真实的反应时,即游戏需要如重力、碰撞、反弹等等复杂的物理效果时,就需要一款物理引擎来模拟计算出数据,然后 <canvas> 根据得出的数据来渲染游戏画面。

物理引擎与游戏显示舞台并非同一个概念,所以还需创建一个物理世界来计算物理现象反映的数据。在这里采用了 p2 物理引擎,当然使用 p2.js 定义的函数来创建一个物理世界。

//创建一个物理世界
var world = new p2.World({gravity:[0, -9.82]
});

4.4.3. 初始化物理世界

p2 是一款 2d 的物理引擎,其物理世界自然就有一个直角坐标系,横坐标轴为 x 轴,纵坐标轴为 y 轴,原点往右的 x 坐标为正数,原点往上的 y 坐标为正数。

p2 与其他的 JavaScript 物理引擎不同的地方在于,p2 的单位坐标为 50像素。简单来说,设 p2 坐标系中的坐标点为 (1, 0) ,则对应的像素坐标为 (50px, 0) 。所以在初始化物体的位置或宽高参数时,为了与 canvas 相匹配,一般会对像素级的数值除以50得到的数参与物理世界的运算,这一过程常被称为物理世界的显示映射

//创建地面
var groundShape = new p2.Plane();
var groundBody = new p2.Body({mass:0
});
groundBody.addShape(groundShape);//创建左边的墙
var leftWallShape = new p2.Plane();
var leftWallBody = new p2.Body({position: [0, 0],angle: -Math.PI/2
});
leftWallBody.addShape(leftWallShape);//创建右边的墙
var rightWallShape = new p2.Plane();
var rightWallBody = new p2.Body({position: [canvas.width/50, 0],angle: Math.PI/2
});
rightWallBody.addShape(rightWallShape);//创建天花板
var topWallShape = new p2.Plane();
var topWallBody = new p2.Body({position: [0, canvas.height/50],angle: Math.PI
});
topWallBody.addShape(topWallShape);//添加创建好的物体到物理世界
world.addBody(groundBody);
world.addBody(leftWallBody);
world.addBody(rightWallBody);
world.addBody(topWallBody);

4.4.4. 图片资源加载

如今年代的游戏,是建立在画面基础上的,评判一款游戏的好与坏,画面占了很大的比例。编写游戏画面的渲染代码之前,首先要将构成游戏画面的若干张图片加载到内存中,以便随时被访问。上一节提到,在 p2 物理世界运转时,所有的涉及位置或宽高或角度的运算,都要进行物理世界的显示映射,才能用于游戏画面的渲染。所以,游戏画面中要参与物理运算的若干张图片在加载至内存之后,也要创建对应的物体。

//定义乒乓桌
var tableShape, tableBody;//定义兵乓球
var ballShape, ballBody;//定义左边球拍
var leftShape, leftBody;//定义右边球拍
var rightShape, rightBody;//加载乒乓桌图片
var tableReady = false;
var tableImage = new Image();
tableImage.onload = function () {tableReady = true;  //设置形状和刚体tableShape = new p2.Box({width: tableImage.width/50, //图片宽度height: tableImage.height/50    //图片高度 });tableBody = new p2.Body({mass: 10,               //重力position: [canvas.width/100, (tableImage.height+100)/50]        //物理世界的位置});tableBody.addShape(tableShape);world.addBody(tableBody);
};
tableImage.src = "img/table.png";//加载乒乓球
var ballReady = false;
var ballImage = new Image();
ballImage.onload = function () {ballReady = true;   //设置形状和刚体ballShape = new p2.Circle({radius: ballImage.width/100});ballBody = new p2.Body({mass: 1,                //重力position: [canvas.width/100, (canvas.height - ballImage.height)/50] //物理世界的位置});ballBody.addShape(ballShape);
};
ballImage.src = "img/ball.png";//加载左边球拍
var leftReady = false;
var leftImage = new Image();
leftImage.onload = function () {leftReady = true;   //设置形状和刚体leftShape = new p2.Box({width: leftImage.width/50,  //图片宽度height: leftImage.height/50 //图片高度 });leftBody = new p2.Body({mass: 5,    //重力position: [100/50, canvas.height/100],  //物理世界的位置gravityScale: 0,fixedRotation: true,collisionResponse: true,angle: -(45 * Math.PI / 180)});leftBody.addShape(leftShape);
};
leftImage.src = "img/bat.png";//加载右边球拍
var rightReady = false;
var rightImage = new Image();
rightImage.onload = function () {rightReady = true;  //设置形状和刚体rightShape = new p2.Box({width: rightImage.width/50, //图片宽度height: rightImage.height/50    //图片高度 });rightBody = new p2.Body({mass: 5,                //重力position: [(canvas.width-100)/50, canvas.height/100],   //物理世界的位置gravityScale: 0,fixedRotation: true,collisionResponse: true,angle: 45 * Math.PI / 180});rightBody.addShape(rightShape);
};
rightImage.src = "img/bat.png";

4.4.5. 物理世界的显示映射

在游戏代码运行的过程中,物理引擎会在不断地对物理世界中的物体计算出模拟物理现象的数据;而渲染引擎则不断地根据物理引擎计算出的数据对游戏画面渲染出反映物理现象的画面。

由于渲染引擎即 canvas 游戏舞台的坐标系与 p2 物理引擎的坐标系有很大的不同,所以在 canvas 渲染画面之前,需要获取符合其坐标系的数据,才能对画面做出正确的渲染。于是需要能获取物理世界中不同形状的物体经过物理引擎计算后的数据的函数。

/* 获取转化成舞台坐标的方块物体的坐标(方块物体中点坐标)、宽度、高度和角度 */
function getBoxCenterPos(shape, body){var w = shape.width*50;var h = shape.height*50;var x = body.interpolatedPosition[0];var y = body.interpolatedPosition[1];x = x*50;y = canvas.height - y*50;var angle = -body.interpolatedAngle;return {w : w,h : h,x : x, y : y,angle : angle};
}/* 获取转化成舞台坐标的圆形物体的坐标(圆形物体中点坐标)、半径和角度 */
function getCirclePos(shape, body){var r = shape.radius;var x = body.interpolatedPosition[0];var y = body.interpolatedPosition[1];var angle = body.interpolatedAngle * Math.PI / 180;r = r * 50;x = x * 50;y = canvas.height - y * 50;return {x : x, y : y,r : r,angle : angle};
}

4.4.6. 碰撞检测

碰撞检测几乎是每一个游戏开发的编写代码过程中具备的功能,用于检测物体 A 是否与物体 B 发送碰撞从而实现碰撞后的游戏逻辑。

现在在 p2 物理世界中,除墙和天花板外已经添加了地面、乒乓桌、乒乓球和左右两边的乒乓球拍共 4 个物体。每个物体间发生碰撞会执行不同的游戏逻辑。

为了实现检测不同的物体之间发生碰撞而执行不同的游戏代码,一般需要监听碰撞事件,一旦事件检测到物体发生碰撞则立即执行事件处理函数。相比于其他物理引擎,p2 中的碰撞检测事件的编写十分简单和符合 JavaScript 语言的开发思维。

//检测物理碰撞
world.on("beginContact", function(event){//如果乒乓桌碰到了地面if((event.bodyA == groundBody && event.bodyB == tableBody) ||(event.bodyB == groundBody && event.bodyA == tableBody)){if(is_game_begin === false && ballReady === true && leftReady === true && rightReady === true){gameBegin();    //游戏开始}}//如果乒乓球碰撞了if(event.bodyA == ballBody || event.bodyB == ballBody){is_ball_hit = true;}//如果球碰到了地面if((event.bodyA == groundBody && event.bodyB == ballBody)){countScore();   //计算分数}
});

4.4.7. 激活物理世界

当物体添加到物理世界后,是处于静止状态的。即使物理世界开启了碰撞检测,物体也是处于静止状态,并没有开始模拟并计算物体的物理活动。

物理引擎中的物体运动与动画类似,将静止的物体变为动态。有区别的是,动画是连续播放一系列画面,给视觉造成连续变化的感觉。而物理引擎的工作是不断地在很小的时间间隔内,根据物体的参数应用物理公式来计算并更新物体参数,从而用参数来模拟物理世界的过程。

由于物理引擎与渲染引擎有共同的特点,所以可以很方便地将两者结合,根据物理世界的参数用画面来渲染出物理现象。简单来说,就是在一秒钟内,大约60次推进物理世界的计算且执行渲染函数。

//激活物理世界
requestAnimationFrame(activate);//定义物理活动
var lastTime;
var maxSubSteps = 5;
var fixedDeltaTime = 1 / 60;
function activate(time){requestAnimationFrame(activate);// Get the elapsed time since last frame, in secondsvar deltaTime = lastTime ? (time - lastTime) / 1000 : 0;lastTime = time;// Make sure the time delta is not too big (can happen if user switches browser tab)deltaTime = Math.min(1 / 10, deltaTime);// Move physics bodies forward in time 推进物理世界world.step(fixedDeltaTime, deltaTime, maxSubSteps);// Render scene 渲染游戏画面render();
}

4.4.8. 渲染画面

在渲染画面之前,首先要判断用于渲染的图片是否已经加载完成。

/* 检测是否准备就绪 */
function checkReady(){if(tableReady && ballReady && leftReady && rightReady){return true;}return false;
}

如果图片都加载完成,那就要先清除上一帧的画面,重新再绘制新的画面。根据这个思路,就可以完成定义上一节代码中物理世界推进计算之后的渲染函数。

/* 渲染画面 */
function render(){if(checkReady() === true){ctx.clearRect(0, 0, canvas.width, canvas.height);   //清除上一帧的画面drawTable();    //绘制乒乓桌if(is_game_begin === true){drawBall();     //绘制乒乓球drawLeftBat();  //绘制左边乒乓球拍drawRightBat(); //绘制右边乒乓球拍drawScore();    //绘制分数//键盘事件的处理checkAndExeKeyDown();   }}
}

4.4.9. 人机交互逻辑

每一款游戏,人机交互是重头戏。玩家对一款游感觉好不好玩,在于游戏交互性打造得好不好,从网页的角度来看,就是用户体验好不好。到目前为止,游戏项目中的物理世界已经在运转了,游戏画面的渲染也在执行中,但是还缺少了人机交互。人机交互的方式有很多种,在 PC 游戏中,玩家可以用键盘和鼠标来体验游戏;在游戏主机中,玩家用游戏手柄来操作游戏;在手机上,玩家可以通过触屏或重力感应等方式来参与到游戏中;更多地,VR/AR 设备的人机交互方式与传统的很不相同。

由于本游戏是 PC 端的 HTML5 双人游戏,所以采用键盘的交互方式。键盘中 WASD 键对应左边球拍的上左下右移动,↑←↓→ 键对应右边的球拍的上左下右移动。

由于采用了基于物理引擎来开发,所以当玩家按下相应键盘进行球拍的上下左右移动时,首先不是直接对用于渲染的图片进行位移,而是通过设置物体球拍的速度来参与到物理世界的运算,然后再由渲染引擎将画面渲染出来。

// 键盘交互
var checkAndExeKeyDown = function () {//右玩家if (38 in keysDown) { // Player holding uprightBody.velocity[1] = 5;}if (40 in keysDown) { // Player holding downrightBody.velocity[1] = -5;}if (37 in keysDown) { // Player holding leftrightBody.velocity[0] = -5;}if (39 in keysDown) { // Player holding rightrightBody.velocity[0] = 5;}//左玩家if (87 in keysDown) { // Player holding upleftBody.velocity[1] = 5;}if (83 in keysDown) { // Player holding downleftBody.velocity[1] = -5;}if (65 in keysDown) { // Player holding leftleftBody.velocity[0] = -5;}if (68 in keysDown) { // Player holding rightleftBody.velocity[0] = 5;}
};

4.4.10. 图片绘制

在每一帧绘制游戏画面中的图片之前,首先要获取物理世界在物理引擎的计算下得出的参数,然后根据参数来绘制图片到游戏画面中。

/* 绘制乒乓桌 */
function drawTable(){var pos = getBoxCenterPos(tableShape, tableBody);   //获取参数ctx.save();ctx.translate(pos.x, pos.y);ctx.rotate(pos.angle);ctx.drawImage(tableImage, -pos.w/2, -pos.h/2);  ctx.restore();
}/* 绘制乒乓球 */
function drawBall(){if(is_game_begin === true){var pos = getCirclePos(ballShape, ballBody);    //获取参数ctx.save();ctx.translate(pos.x, pos.y);ctx.rotate(pos.angle);ctx.drawImage(ballImage, -pos.r, -pos.r);   ctx.restore();}//检测到符合条件就重置球resetBall();    
}

基于物理引擎开发的游戏与动画或影视不一样,区别在于游戏具有交互性,往往游戏开发者对玩家所做的交互操作是难以预测的,所以游戏对比与实现设置好参数的影视更加容易出现渲染效果与物理现象不匹配的现象。

为了使渲染的画面与物理世界的效果更加一致,在绘制跟玩家有交互性的图片时,往往要执行一些额外的代码来协调物理引擎与玩家的操作。

//限制球拍移动速度的次数
var limit_left_bat_count = 0;
var limit_right_bat_count = 0;/* 绘制左边乒乓拍 */
function drawLeftBat(){var pos = getBoxCenterPos(leftShape, leftBody);ctx.save();ctx.translate(pos.x, pos.y);ctx.rotate(pos.angle);ctx.drawImage(leftImage, -pos.w/2, -pos.h/2);   ctx.restore();//设置大约10/60键盘反馈时间limit_left_bat_count += 1;if(limit_left_bat_count >= 10){limit_left_bat_count = 0;leftBody.velocity[0] = 0;leftBody.velocity[1] = 0;}
}/* 绘制右边乒乓拍 */
function drawRightBat(){var pos = getBoxCenterPos(rightShape, rightBody);ctx.save();ctx.translate(pos.x, pos.y);ctx.rotate(pos.angle);ctx.drawImage(rightImage, -pos.w/2, -pos.h/2);  ctx.restore();//设置大约10/60键盘反馈时间limit_right_bat_count += 1;if(limit_right_bat_count >= 10){limit_right_bat_count = 0;rightBody.velocity[0] = 0;rightBody.velocity[1] = 0;}
}

4.4.11. 开始游戏

当物理世界已经可以正常运转、渲染引擎已经绘制出游戏画面、人机交互方式的相关代码完成后,就可以开始游戏了。

游戏的开始,首先要执行相关的初始化工作,比如设置好物理世界中物体的材质参数、监听玩家的键盘交互事件等。

//是否开球了?
var is_game_begin = false;// 键盘控制的参数
var keysDown = {};/* 游戏开始 */
function gameBegin(){tableBody.mass = 1000;  //变得很重tableBody.updateMassProperties();   //更新重量//开球了is_game_begin = true;//添加球到物理世界world.addBody(ballBody);//添加球拍到物理世界world.addBody(leftBody);world.addBody(rightBody);//创建桌子和球的材质var tableMaterial = new p2.Material();var ballMaterial = new p2.Material();tableShape.material = tableMaterial;ballShape.material = ballMaterial;//设置桌子和球之间的材质约束var ballTableContactMaterial = new p2.ContactMaterial(ballMaterial, tableMaterial, {friction : 0.03,            //摩擦力restitution : 1     //弹性});world.addContactMaterial(ballTableContactMaterial);//创建球拍的材质var batMaterial = new p2.Material();leftShape.material = batMaterial;rightShape.material = batMaterial;//设置球拍和球之间的材质约束var ballBatContactMaterial = new p2.ContactMaterial(ballMaterial, batMaterial, {friction : 0.3,         //摩擦力restitution : 1     //弹性});world.addContactMaterial(ballBatContactMaterial);//创建墙面的材质var wallMaterial = new p2.Material();// groundShape.material = wallMaterial;leftWallShape.material = wallMaterial;rightWallShape.material = wallMaterial;topWallShape.material = wallMaterial;//设置球与墙面的材质约束var ballWallContactMaterial = new p2.ContactMaterial(ballMaterial, wallMaterial, {friction : 0.4,         //摩擦力restitution : 0.8       //弹性});world.addContactMaterial(ballWallContactMaterial);//键盘控制球拍addEventListener("keydown", function (e) {keysDown[e.keyCode] = true;}, false);addEventListener("keyup", function (e) {delete keysDown[e.keyCode];}, false);
}

4.4.12. 游戏音效

对于一款游戏,最重要的除了画面、玩法,还有音效。纵观市面上游戏,从90年代开始到如今,音效是一款游戏的必备要素。音效要做到与游戏的交互契合;音乐要做到与游戏的内容契合。HTML5 定义了 audio 对象,一般 HTML5 游戏都是使用 audio 对象来加载和播放游戏音效。

//加载音频
var attackSound = document.createElement("AUDIO");
attackSound.src = "video/attack.wav";
attackSound.loop = false;
attackSound.autoplay = false;
attackSound.load();//加载音频
var scoreSound = document.createElement("AUDIO");
scoreSound.src = "video/score.mp3";
scoreSound.loop = false;
scoreSound.autoplay = false;
scoreSound.load();

在定义的碰撞检测中,当球拍与球碰撞时,就播放球拍的击打音效。

//乒乓球是否碰撞了
var is_ball_hit = false;//每次发生碰撞结束后,检测碰撞,符合条件则播放击打音效
world.on("endContact", function(event){if(is_ball_hit === true){attackSound.play(); //播放音效is_ball_hit = false;}
});

4.4.13. 计分系统

作为一款游戏,输赢是必须要有的。定义输赢的方式多种多样,其中最简单莫过于计分,通过计分来定义玩家的表现是很常见的判断输赢的方式。根据碰撞检测中的设计,当球掉到地上的时候,就要开始计算分数。

//最后得分的球拍,true为右,否则为左
var is_right_last_win = true;//球拍得分
var leftBodyScore = 0;
var rightBodyScore = 0;//本次输赢是否已计分
var is_count_score = false;/* 计分系统 */
function countScore(){//如果未计分if(is_count_score === false){is_count_score = true;var pos = getCirclePos(ballShape, ballBody);if(pos.x < canvas.width/2){rightBodyScore += 1;is_right_last_win = true;}else{leftBodyScore += 1;is_right_last_win = false;}//播放得分音效scoreSound.play();}
}

为了显示得分情况,在每次执行 render() 渲染时,还要绘制出双方的分数。

/* 绘制分数 */
function drawScore(){var pos = getBoxCenterPos(tableShape, tableBody);var score = leftBodyScore+" - "+rightBodyScore;ctx.font = "bold 40px Arial";ctx.fillStyle = "#eee";ctx.textAlign="center";ctx.fillText(score, pos.x, pos.y+30);
}

当分数有更新的时候,延时到60帧后,就重新发球,即重开一局。

//延时60帧
var delay_reset_time = 60;/* 重置球的下落 */
function resetBall(){if(is_count_score === true){delay_reset_time -= 1;  //倒计时//如果倒计时完成if(delay_reset_time <= 0){//如果最后一次击球是右球拍if(is_right_last_win === true){ballBody.position[0] = (canvas.width/2 + tableImage.width/4)/50;ballBody.position[1] = (canvas.height - ballImage.height)/50;}else{   //如果最后一次击球是左球拍ballBody.position[0] = (canvas.width/2 - tableImage.width/4)/50;ballBody.position[1] = (canvas.height - ballImage.height)/50;}//重置两个标志变量delay_reset_time = 60;is_count_score = false;}}
}

4.5. 调试游戏

当游戏的主逻辑代码 game.js 编写完之后,就要开始调试游戏了。调试是为了查看游戏在执行的过程中是否会出现 BUG ,或者检测游戏是否表现得与预期的一致。

HTML5 的调试十分简单,在需要获取数值、对象详细信息的代码处,加入语句 console.log(相关变量名);。然后双击 index.html 文件打开至支持 HTML5 的浏览器。以 chrome 浏览器为例,打开 index.html 文件后,按下键盘中的 F12 键,即可在 console 控制台窗口查看到执行至函数 console.log 处输出到控制台的相关信息,或者查看到 bug 报错信息。

第五章 HTML5游戏编写代码完成后的工作

HTML5 的最大特性就是跨平台,有句流行的话叫 “一次编写,多平台运行” ,这句话的意思就是,代码只需要写一次,在各个平台如 Windows、Linux、Android、IOS 等等都能运行。市面上已经有不少 HTML5 跨平台的应用,比如网易云音乐、有道云词典等等。由于支持 HTML5 的浏览器内核已经十分成熟,只要在 HTML5 内核的环境下,HTML5 就能运行,而几乎每一个系统都支持 HTML5 内核,从而 HTML5 的跨平台性前所未有,越来越受到开发者的青睐。

另外,HTML5 始终未网页发展而来的技术,HTML5 在浏览器内运行才有最好的体验。但是为了更好地发挥 HTML5 的特性,市面上诞生了各种各样的打包技术,可以将 HTML5 打包成软件形式安装于各系统中使用。在手机系统方面,有开源的打包方案 Cordova,可以将 HTML5 应用打包在 Android、IOS、Ubuntu phone os、Windows Phone、Symbian 等常见系统中运行;在桌面应用方面,有开源的打包方案 nw.js ,可以将 HTML5 应用打包成多个系统的桌面应用,包括 Windows、Linux 等系统。

5.1. 打包

本节将介绍如何使用 Electron 框架将 HTML5 游戏打包成 Windows 下的可执行文件即桌面应用。

5.1.1. Electron概述

Electron 是一个几乎不同修改任何代码即可将网站打包成一个桌面应用的开源框架。 Electron 已经被 Microsoft、Facebook、Slack、Docker 等知名大公司用于程序开发之中。市面上的
Visual Studio Code、Hyper、Simplest 等著名软件是使用 Electron 技术来构建的。

所以 Electron 是一个相当成熟的框架,而且由于其实开源项目,全球许多开发者在为其进行维护和更新,以满足更多的开发需求。

5.1.2. 下载Electron

浏览器下访问 https://coding.net/u/linhongbijkm/p/Electron-packager-build-project/git ,点击下载即可将 Electron 下载到本地中。

5.1.3. 构建游戏项目并打包

下载 Electron 完成后,解压压缩包会得到 Electron-packager-build-project-master 文件夹,为了更加简便,将这个文件夹名修改为 electron 。然后把游戏项目中的所有文件复制并替换到 electron\resources\app\project 目录下。

接着,用文本编辑器打开 electron\resources\app\main.js ,将其第16行代码 mainWindow = new BrowserWindow({width: 800, height: 600}) 中的宽高值修改并保存为:

mainWindow = new BrowserWindow({width: 850, height: 460})

这样就只需三步即可对游戏项目完成打包。

5.1.4. 运行游戏

打包完成后,双击 electron\app.exe 可执行文件即可运行游戏。

5.2. 发布

如果采用对游戏项目打包成桌面应用的话,在网络上提供对 electron 文件夹的压缩包,解压后运行其中的 app.exe 即可。

如果采用原生的 HTML5 形式发布的话,由于 HTML5 就是网页,所以发布的过程与网页前端的发布方式一致。





p2物理引擎下载地址:github.com/schteppe/p2.js


以上代码效果演示地址:linhongbijkm.coding.me/p2.js-game/

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. mac 软件打包流程 packages打包教程

    1 下载packages软件http://s.sudre.free.fr/Software/Packages/about.html2 打开软件。选择Distribution。点击next 3 输入project name 这个是packages软件工程的名字,随便起。Project Directory 是保存packages软件工程的位置。然后点击create创建工程。 4 在build页面中…...

    2024/4/25 1:18:31
  2. 64位ubuntu 11.10下android开发环境的搭建(jdk+Eclipse+adt+android sdk详细)

    一直在windows下进行的android开发,但有时感觉Eclipse和模拟器,执行效率不是很高,有时甚至感觉让人难以忍受,遂改在ubuntu下进行android开发,下面是我的android开发环境搭建过程,平台搭建成功,在搭建的过程中,一些注意事项我也做了下简单的介绍。下面是正文。 一.安装j…...

    2024/5/6 9:47:33
  3. 经典按键检测程序(二)--带长按检测

    /************************************* // 函数名称:CheckKey // 函数功能:按 键 检测程序备注:本例是波两次的程序 需滤波三次或三次以上请参考被屏蔽的代码程序的用法:每隔10MS 调用一次这个程序即可uint8 KLST 上次按键的状态uint8 KNOW 本次按键的状态uint8 KSTBL …...

    2024/4/17 0:13:41
  4. nginx入门一:启动,停止和重新加载配置

    1.启动nginx 一旦nginx启动,它可以通过使用-s参数调用可执行文件来控制。使用以下语法: 命令:nginx -s option 当option可以是下列之一: stop - 快速关机 quit - 正常关机 reload - 重新加载配置文件 reopen - 重新打开日志文件 nginx -s quit 在将重新配置命令的命令发送到…...

    2024/4/17 0:13:59
  5. 使用JS和Canvas做一个html5小游戏

    这是一个很简单的html5游戏,通过学习原博文自己做了些改造,现在附上原博文的链接这是游戏的截图:1.有计算抓住的怪物的数量2.有背景,英雄,怪物。第一步:建立html文件和js文件建立一个games文件夹,在文件夹中建立js文件夹,images文件夹,以及index.html。game.js放在js文…...

    2024/4/24 7:20:23
  6. DAY3-JDBC+Tomcat实现简易登陆系统

    目录bean包下User类dao包下UserDao类service包下UserServiceImpl类和UserService接口servlet包下HelloServlet类和LoginServlet类util包下DBUtil类xml文件笔记 bean包下User类 public class User {public User() {}public User(int id, String username, String password) {thi…...

    2024/4/19 14:41:23
  7. Weex环境构建(一)Weex+Android开发环境

    构建痛点Weex与Android是两个开发环境,最终的关联点是weex生成的js放到Android的Assets中,当然Android也可以采用远程方式加载js,这个暂时还没用到。下面介绍对两个平台简单整合。weex环境通过weex命令初始化weex开发环境weex init weexPro创建Android工程在weexPro根目录下…...

    2024/4/17 23:51:41
  8. 好用的nginx入门教程

    http://www.nginx.cn/doc/index.html...

    2024/5/6 6:30:15
  9. Quartus II - 软件安装教程

    关注【电子开发圈】微信公众号,一起学习吧!电子DIY、Arduino、51单片机、STM32单片机、FPGA…… 电子百科、开发技术、职业经验、趣味知识、科技头条、设备拆机……点击链接,免费下载100G+电子设计学习资料!http://mp.weixin.qq.com/mp/homepage?__biz=MzU3OTczMzk5Mg==&a…...

    2024/4/19 5:07:35
  10. 大学生 计算机 毕业设计 xx管理系统 毕设(1)

    xx管理系统 计算机专业的毕设,尤其是计科专业,总是脱离不开的简单题目就是xx管理系统,学生宿舍管理系统,仓库管理系统,超市销售管理系统,宠物医院挂号系统,会员卡管理系统,人才管理系统,图书管理系统,社区物业管理系统,教学信息管理系统等等题目。都9102年了,我相信…...

    2024/4/20 3:25:22
  11. 多功能万年历控件编程

    下载地址:http://download.csdn.net/source/2366929 首先感谢你下载和使用该控件,希望它能满足你的要求。若有任何问题请及时告知我们,我们将在第一时间为你解决,祝君万福!开发目的:VC自带的日历控件只有公历(阳历),而没有我们国家的阴历(农历)以及24节气及节假日信…...

    2024/4/17 0:13:59
  12. Goland软件使用教程(二)

    Goland软件使用教程(二)一、编码辅助功能 1. 智能补全IDE通过自动补全语句来帮助您来编写代码。快捷键“Ctrl+shift+空格”将会给你一个在当前上下文中最相关符号的列表,当您选择一个建议时,它会相应的将有关包导入到你的当前文件中。2 检查和快速修复 IDE提供内置…...

    2024/3/31 22:07:11
  13. Nginx入门之负载均衡配置

    本文是通过phpstudy带的nginx实现的,如需下载nginx访问Nginx负载均衡一些基础知识:nginx 的 upstream目前支持 4 种方式的分配 1)、轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 2)、weight 指定轮询几率,weight和访问比…...

    2024/4/17 0:13:53
  14. Centos7下为Open-falcon部署OpenTsdb

    一边安装一边写,写得略乱安装OpenTsdb需要HBase,HBase需要Zookeeper和HDFS这一串都是apache家的,安装java是必须的yum install -y java一、安装Zookeeper在五个节点上部署zk下载tar包https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.6.1/apache-zookeep…...

    2024/5/6 17:55:38
  15. android java 开发环境搭建

    1、环境搭建1.1、JDK安装1.2、Eclipse安装1.3、Android SDK下载和安装(下载好SDK后打开android sdk manager,下载和安装android对应手机android版本的API)1.4、ADT安装 - eclips 开发android应用的插件1.5、创建AVD - android 模拟器 (1.eclips创建 2.命令行创建) avd是androi…...

    2024/4/17 0:14:05
  16. Orange数据挖掘工具介绍

    Orange3 使用 一、Orange3数据挖掘工具的介绍官方网址:https://orange.biolab.si/正如首页介绍的那样:它是一个面向新手和专家的开源的机器学习和数据可视化工具,带有很多用于数据挖掘或机器学习模型的交互式数据分析工作流程;另外,它绑定了Python语言进行脚本开发。包含一…...

    2024/4/17 0:14:17
  17. Linux centos7 乱码设置中文字符集

    1.locale 查看现在使用的字符集locale -a 查看有哪些字符集utf8的就可以显示中文yum -y install kde-l10n-Chinese 安装后选个uft8的 ,设置一下全局变量vi /etc/profileexport LANG=en_CA.utf8=号后面是字符集,这个大家随意最后让这个配置文件生效就可以了. /etc/profile 可能…...

    2024/3/31 22:07:09
  18. Java入门——万年历(控制台)

    我发誓,我这一次要认真写。简要说明编写一个控制台万年历程序。用户输入年份与月份,控制台打印出该月的日历。(可连续输入打印日历,输入exit退出系统)简要分析想要打印该月的日历需要知道以下信息:该月的天数该月第一天是周几 月份的天数有四种情况:大月份31天小月份30天…...

    2024/5/6 16:06:54
  19. 3dmax2019软件下载Autodesk 3dmax2019安装注册激活教程中文版

    3dmax2019是目前专业制图3dmax软件的最新版本,从软件界面、优化功能、VR场景、智能工具等都有不同程度的提升,使用起来极为方便,可以大大提升工作效率和制图质量; 【软件下载链接(百度网盘):https://pan.baidu.com/s/1f5p0mycgrzihcIQFBXYZVA 提取码:ts3t】 一、安装视…...

    2024/4/20 4:27:16
  20. kmpro针对某集团10大知识管理需求的解决方案

    1. 知识的检索 本知识管理系统系统采用自主研发的CICADA搜索引擎。知识搜索是系统用户应 用知识的主要途径之一,本系统应用基于自然语言的全文搜索引擎技术,实现系统 搜全与搜准的两大技术要求,并突破性地实现了基于附件知识的全文搜索,能够快 速、准确的在系统中锁定知…...

    2024/5/6 15:38:41

最新文章

  1. 突破销量瓶颈:亚马逊,速卖通,国际站销量提升实战技巧

    1、精心选品&#xff1a;选品是亚马逊销售的第一步&#xff0c;也是至关重要的一步。卖家应该进行市场调研&#xff0c;了解消费者的需求和喜好&#xff0c;选择有市场潜力的产品。要注意产品的差异化&#xff0c;避免与竞争对手的产品过于相似。 2、优化产品详情页&#xff1…...

    2024/5/6 18:11:52
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/5/6 9:38:23
  3. 游戏引擎架构01__引擎架构图

    根据游戏引擎架构预设的引擎架构来构建运行时引擎架构 ​...

    2024/5/4 14:29:43
  4. 【APUE】网络socket编程温度采集智能存储与上报项目技术------多路复用

    作者简介&#xff1a; 一个平凡而乐于分享的小比特&#xff0c;中南民族大学通信工程专业研究生在读&#xff0c;研究方向无线联邦学习 擅长领域&#xff1a;驱动开发&#xff0c;嵌入式软件开发&#xff0c;BSP开发 作者主页&#xff1a;一个平凡而乐于分享的小比特的个人主页…...

    2024/5/6 2:28:08
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/4 23:54:56
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/4 23:54:56
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/5/4 23:54:56
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/6 9:21:00
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/5/4 23:54:56
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/5/4 23:55:05
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/5/4 23:54:56
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/5/4 23:55:16
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/5/4 23:54:56
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/6 1:40:42
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/5/4 23:54:56
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/5/4 23:55:17
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/5/4 23:55:06
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/5/4 23:54:56
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/4 23:55:06
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/5 8:13:33
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/5/4 23:55:16
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/5/4 23:54:58
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/4 23:55:01
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/5/4 23:54:56
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57