所有前端都要看的2D游戏化互动入门基础知识

背景

现在越来越多的公司和APP开始使用游戏化的方式去做产品了,所谓游戏化,是指在非游戏环境中将游戏的思维和游戏的机制进行整合运用,以引导用户互动和使用的方法。支付宝里面的蚂蚁庄园、蚂蚁森林,通过游戏和公益的结合实现用户的留存和活跃。淘宝支付宝的芭芭农场、京东的东东果园、拼多多的多多果园、美团的小美果园...无一不是通过游戏化的方式去提升用户留存的方案。

本篇文章,我会列出一些游戏化互动类的游戏,让大家看一下阅读本文后,我们可以做的项目是怎样的。

然后对一个案例进行拆分,带大家学习一些2D互动最基础的知识,让大家能够快速上手写互动游戏。

能做什么

互动案例

‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍我们来看几个2D互动项目,目前,大多数的互动都是以游戏的形式展现,通过游戏的玩法和精致的效果,让用户有更好的互动体验,我们通过养成,采集,塔防,抓娃娃等类似游戏的形式,结合业务属性,达到更好的业务效果。

案例分析

我们进行一个案例分析,先来看一下,在一个互动项目中,我们需要用到哪些互动游戏的元素,首先,我们可以看到整个场景里面有背景和前面的猫动画,背景是使用了图片展示,猫动画是用了骨骼动画实现的,在招财猫的钱袋中,有时间进度条信息,进度条是使用两个圆角矩形实现的,进度变化是使用过渡动画实现的。在互动项目中,我们还会用到一些帧动画、精灵图、事件的能力。对于普通的前端开发来讲,有一些概念我们并不常用,接下来就让我们开始了解一下这些基础知识。

基础学习

2D互动常用能力

首先,我们看一下2D互动游戏所用到的常用能力,第一部分是前端知识,主要包括渲染所需的绘制工具,游戏循环,资源加载的能力。然后是基础的绘制和动画能力,也就是前面提到的一些游戏基础元素。在游戏开发中,会涉及到很多数学相关的知识,比如让游戏中的物体模拟真实的物理效果,或者像一些游戏中的人机对战中的机器人,是使用游戏AI来实现的,在本文中不会过多讲解数学类知识。

互动游戏是如何运行起来的

互动游戏是如何运行起来的呢?首先,我们知道,目前很多前端项目都是通过数据带动视图的,游戏也是这样的,比如说,我们在游戏里面有一个飞机,那么,我们需要定义飞机的尺寸,以及他在游戏中的位置,和他对应的飞机图片,这些属于游戏数据,我们将数据提交给渲染引擎,渲染引擎根据这些数据内容将对应的内容渲染到画布上。

游戏是动态运行的,为了实现一些动画/真实物理效果效果,我们通过动画,AI,物理引擎等工具控制数据的变化,然后通过循环来持续修改数据,并且渲染到画布实现游戏的运行。

循环



我们知道,通过循环来实现游戏的运行效果,接下来我们来看一下在前端浏览器环境下,游戏循环是如何实现的。

浏览器提供了requestAnimationFrame方法,要求浏览器在下一次绘制之前,调用制定的回调函数,这个方法一般是用于更新动画的。

浏览器在的每一次重绘我们叫做1帧,浏览器默认的绘制频率是60帧,也就是说,正常情况下,浏览器一秒会刷新60次。

通过下面的方法,我们可以保证每一帧渲染之前,我们可以进行数据的计算以及调用渲染方法

const loop = () => {requestAnimationFrame(loop)// 计算数据// 绘制图形
}
requestAnimationFrame(loop)

因为requestAnimationFrame方法只会在下一次绘制前被调用,所以,我们需要在每次调用方法的时候去调用一次这个方法保证游戏继续运行,所以在loop方法里面会重复调用这个方法。

一般情况下,我们会把这个方法放在函数的最前面,因为,如果在计算数据和绘制图形的过程中报错了,会导致程序无法执行到这个方法,游戏也就停掉了。

画布

在html中,我们一般使用canvas标签来绘制图像,它本身没有绘制能力,使用getContext获取绘制上下文,调用上下文上面的方法进行绘制。

