分享好友 最新动态首页 最新动态分类 切换频道
laya特效教程:在线特效教程大全
2024-12-26 22:03
摘要:laya特效教程,场课为您整理出关于laya特效教程的相关在线教程知识,欢迎访问了解laya特效教程laya场景切换:的内容。

使用一个简单的游戏开发示例,由浅入深,介绍了如何用Laya引擎开发微信小游戏。

laya特效教程:在线特效教程大全

微信小游戏的推出也快一年时间了,在IEG的游戏运营活动中,也出现了越来越多的以小游戏作为载体运营的活动类型,比如游戏预约,抢先试完等等,都收到了非常良好的效果。

在支持微信小游戏的游戏引擎中,Cocos,Egret,Laya都对小游戏的开发提供了很多强大的支持。前段时间正好抽空研究了一下这块的内容,现做一个总结,针对如何使用Laya引擎开发微信小游戏给大家做一下介绍。因为时间有限,研究并不深入, 如有高手路过,忘不吝赐教。

做个啥游戏呢?“绝地求生”很火,我们做个“绝地求死”如何?策划也很简单,和绝地求生相反,主角不是跳伞的玩家,而是地面的炮手,大炮要把跳伞的伞兵用大炮一个个都消灭掉。

牛逼的策划有了,咱们进入正题,看看怎么实现吧!

1. 如果不用引擎会怎样?

1.1 Canvas了解下

微信小游戏提供了canvas这个游戏核心组件。利用Canvas可以在画布上画出文字、图形、图像等等。 不过讲微信小游戏之前,得先说说H5,在H5时代获取canvas对象非常简单,如下图:

var canvas=document.getElementById("myCanvas");
var ctx=canvas.getContext("2d");

常用的一些API:

ctx.drawImage(img,sx,sy,swidth,sheight,x,y,width,height); //绘制图片
ctx.fillText(text,x,y,maxWidth); //绘制文字
ctx.rect(x,y,width,height); //绘制矩形
ctx.clearRect(x,y,width,height);//清除矩形内像素
ctx.scale(scalewidth,scaleheight);//缩放
ctx.rotate(angle);//旋转角度
。。。。

微信小游戏里,也提供了canvas对象,只不过获取接口变了:

wx.createCanvas()

其他H5环境下有的Canvas API,微信环境里也都有。

1.2 动画的原理

Canvas只是一个2D的画布,要做一个游戏,动画总不能少吧?要让图片能动起来,这又是怎么做到的呢?请看下图:

好吧,动画其实就是不断画图片,然后擦除,再画图片,再擦除的循环过程,肉眼看起来,那就是动起来了。

在古老的电影胶片时代,我们看到的电影,就是一张一张连续帧的胶片组成的,最后投射到大屏幕上,变成了我们看到的电影。

1.3 动画性能优化

但是,动画是讲究帧率的,一般如果能达到每秒60帧,那就和电影一样是很流畅的动画效果了。计算公式:1000ms/60fps=16.67ms,这就要求我们每次动画里的业务逻辑计算,都要16.6ms里完成,不能影响下一帧的显示,否则就是卡顿,也就被人说这个游戏好卡,性能好差了。

知道原理了,性能优化具体怎么做呢?

  • Canvas分层 有些游戏中,背景是不变的,为了提高性能,可以把游戏背景抽离出一个单独的canvas,这样,在画面发生变化的时候,不需要重绘整个背景,只需要绘制变化的那部分就可以。
  • 减少API调用 每次的ctx的api调用,都是有性能消耗的,所以,尽量减少每帧的api调用次数,具体怎么减少,就要看业务需求了。
  • 图片预裁剪 图片的裁剪过程,也是有性能消耗的,我们可以把裁剪的图片预先存起来,之后在绘制的时候,直接从内存里拿,而不需要每次都重新裁剪。
  • 离屏绘制 直接操作上屏的canvas,性能是很差的,尤其是有单帧绘制操作很多的时候,性能下降更明显。 这个时候,我们可以预先创建一个离屏的canvas,预先在这个canvas完成这一帧要绘制的所有动作,最后一次性的把这个离屏canvas绘制到上屏canvas中。
  • 避免阻塞 由于我们需要保证16.67ms就要完成一次帧的绘制,如果这一帧里,逻辑运算时间超过16ms怎么办?那就一定会卡帧了。 我们可以使用webworker之类的技术,把耗时的逻辑计算在另一个线程执行,或者把任务进行拆解,降低每帧的耗时。