常用的绘制上下文有Canvas API 和WebGL,一般CanvasAPI来绘制2D图像,WebGL可绘制2D和3D图像,他的性能更高。

canvas提供了一些比较基础的API,但是在互动游戏中的元素是比较复杂的,所以一般都会有渲染引擎和游戏引擎来承接这些元素。

本文不会详细讲解Canvas,可以到MDN等平台学习。

基础渲染

接下来我会介绍一下,在2D游戏化互动游戏中,我们经常用到几种渲染方案。

  • 图片

  • 文本

  • 图形

  • 精灵

  • 九宫格

  • 遮罩

图片和文本就不用说了,是视图开发中最常用到的。我们从图形开始说

图形

一般在开发中会经常使用一些简单的图形,图片不仅会用在直接展示内容,也会用在对渲染内容的遮罩,例如一张图片只显示图形内的内容,也会用在按钮区域判断、物理引擎碰撞的形状等等地方。

精灵


精灵图也是我们在 CSS 中接触的精灵图,就是将多张图片合成在一张大图中,在使用时渲染其中某个位置,通过精灵图的方式,我们可以提高网络加载效率以及渲染效率。一般精灵资源是由两个文件组成,一个是图片文件,另外一个是位置信息文件。一般使用引擎进行渲染时,只需要关心对应小图的名称。

九宫格

我们经常会遇到一些尺寸不固定,但是周围或四遍样式不变形的图片,也就是 .9 图,例如消息气泡,如果直接设置宽高会将整个气泡图片拉变形。

使用九宫格的原理进行解决:

一般渲染引擎也会提供方便的方式实现。

遮罩

通过遮罩可以实现渲染内容的遮罩效果,是不是很像给div设置 overflow:hidden

基础动画

过渡动画

例如一个物体经过3秒,从100px的地方移动到500px。我们可以通过以下方法计算。

startTime 是动画开始的时间。

如果一个物体向右做匀速运动,我们可以使用公式 s = v * t

一般情况下,我们都会使用现成的动画库,类似 Tween.js 实现,当然在实现复杂的动画逻辑时,还可以使用一些工具,类似Lottie,我们还是需要手写动画的。

逐帧动画

一般情况下,我们只需要将连续的单张图片播放即可实现,但考虑工程上的便利以及渲染时的性能,我们会将其打包在一张图片上,所以一般逐帧动画资源是由两个文件组成。可是通过 Texture Packer来实现逐帧动画资源,一般是由设计师逐帧绘制,然后导入 Texture Packer 后导出资源文件,开发者直接使用资源文件即可。

骨骼动画

骨骼动画可以模拟实现一些比较复杂有一定关节逻辑的动画,比起帧动画而言,所使用的图片更少,占用内存更小。

骨骼动画主要以下几部分组成:

骨骼动画贴图

骨骼设计以及动画

贴图+骨骼+动画

所以骨骼动画资源一般由三个文件组成,常用的骨骼动画设计软件是 Spine 和 Dragonbones,一般是由设计师或者动画设计师进行设计。开发者只需要使用软件导出的资源即可。

项目实战

了解到以上的内容,我们就可以开发互动项目了,工欲善其事,必先利其器,这里我们推荐由淘系技术部开源的 Eva.js,它是专门给前端开发者提供的开发游戏化互动项目所设计的。目前淘宝、天猫、支付宝、优酷、阿里妈妈、AliExpress、Lazada、考拉等很多产品都在使用,2020年双11养猫猫项目也是使用 Eva.js 实现的。

接下来我们拿一个最简单的 Demo 来学习使用 Eva.js。

这是一颗心做左右移动动画,点击后弹出一个alert。

Eva.js 的游戏是由游戏对象和组件构成,游戏对象代表游戏中的一个物体,组件代表物体的能力,在这个例子中,只有一个物体,他的能力有三个:

  • 显示成一个心的图片

  • 有一个左右的过渡动画

  • 点击事件

我们刚刚分析了这个 Demo 所需要的能力,接下来我们要做 Eva.js 开发游戏的四步操作

Step1 添加资源&创建游戏

import { resource, Game } from '@eva/eva.js'
import { RendererSystem } from '@eva/plugin-renderer'
import { ImgSystem } from '@eva/plugin-renderer-img'
import { EventSystem } from '@eva/plugin-renderer-event'
import { TransitionSystem } from '@eva/plugin-transition'resource.addResource([{name: 'imageName',type: RESOURCE_TYPE.IMAGE,src: {image: {type: 'png',url:'//gw.alicdn.com/bao/uploaded/TB1lVHuaET1gK0jSZFhXXaAtVXa-200-200.png',},},preload: true,},
]);const game = new Game({systems: [new RendererSystem({canvas: document.querySelector('#canvas'),width: 750,height: 1000,}),new ImgSystem(),new EventSystem(),new TransitionSystem()],
});

addResource 传入了一个资源的里面,这里不一定只有图片资源,还可以有帧动画、骨骼动画等等资源,这里以图片资源举例子。更多Demo可以进入 Eva.js 官网 中查看。

在添加资源之后,我们也创建了一个游戏实例,这是运行游戏的主要运行时, 因为 Eva.js 只有一个最核心的游戏运行时,所以我们所有的功能都是要自己安装的哦~所以我们要安装这个游戏所需要的系统,图片、事件、动画。

  • RendererSystem 是用来将游戏渲染出来的系统,所有渲染的能力都依赖这个系统,里面设置了宽高以及所要渲染的canvas对象。

  • ImgSystem 是用来画图片的系统

  • EventSystem 是用来触发点击事件的系统

  • TransitionSystem 是用来做位移动画的系统

Step2 创建对象,并设置定位

import { GameObject } from '@eva/eva.js'const heart = new GameObject('heart', {size: { width: 200, height: 200 },position: {x: 0,y: 0,},origin: { x: 0, y: 0 },anchor: {x: 0,y: 0,},
});

GameObject 的第一个参数为对象的名称,第二个参数为对象的位置信息,其中 size 设置对象大小, position 设置位置,其他的可以后续参考文档学习哦~

Step3 添加所需要的组件

刚刚我们在 new Game 的时候添加了实现视频功能所需要的系统,这些系统是为了读取组件上面的数值然后实现功能的,所以,我们需要给对象添加组件以后,才能够让对象实现对应的功能。

我们目前所需要的功能是图片渲染、点击事件、位移动画,所以我们要添加三个组件

图片渲染

import { Img } from '@eva/plugin-renderer-img'heart.addComponent(new Img({resource: 'imageName',}),
);

调用 heart 的 addComponent 方法既可添加组件,这里我们添加 Img 组件, Img 组件有个 resource 参数,该参数是图片资源的名称,其实对应了 Step1 中添加的图片资源的名称。当然雪碧图、骨骼动画也是同样的原理,需要在 resource 中添加资源,在添加组件的时候使用。

点击事件

import { Event } from '@eva/plugin-renderer-event'const evt = heart.addComponent(new Event())
evt.on('tap', () => {alert(1)
})

给游戏对象添加一个 Event 组件,并通过 on 方法绑定 tap 事件, on 的第二个参数为 tap 事件所触发的函数,当然,Event 组件还有其他事件,我们可以通过 Eva.js 文档查看。

位移动画

import { Transition } from '@eva/plugin-transition'const transition = heart.addComponent(new Transition())
transition.group = {idle: [{name: 'position.x',component: heart.transform,values: [{time: 0,value: 0,tween: 'ease',},{time: 1000,value: 400,tween: 'ease',},{time: 2000,value: 0}]}]
}
transition.play('idle', Infinity)

上面的代码中,我们创建了一个动画组,名字叫做 idle 当前动画组里面,我们对 heart.transform 组件的 position.x 属性进行数值变化,0->1000ms,数值从0->400,1000ms->2000ms,数值从400->0,然后使用 Transition 组件的 play 方法,让动画执行 Infinity 次。

Step4 运行

一般游戏都是自动运行的,所以做完以上工作后,游戏会自动开始运行。

总结

未来会有越来越多的游戏化产品,开发互动类游戏将成为前端工程师的必备技能,通过本篇文章,我们可以了解到一些基础的游戏化互动技术,也通过 Eva.js 学习了如何实现一个最简单的互动游戏。如果想对游戏化、互动技术更加深入,我们需要去深入学习游戏引擎、渲染原理、动画、物理、音效等技术,对于互动业务开发来说 Eva.js 目前能满足大部分需求。