当然还有很多其他更多的技巧和手段来提升canvas的性能,在这样的情况下如果我们直接使用canvas去开发一个游戏,还会面临比如碰撞算法、物理系统之类的问题。 所以,如果只用canvas去开发游戏,就如同你在吃鸡游戏里,只拿了一把平底锅,你怎么和别人正面刚?

所以,我们需要一把98K把自己武装起来,那就是使用游戏引擎开发。

2. 为什么选择Laya?

目前支持微信小游戏的引擎,有Cocos,Egret,Laya,我们先看下三者的功能比较:

从各种支持度上来讲,laya是目前支持度最好的,也据laya侧的宣传,他的性能也是最高的。(关于性能的问题,因外部水军比较多,在没有做实际详细测试前,暂时不发表评价。)

在公司内部,都有三种引擎的游戏实现,下面是截止5月份的公开数据的引擎占比:

其实三个引擎都提供了很好的支持度,一般来说,如果原先使用过Cocos实现过APP端游戏要移植到微信小游戏端来的,使用Cocos是最好的选择,如果是从头开发一款小游戏,那还是在Egret和Laya里选择一款吧!

3. Laya 环境搭建

前面讲了那么多,都还只是前戏,只是为了大家对游戏的开发有个初步的了解,从这一节开始我们就进入正题了。

到 https://www.layabox.com/ 去下载最新的版本,并进行安装。目前有1.X版本和2.0版本。(本文使用1.7.20版本做示例)

然后就可以创建一个新的游戏项目了,我们可以现在选择创建一个UI示例项目

[ 创建新工程 ]

3.1 代码模式

当然就是给你写代码的地方,感觉这个编辑器,就是在VSCode的基础上改的。连最顶上的Code标识都还在。也因为这样,所以才能很好的支持TypeScript。

[ 代码模式布局 ]

为什么要使用TypeScript? 本文不详细展开比较,只需要了解TypeScript 是Javascript的超集,因为多了个“Type”表示他支持强类型,并且由于静态类型化,在写代码的时候编辑器就能提示你的错误,所以更适合开发游戏这种逻辑复杂的应用就好了。当然最终TypeScript还是会像ES6一样,被编译成普通的Javascript执行。但是在开发阶段管理代码来说,已经可以驾驭大型项目了。

3.2 设计模式

就是用来设计UI界面的地方,拖拖拽拽就可以把游戏页面整出来。Laya提供了好多组件,如果有需要的可以使用,当然也可以不用他的组件,自己搞自己的自定义组件。

[ 设计模式布局 ]

4. Laya的HelloWorld

都说作为一个程序员,买来文房四宝之后,写下的第一行字,一定是“Hello World”。(我拿着公司刚发的 20周年LAMY纪念钢笔,写的第一行字,居然也是“Hello World”,汗~~~)

4.1 游戏初始化

4.1.1.GameMain.ts

首先删掉系统刚才默认的文件“LayaUISample.ts”,然后新建文件GameMain.ts

import WebGL = Laya.WebGL;
class GameMain { 
 constructor() {
 //TS或JS版本初始化微信小游戏的适配
 Laya.MiniAdpter.init(true,false); 
 //初始化布局大小
 Laya.init(375,667, WebGL);
 
 //布局方式设定
 Laya.stage.scaleMode = Laya.Stage.SCALE_SHOWALL;
 Laya.stage.screenMode = Laya.Stage.SCREEN_VERTICAL;
 Laya.stage.alignV = Laya.Stage.ALIGN_CENTER;
 Laya.stage.alignH = Laya.Stage.ALIGN_CENTER;
 }
}
new GameMain();

Laya.MiniAdpter.init()是Laya提供的对小游戏提供的适配,因为在小程序&小游戏环境下,并没有Bom和DomAPI,比如,没有window,document, 所以需要这样一个适配器,对小游戏的开发方式,进行兼容。

4.1.2. bin/index.html

修改bin目录下的index.html ,删掉LayaUISample.ts的引用,改为下面的方式:

<!--启动类添加到这里-->
<!--jsfile--Main-->
<script src="https://edu.xinpianchang.com/article/js/GameMain.js"></script>
<!--jsfile--Main-->