前端领域中游戏化方向刚刚起步, Eva.js 是专注于开发游戏化项目的游戏引擎,也处于刚刚起步的状态,未来 Eva.js 会继续专注于前端,专注于游戏化项目,让游戏化项目开发更简单。我们也希望大家能够参与到前端游戏化领域的建设中来,我们也会陆续分享相关的技术,输出游戏化项目开发能力。

人人可开发、处处有互动


我们团队的使命是“人人可开发、处处有互动”,基于这样的目标,Eva.js 会最大化的减少互动游戏的开发成本,让每一个前端工程师都可以低学习成本开发互动游戏。

Eva.js 将于 4 月 22 日举办开源技术专场,欢迎扫海报上的二维码入群, 也可以点击阅读原文扫码进群,群内大佬云集!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/275980.shtml

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

相关文章

江苏一动物园现“旋转活马” 园方:创意来自马术训练

中新网南通1月31日电 (记者唐娟)“旋转马设备采用同时容纳六匹马的遛马器组装而成,对马匹没有任何伤害,初衷是希望给小朋友一种全新体验,这才有了这个创意项目。”1月31日,针对活马版“旋转木马”引发的热议,江苏南通森…

加快信息化建设对地方发展的_加快设计师职业发展的9种方法

加快信息化建设对地方发展的重点 (Top highlight)Over the past few months, I have had an increase in conversations with design students from various institutions, as well as early, to senior-level designers, researchers, & product managers from various co…

epoll监听文件_介绍一下 Android Handler 中的 epoll 机制?

介绍一下 Android Handler 中的 epoll 机制?目录:IO 多路复用select、poll、epoll 对比epoll APIepoll 使用示例Handler 中的 epoll 源码分析IO 多路复用IO 多路复用是一种同步 IO 模型,实现一个线程可以监视多个文件句柄。一旦某个文件句柄就…

前端工程师的一大神器——puppeteer

大家好,我是若川。欢迎加我微信 ruochuan12,长期交流学习。今天推荐神器puppeteer,我猜有挺多人不知道。文章不长,看完有空也可以试玩。我18年也写过一篇puppeteer爬取生成pdf的文章,时间真快。前端使用puppeteer 爬虫…

selenium界面元素定位

一、 Selenium界面元素定位 本文元素定位以das2为例 #导入包 from selenium import webdriver #打开火狐驱动 driverwebdriver.Firefox() #访问网址 driver.get("http://192.168.3.217:8080/das/seatlogin.jsp ") 进行web页面自动化测试,对页面上…

vue.js ui_UI / UX开发:考虑Vue.js

vue.js uiBecause sometimes we have to add logic to our concepts, and Vue makes it a whole lot easier.因为有时我们必须在概念中添加逻辑,而Vue使其变得更加容易。 FULL DISCLOSURE: THIS IS NOT A COMPLETE JAVASCRIPT OR VUE COURSE. There’s no way I co…

Silverlight学习笔记十七BingMap(三)之地图的地区标识

如果我们需要在Bing Maps中加入一个小图钉标记&#xff0c;该如何实现了&#xff1f; Bing Maps控件已经为我们提供了这个功能&#xff0c;在Microsoft.Maps.MapControl名称空间下提供了实现图钉应用的图钉层Pushpin类用该类来实现普通标识 在Xaml中添加<map:Pushpin Locati…

win10查看pcie设备_壹拓网科技解密WIN10系统使用向日葵开机棒远程开机需要设置几个地方...

向日葵开机棒&#xff0c;是一款非常好用的远程智能远程开机硬件&#xff0c;它一头接网线&#xff0c;另外一头和被开电脑接在同一个路由器下&#xff0c;不需要和被开电脑或者设备直接连接&#xff0c;当然&#xff0c;被开电脑需要有线联网&#xff0c;暂时不支持使用无线方…

如何成为公司独当一面的工程师

大家好&#xff0c;我是若川。欢迎加我微信 ruochuan12&#xff0c;长期交流学习。今天推荐黄老师的这篇文章&#xff0c;你可能看到过了&#xff0c;但值得再看一遍。之前常有小伙伴问&#xff0c;大多情况下我都会分享这篇文章。点击下方卡片关注我、加个星标&#xff0c;或者…