在index.html里,提供了很多Laya的类库,这些类库,最终会被打包成合并一个code.js. 因为微信小游戏的体积限制,我们不需要把所有的库都加载进来,只选择我们需要的库就好了,用不到的可以都删除。

4.1.3. run

接下来,点击运行,就会出现模拟器界面了。

[ 运行模拟器 ]

先别管黑乎乎的一团,下面我们就要增加“Hello World”了。

4.2 绘制文字

4.2.1. Laya.Text

再次修改GameMain的代码如下,重点是var txt:Laya.Text = new Laya.Text();

import WebGL = Laya.WebGL;
class GameMain {
 constructor() { 
 //TS或JS版本初始化微信小游戏的适配
 Laya.MiniAdpter.init(true,false); 
 
 
 //初始化布局大小
 Laya.init(375,667, WebGL); 
 //布局方式设定
 Laya.stage.scaleMode = Laya.Stage.SCALE_SHOWALL;
 Laya.stage.screenMode = Laya.Stage.SCREEN_VERTICAL;
 Laya.stage.alignV = Laya.Stage.ALIGN_CENTER;
 Laya.stage.alignH = Laya.Stage.ALIGN_CENTER;
 //创建Text对象
 var txt:Laya.Text = new Laya.Text(); 
 
 //给Text的属性赋值
 txt.text = "Hello World";//设定文字内容
 txt.color = "#ffffff"; //设定颜色
 txt.fontSize=20; //设定字体大小
 txt.pos(100,200); //设定位置
 //将Text对象添加到舞台
 Laya.stage.addChild(txt);
 }
}
new GameMain();

在上面的代码中,我们给Stage舞台上,添加了Text对象,然后点击运行

啊哦,传说中的HelloWorld终于出现了

4.3 绘制图片

4.3.1 loadImage

Laya的Sprite提供了一个非常简单的loadImage方法,可以即时加载图片并加载到舞台上。

//设置舞台背景色
 Laya.stage.bgColor="#1e83e8";
//创建img Sprite精灵
var img:Laya.Sprite = new Laya.Sprite();
//加载显示图片,坐标位于100,50,并设置宽高 130*108
img.loadImage("demo/paratrooper.jpg",100,50,130,108);
//把图片添加到舞台
Laya.stage.addChild(img);

预览如下,是不是很简单?

但是这个方法,其实并不实用,在真实项目中,一般会有很多图片,我们不会一张一张图片的去加载,而是预先加载好,再去显示图片。也就是我们常常在游戏主界面看到的进度条,其实就是在加载资源。

4.3.2 资源预加载

Laya提供一个资源加载器:Laya.loader ,来解决加载的问题。我们把上面的代码再修改下,实现先加载完图片,然后再绘制图片。

private imgPath3:string="demo/paratrooper.jpg";
private imgPath3:string="demo/shell.jpg";
constructor() {
 //.....省略N行代码
 this.renderImage();
 //....省略N行代码
}
renderImage():void{ 
 //定义图片路径集合
 var resArray=[
 {url:this.imgPath3,type:Laya.Loader.IMAGE},
 {url:this.imgPath3,type:Laya.Loader.IMAGE}
 ]
//使用加载器加载图片路径
Laya.loader.load(resArray,Laya.Handler.create(this,this.onLoadComplete),Laya.Handler.create(this,this.onLoadProgress))
}
//加载完成后,把图片绘制到画布上
onLoadComplete():void{
 console.log("加载完成"); 
 var img1:Laya.Sprite = new Laya.Sprite();
 img1.graphics.drawTexture(Laya.loader.getRes(this.imgPath3),100,50,100,100);
 Laya.stage.addChild(img1);
 var img2:Laya.Sprite = new Laya.Sprite();
 img2.graphics.drawTexture(Laya.loader.getRes(this.imgPath3),100,300,100,100);
 Laya.stage.addChild(img2);
 }
//这里可以获取到加载的进度,以后可以制作进度条
onLoadProgress(percent:number):void{
 console.log("percent->"+percent);
}

4.3.3 图集

只是预加载图片还不够,实际场景由于有很多小图片,所以我们可以把这些小图片拼合成图集,这就类似在前端在做性能优化的有时候所使用的css sprite精灵图,这样制作成图集,不但加载性能更高,而且也更便于制作帧动画。

图集的加载类似这样:

var resArray=[
 {url:"res/atlas/demo.atlas",type:Laya.Loader.ATLAS},
 ]
 Laya.loader.load(resArray,Laya.Handler.create(this,this.onLoadComplete),Laya.Handler.create(this,this.onLoadProgress))

和之前的图片加载时Laya.Loader.IMAGE不同的是,type变成了Laya.Loader.ATLAS。

那图集怎么制作呢?还有,大量的游戏界面,真的就靠手动一张图片一张图片的显示吗? 当然不!因为我们接下来该了解下UI编辑器了。

5. UI编辑器

UI编辑器,当然是用来编辑UI的,大多数的客户端程序开发环境,都有类似的UI编辑器。点击左侧的

图标,进入UI编辑器模式,如下图:

具体UI编辑器的功能介绍,建议还是看官方文档,这里就不赘述了。

5.1创建UI

因为我们创建的是默认UI项目,所以UI编辑器里,有一个TestPage.ui,可以不用管他,我们创建一个自己的UI。 点击 文件->新建文件

进入新建页面窗口,页面类型有View 和Dialog两种,因为这里我们做的是整个页面,所以选View。如果你有兴趣去看源码,其实Dialog也是基于View实现的,只不过多了Dialog的一些特性。

如果对这个view后面还有逻辑代码要写,建议勾选“创建逻辑类”,这样就会自动在View目录下自动创建一个和UI对应的GamePage.ts

[ 新建页面UI ]

5.2 导入资源

在assets目录下,新建一个demo资源目录,把需要的图片都扔进去,然后在UI编辑器的资源面板最下方找找到刷新按钮

,新增资源图片后,一定要记得点下刷新,否则资源面板的内容不会自动刷新。

只要是demo文件下的图片,都会被自动打包成图集,路径就是 res/atlas/demo.atlas。 不知道有没有同学发现,在上面的图片中,有部分资源显示“不打包”,这是什么原因的?

点击文件-》项目设置,我们会看到图集限制了能被打入图集的单图的最大宽高,和最终图集的最大宽高,默认标准可以自行修改。超过这个图集标准的图片,就不会打包到图集中去,就需要手动加载了。

[ 请在这里填写图片描述 ]

5.3 编辑UI

编辑页面功能,会用ppt的,应该都会用了,拖个图片谁不会?直接把资源管理器的图片,拖到右侧场景编辑器里。这次我们拖了一个蓝天白云的背景,并在最下方放了一个大炮,看起来还有点意思。

顶部有一排图标,是用来协助对齐图片用的,提供了顶部对齐,底部对齐,左对齐,右对齐,中线对齐等等,如果图片很多,用这个对齐就很方便了。

右侧的属性栏,就比较常用了。 var这里,你可以给你拖进来的图片组件,给个变量名,这个变量名,最后会在之前自动生成的逻辑类里用到。我们把大炮定个变量名“pao”,后面会用到;x,y,width,height这里,就是坐标和宽高,就不用多说了吧?

5.4 导出UI

UI做好以后,有个重要的工作,就是千万别忘记导出。很多初学者,经常会忘记这点。导出UI,才会重新生成图集和UI相关设置。

导出以后,我们看laya/pages/GamePage.ui 文件,不用管里面的详细内容,里面就是刚才我们拖拽图片,自动生成的响应配置文件。

5.5 使用UI

下面我们要把刚才编辑的GamePage显示出来,那就回过头来,再次修改GameMain.ts

class GameMain {
 //定义静态变量 gamePageView
 public static gamePageView:view.GamePage;
 
 constructor() {
 //...
 this.renderImage();
 //...
 }
 renderImage():void{ 
 //资源加载
 var resArray=[
 {url:"res/atlas/demo.atlas",type:Laya.Loader.ATLAS},
 ]
 Laya.loader.load(resArray,Laya.Handler.create(this,this.onLoadComplete),Laya.Handler.create(this,this.onLoadProgress))
 }
 onLoadComplete():void{
 //初始化view 
 GameMain.gamePageView = new view.GamePage(); 
 //添加到舞台
 Laya.stage.addChild(GameMain.gamePageView);
 }
}
new GameMain();

运行一下,主界面游戏背景,和大炮都已经架设好了,好的开端,就是成功的一半了。

接下来,根据最初的牛逼策划,我们要像pubgm一样,让伞兵从天下掉下来,怎么实现?接着看动画部分吧!