flex如何做响应式设计_响应式设计-您做错了!

flex如何做响应式设计Responsive design is not just about the web that automatically adjusts to different screen resolutions and resizeable images, but designs that are crucial for web performance.自适应设计不仅涉及可自动适应不同屏幕分辨率和可调整大小图像的网…

30万手表推荐_今年六十岁生日,儿子说要送只30万的手表,请问有哪些推荐?...

关注腕表部落&#xff0c;尽享腕表生活一位读者向笔者提出这样一个问题&#xff1a;今年六十岁生日&#xff0c;儿子说要送只30万的手表&#xff0c;请问有哪些推荐&#xff1f;首先要恭喜这位老爷子&#xff0c;一来是生日马上就要到了&#xff0c;二来是还有这么孝顺而且慷慨…

写 Node.js 代码,从学会调试开始

大家好&#xff0c;我是若川&#xff08;点这里加我微信 ruochuan12&#xff0c;长期交流学习&#xff09;。今天推荐这篇调试文章&#xff0c;熟悉我的读者都知道我写的源码文章都多次强调要调试&#xff0c;而且写了调试方法。点击下方卡片关注我、加个星标&#xff0c;或者查…

创建用户友好的表单

Forms are a common way to engage with users and could be a user’s first impression of your product. Since forms aren’t always the user’s favourite thing, it is essential to make filling out forms as easy as possible. Let’s go over a few tips for creati…

细节决定成败—关于.net的.dll.refresh文件

一直在做.net的项目&#xff0c;c/s的、b/s的&#xff0c;一直没有注意这个东西。众所周知&#xff0c;.net的程序生成后会在bin目录下生成.dll文件&#xff0c;而.dll.refresh这个文件从何而来呢&#xff1f;那天无聊地google了下才知&#xff0c;这个东东是在你的项目中引用第…

环境在c盘_如何给女朋友解释为什么 Windows 上面的软件都把自己安装在 C 盘

本文经授权转载自漫画编程(ID&#xff1a;mhcoding)周末&#xff0c;我在家里面看电视&#xff0c;女朋友正在旁边鼓捣她的电脑&#xff0c;但是好像并不是很顺利&#xff0c;于是就有了以下对话。计算机存储我们使用的计算机中&#xff0c;保存信息的介质有两类&#xff1a;一…

能让你纵享丝滑的SSR技术,转转这样实践

大家好&#xff0c;我是若川&#xff08;点这里加我微信 ruochuan12&#xff0c;长期交流学习&#xff09;。今天推荐这篇图文并茂的SSR技术文章。这是江西前端群里一个小伙伴的文章。群里小伙伴很多都在知名大厂&#xff0c;但他们都很低调。点击下方卡片关注我、加个星标&…

魅族魅蓝mirror简单打开usb调试模式的步骤

经常我们使用安卓手机链接电脑的时候&#xff0c;或者使用的有些应用比如我们企业营销团队经常使用的应用引号精灵&#xff0c;以前使用的老版本就需要开启USB调试模式下使用&#xff0c;现经常新版本不需要了&#xff0c;如果手机没有开启USB调试模式&#xff0c;电脑则无办法…

hp-ux 单用户 启动_UX备忘单:搜索与浏览

hp-ux 单用户 启动重点 (Top highlight)When designing search results and interest sites, you have to keep in mind what ‘mode’ your user is in. Are they in ‘searching mode’ or ‘browsing mode’? This will help you determine how to design your platform to…

细数开源历史上的九个重大事件

开放源码&#xff08;开源&#xff09;的精神在于使用者可以使用、复制、散布、研究和改进软件。这可以追溯到20世纪60年代&#xff0c;至今已有半个世纪了。伯乐在线-职场博客的这篇文章将列举开源历史上的九大重要事件。虽然本文不是专门对开源产品&#xff0c;但还是说到了一…

有赞大数据平台安全建设实践

一、概述 在大数据平台建设初期&#xff0c;安全也许并不是被重点关注的一环。大数据平台的定位主要是服务数据开发人员&#xff0c;提高数据开发效率&#xff0c;提供便捷的开发流程&#xff0c;有效支持数仓建设。大数据平台的用户都是公司内部人员。数据本身的安全性已经由公…