与laya特效教程相关的热搜关键词

laya 教程

投稿人:贺慧

来源:小条-使用Laya引擎开发微信小游戏(上)

本站文字和内容均为作者原创、翻译、转载,新片场课堂不会对原创文章作任何编辑。转载前请务必通知本站并注明内容来源(新片场课堂)附以原文链接( https://edu.xinpianchang.com/article/texiao-592977 )。 本站内容欢迎分享,但拒绝有商业目的的转载!
最新文章
華為巴黎旗艦店舉辦GoPaint全球創作活動
/美通社/ -- 華為在其巴黎旗艦店(巴黎歌劇院旁)成功舉辦了GoPaint全球創作活動。本次活動由兩位才華橫溢的插畫師Mayada和Kenza主導,旨在通過可在華為MatePad系列設備上使用的GoPaint應用展現數字藝術的潛力以及實現創作的便捷性。該活動
科技通报“小拉抢单器新款怎么用教程”其实确实有挂
小拉抢单器新款怎么用教程是一款可以让一直输的玩家,快速成为一个“必胜”的ai辅助神器,有需要的用户可以加我微下载使用。抢单可以一键让你轻松成为“必赢”。其操作方式十分简单,打开这个应用便可以自定义抢单系统规律,只需要输入自己
盘点即将上市的新款手机 你更喜欢哪一款?
点击上方电脑爱好者关注我们转眼2019年已经过半,手机圈的竞争也即将进入下半场,5G、折叠屏、UFS3.0、屏幕摄像头、全身无开孔设计等元素都会一一在新品中呈现。作为消费者,咱们暂时无需将目光投的太远,如果聚焦当下,将于近期上市的新款
高效SEO排名神器,助您网站流量翻倍,率飙升
推荐一款SEO快速排名软件,助您高效优化网站,快速提升流量与,让您的网站在搜索引擎中脱颖而出。随着互联网的快速发展,越来越多的企业开始重视网络营销,而SEO(搜索引擎优化)作为网络营销的重要组成部分,已经成为了企业提高网站流量、
深圳一医生被曝拒诊,耽误患者!官方回应 | 医脉3分钟
今天的医疗圈发生了哪些与你有关的大事?更新、更全的医学动态3分钟一网打尽今日关键词:韩语学生,轻断食,职业病类别,创新医疗器械来源 | 医脉通作者 |晚报君新闻60秒➤76岁老人被接到医院“免费”做手术,家属投诉并质疑医院@第一帮帮
潮州企业网站排名优化,提升品牌影响力的关键策略,潮州 企业
潮州企业网站排名优化是提升品牌影响力的重要策略。通过优化网站内容、提升用户体验、加强社交媒体营销、建立优质外链等方式,可以提高网站在搜索引擎中的排名,从而吸引更多潜在客户。定期更新网站内容、优化关键词、提高网站速度等也是关
漫画台苹果版免费
在众多的漫画阅读平台中,“漫画台”作为其中一个优秀的漫画阅读渠道,深受大家的喜欢和青睐。为了给更多的用户提供便捷、流畅的手机阅读体验,“漫画台”推出了全新的苹果版(iphone)应用,用户可以轻松在苹果商店中免费下载。下面就让我
用AI挑战5分钟一篇PPT!Kimi的这个功能绝了!打工人福音,效率提升80%!(附教程)
大家好,我是程序员X小鹿,前互联网大厂程序员,自由职业2年+,也一名 AIGC 爱好者,持续分享更多前沿的「AI 工具」和「AI副业玩法」,欢迎一起交流~俗话说,在职场,不管干得怎么样&
词典分词算法详解:从基础到高效实现
2. 词典分词 2.1 什么是词2.2 词典2.3 切分算法2.4 字典树2.5 基于字典树的其它算法2.6 HanLP的词典分词实现中文分词:指的是将一段文本拆分为一系列单词的过程,这些单词顺序拼接后等于原文本。中文分词算法大致分为基于词典
从销售到 AI 算法工程师 | 转行人工智能大模型(含面经&裁员幸存指南)
我叫王东,90后,和大家分享一下我的人工智能转型之路。 农学毕业,投身互联网做销售 机遇难求,养殖梦碎 我是土生土长的农村人,小时候经常和小鱼小虾打交道,上大学的时候就选择了农学专业,
相关文章
推荐文章
发表评论
0评