关于pixi.js:使用pixijs制作简单的跑酷小游戏

前言此我的项目应用pixi.js和vue实现,局部素材来自爱给网,本我的项目仅作用于 pixi.js 学习用处,侵权立删。 我的项目地址shellingfordly/pixi-games demo地址pixi-games 初始化我的项目应用vite初始化我的项目 pnpm create vite my-vue-app装置pixi.js和pixi-tweener pixi-tweener一个做适度动画的开源库 pnpm i pixi.js pixi-tweener次要逻辑useParkour此函数用于创立pixi app,将场景,障碍物,人物增加到app中containerRef canvas的容器gameStart 开始游戏start 开始状态score 分数hp 血量export function useParkour() { const containerRef = ref(); const app = new Application({ width: BODY_HEIGHT, height: BODY_WIDTH, backgroundColor: 0xffffff, }); const start = ref(false); Tweener.init(app.ticker); const container = new Container(); app.stage.addChild(container); const player = new Player(); const { scene, runScene, stopScene } = useScene(); const { trap, runHurdle, score, hp } = useHurdle(); container.addChild(player); container.addChild(scene); container.addChild(trap); container.sortChildren(); runScene(); function gameStart() { start.value = true; player.play(); const timer = setTimeout(() => { runHurdle(player); clearTimeout(timer); }, 1000); } watch(hp, (value) => { if (value === 0) { player.stop(); stopScene(); start.value = false; } }); onMounted(() => { if (containerRef.value) containerRef.value.appendChild(app.view); }); return { containerRef, app, score, hp, gameStart, start };}useScene此函数用于创立天空、高空场景加载天空、高空纹理,创立平铺精灵(TilingSprite),这个TilingSprite类比拟不便做场景的挪动 ...

July 18, 2022 · 4 min · jiezi

关于pixi.js:PIXIJS问题集锦

轻量2D渲染库Documentshttp://pixijs.download/releas... 遇到的坑如何获取绘制出的形态面积const spaces = this.graph.spacesconst extract = this.renderer.plugins.extractconst graphics // 依据形态绘制办法,设置fillStyle重绘graphics.beginFill(fillColor, fillAlpha)const dimension = extract.pixels(graphics)/4// 4: rgba 4个通道

October 11, 2021 · 1 min · jiezi

关于pixi.js:基于Tiled工具的可视化编辑构建方案

https://www.npmjs.com/package...

August 2, 2021 · 1 min · jiezi

pixi用法即将上映

PIXI.js用法Pixi.js用的人多吗?我看网上关于Pixi的用法啊问题啊讲解啊都挺少的,初用Pixi的时候我搜索问题也很费劲。比如: 为什么修改了显示对象的x,y为什么transform没更新?为什么特殊字体在canvas初次显示的时候没有被应用?spine动画播放完的回调函数是什么?回调函数里面向舞台添加元素为什么会在0,0点闪一下?这些问题在网上都很难搜感觉,可能是我的搜索方式不正确。可能我向来都不擅长用网络搜索这个功能。下个office都下不到的那种人。不知道是真的少,还是没搜好,所以我想看一下pixi的搜索量究竟是多大?如果该篇博客日阅过百,我就开始我的博客第一站,pixi基础学习,共同进步。列几个关键字吧,方便搜索。 ApplicationBaseRenderTextureBaseTextureBlendModeManagerBoundsBufferCanvasMaskManagerCanvasRendererCanvasRenderTargetCanvasTinterCircleContainerCountLimiterDisplayObjectEllipseFilterFilterManagerGraphicsGraphicsDataGraphicsRendererGroupD8MaskManagerMatrixMeshRendererObjectRendererObservablePointParticleShaderPointPolygonPrimitiveShaderQuadRectangleRenderTargetRenderTextureRoundedRectangleShaderSpriteSpriteMaskFilterSpritesheetStencilManagerSystemRendererTextTextMetricsTextStyleTextureTextureGarbageCollectorTextureManagerTextureMatrixTimeLimiterTransformTransformBaseTransformStaticVideoBaseTextureWebGLManagerWebGLRendererWebGLStatokk,今天就这样了。

April 23, 2019 · 1 min · jiezi

关于pixi拖拽事件与传参等常见问题

pixi常用事件类型首先汇总下pixi中的所有事件:pointer事件(鼠标和touch)mouse事件(鼠标)tap事件(touch)pixi拖拽demo最近写了个pixi简单的拖拽demo:<!– * @Descripttion: * @Author: * @Date: 2019-04-04 11:47:42 –><template> <div></div></template><script>export default { name: “testline”, data() { return {} }, mounted() { let PIXI = this.PIXI; const _this = this; // 创建应用 let app = new PIXI.Application(); app.renderer.view.style.position = “absolute”; app.renderer.view.style.display = “block”; app.renderer.autoResize = true; app.renderer.resize(window.innerWidth, window.innerHeight); document.body.appendChild(app.view) // 加载图片 let textureUrl = “/testTexture/textures.json”, heartId = “heart.png”; PIXI.loader .add(textureUrl) .load(setup); function setup() { // 相当于把这个加载拆分出一个方法 // new PIXI.Sprite(PIXI.loader.resources[textureUrl].textures[backgroundId]) let id = PIXI.loader.resources[textureUrl].textures let heart = new PIXI.Sprite(id[heartId]) heart.anchor.set(0.5); heart.position.set( window.innerWidth / 2, window.innerHeight / 2 ); // 加入舞台中 app.stage.addChild(heart); // 开启交互 heart.interactive = true; heart.buttonMode = true; console.log(this) // 拖拽事件 heart .on(‘pointerdown’, _this.onDragStart) .on(‘pointerup’, _this.onDragEnd) .on(‘pointerupoutside’, _this.onDragEnd) .on(‘pointermove’, _this.onDragMove) } }, created() {}, methods: { onDragStart(event) { let currentTarget = event.currentTarget; currentTarget.data = event.data currentTarget.alpha = 0.5; currentTarget.dragging = true; }, onDragEnd(event) { let currentTarget = event.currentTarget; currentTarget.alpha = 1; currentTarget.dragging = false; }, onDragMove(event) { let currentTarget = event.currentTarget; if (currentTarget.dragging) { var newPosition = currentTarget.data.getLocalPosition(currentTarget.parent); //获取鼠标移动的位置 currentTarget.position.x = newPosition.x; currentTarget.position.y = newPosition.y; } } }}</script><style></style>pixi事件中注意点:1. 关于事件调用与传参问题:// 没有参数.on(“pointerdown”, _this.onDragStart) // 正确.on(“pointerdown”, _this.onDragStart()) //错误:会 直接执行函数// 需要传参.on(“pointerup”, _this.buttonSubmit.bind(_this, { params: “aaa” }));.on(“pointerup”, (event) => { _this.buttonSubmit(“aaa”,event)});// 需要传递回调函数.on(“pointerup”,_this.buttonSubmit.bind(_this, { params: “aaa”, callback: target => { doSomethis(target); // 接受当前事件绑定对象,方便doSomethis中使用 } }) );// 在事件中可以通过下面方式拿到databuttonSubmit(data, event) { if (data.callback) data.callback(event.currentTarget)}2. 区别vue的this和pixi的this如果把绑定的事件写到mounted中,那么这个事件中的this就是pixi的对象(sprite),但是把事件写到methods中,这个时候的this就是vue本身,一定要区别开。3. 通过event.currentTarget得到pixi对象在methods中的事件中直接拿this,打印出的是VueComponent,而不是我们想要的pixi对象,这个时候,你设置this的透明度、大小之类的肯定都会报错。解决办法是我们可以通过event.currentTarget拿到事件的绑定对象,打印currentTarget会发现他就是我们需要的pixi对象Sprite,通过它来实现事件触发后的一些效果就可以了。要留意的是,直接在控制台打印event,会看见它的currentTarget是null,但是打印event。currentTarget是有东西的,查了资料发现原来是因为:currentTarget 在你控制台展开查看的时候,已经不存在了。你要是想拿到它,需要将它赋值给一个值,然后再进行操作。可以参考:https://stackoverflow.com/que…可交互对象属性设置交互之前,一定要把设置对象的interactive和buttonMode属性为true。 ...

April 4, 2019 · 1 min · jiezi

学习 PixiJS — 动画精灵

说明看完官方教程中提到的这本书 — Learn Pixi.js ,准备写写读后感了,官方教程中所说的内容,基本上就是书的前4章,所以我就从第5章开始写写吧。动画精灵指的是按顺序使用一系列略有不同的图像,创建的精灵,之后一帧一帧的播放这些图像,就可以产生运动的幻觉。也就是说用这种图片做出这样的效果 要制作动画精灵我们需要用到 PixiJS 的 AnimatedSprite 方法。PIXI.extras.AnimatedSprite定义:使用纹理数组创建动画精灵的方法。用法:new PIXI.extras.AnimatedSprite(textures,autoUpdate)参数 :名称类型默认值描述texturesarray 用一系列略有不同的图像做的纹理数组。autoUpdatebooleantrue用来判断是否使用 PIXI.ticker.shared 自动更新动画时间。返回值: 返回一个对象,对象会有一些属性和方法,用于控制动画精灵。返回值对象的属性:名称类型描述animationSpeednumber动画精灵的播放速度。越高越快,越低越慢,默认值是1currentFramenumber(只读)正在显示的当前帧编号onCompletefunction当loop属性为false时,一个动画精灵完成播放时调用playingBoolean确定当前动画精灵是否正在播放onFrameChangefunction当一个动画精灵更改要呈现的纹理时调用loopboolean动画精灵是否在播放后重复播放onLoopfunction当loop属性为true时调用的函数texturesarray用于这个动画精灵的纹理数组totalFramesnumber (只读)动画中的帧总数返回值对象的方法:名称参数描述play 播放动画精灵gotoAndPlayframeNumber,number类型,开始帧的索引转到特定的帧并开始播放动画精灵stop 停止播放动画精灵gotoAndStopframeNumber,number类型,停止帧的索引转到特定的帧并停止播放动画精灵使用返回值中的这些属性和方法,我们就可以控制动画精灵了,比如播放动画精灵,设置动画的速度,设置是否循环播放等,除此之外,还要知道就是 PIXI.extras.AnimatedSprite 方法继承自 PIXI.Sprite 方法,所以动画精灵也可以用普通精灵的属性和方法,比如x,y,width,height,scale,rotation 。好的,我们开始试试这个方法。<!doctype html><html lang=“zn”><head> <meta charset=“UTF-8”> <title>动画精灵</title></head><body> <div id=“px-render”></div> <script src=“https://cdnjs.cloudflare.com/ajax/libs/pixi.js/4.8.2/pixi.min.js"></script> <script> // 创建一个 Pixi应用 需要的一些参数 let option = { width: 400, height: 300, transparent: true, } // 创建一个 Pixi应用 let app = new PIXI.Application(option); // 获取渲染器 let renderer = app.renderer; let playground = document.getElementById(‘px-render’); // 把 Pixi 创建的 canvas 添加到页面上 playground.appendChild(renderer.view); //设置别名 let TextureCache = PIXI.utils.TextureCache; let Texture = PIXI.Texture; let Rectangle = PIXI.Rectangle; let AnimatedSprite = PIXI.extras.AnimatedSprite; //需要加载的雪碧图的地址(该图片服务器端已做跨域处理) let imgURL = “https://www.kkkk1000.com/images/learnPixiJS-AnimatedSprite/dnf.png"; //加载图像,加载完成后执行setup函数 PIXI.loader.add(imgURL).load(setup); function setup() { //获取纹理 let base = TextureCache[imgURL]; //第一个纹理 let texture0 = new Texture(base); texture0.frame = new Rectangle(0, 0, 80, 143); //第二个纹理 let texture1 = new Texture(base); texture1.frame = new Rectangle(80, 0, 80, 143); //第三个纹理 let texture2 = new Texture(base); texture2.frame = new Rectangle(160, 0, 80, 143); //第四个纹理 let texture3 = new Texture(base); texture3.frame = new Rectangle(240, 0, 80, 143); //创建纹理数组 let textures = [texture0, texture1, texture2,texture3]; //创建动画精灵 let pixie = new PIXI.extras.AnimatedSprite(textures); //设置动画精灵的速度 pixie.animationSpeed=0.1; //把动画精灵添加到舞台 app.stage.addChild(pixie); //播放动画精灵 pixie.play(); } </script></body></html>查看效果 上面这个例子中,创建纹理数组时似乎点麻烦,要解决这个问题,我们可以用名叫 SpriteUtilities 的库,该库包含许多有用的函数,用于创建Pixi精灵并使它们更易于使用。安装:直接用 script 标签,引入js 文件就可以<script src=“https://www.kkkk1000.com/js/spriteUtilities.js"></script>安装好之后,我们需要创建一个新实例,代码如下let su = new SpriteUtilities(PIXI);之后就可以用 su 对象访问所有方法了。我们这里需要用到的就是 su 对象的 filmstrip 方法。定义:filmstrip 方法可以自动将雪碧图转换为可用于制作精灵的纹理数组用法:su.filmstrip(“anyTilesetImage.png”, frameWidth, frameHeight, optionalPadding);参数:名称类型描述anyTilesetImagestring雪碧图的路径frameWidthnumber每帧的宽度(以像素为单位)frameHeightnumber每帧的高度(以像素为单位)optionalPaddingnumber每帧周围的填充量(可选值,以像素为单位)返回值: 返回一个数组,可用于制作动画精灵的纹理数组。现在我们使用 SpriteUtilities 来改写下刚才的示例代码。<!doctype html><html lang=“zn”><head> <meta charset=“UTF-8”> <title>动画精灵</title></head><body> <div id=“px-render”></div> <script src=“https://cdnjs.cloudflare.com/ajax/libs/pixi.js/4.8.2/pixi.min.js"></script> <script src=“https://www.kkkk1000.com/js/spriteUtilities.js"></script> <script> //创建一个 Pixi应用 需要的一些参数 var option = { width: 400, height: 300, transparent: true, } //创建一个 Pixi应用 var app = new PIXI.Application(option); //获取渲染器 var renderer = app.renderer; var playground = document.getElementById(‘px-render’); //把 Pixi 创建的 canvas 添加到页面上 playground.appendChild(renderer.view); let su = new SpriteUtilities(PIXI); //需要加载的雪碧图的地址(该图片服务器端已做跨域处理) let imgURL = “https://www.kkkk1000.com/images/learnPixiJS-AnimatedSprite/dnf.png"; PIXI.loader.add(imgURL).load(setup); function setup() { //创建纹理数组 let frames = su.filmstrip(imgURL, 80, 143); //创建动画精灵 let pixie = new PIXI.extras.AnimatedSprite(frames); //设置动画精灵的速度 pixie.animationSpeed=0.1; //把动画精灵添加到舞台 app.stage.addChild(pixie); //播放动画精灵 pixie.play(); } </script></body></html>查看效果 filmstrip 方法自动将整个雪碧图转换为可用于制作动画精灵的纹理数组。但是,如果我们只想使用雪碧图中的一部分帧呢?这时候需要用到 frames 方法了。定义:frames 方法使用雪碧图中的一组子帧,来创建纹理数组。用法:su.frames(source, coordinates, frameWidth, frameHeight)参数:名称类型描述sourcestring雪碧图的路径coordinatesarray包含每帧的 x 和 y 坐标的二维数组frameWidthnumber每帧的宽度(以像素为单位)frameHeightnumber每帧和高度(以像素为单位)返回值: 返回一个数组,可用于制作动画精灵的纹理数组。示例代码:<!doctype html><html lang=“zn”><head> <meta charset=“UTF-8”> <title>动画精灵</title></head><body> <div id=“px-render”></div> <script src=“https://cdnjs.cloudflare.com/ajax/libs/pixi.js/4.8.2/pixi.min.js"></script> <script src=“https://www.kkkk1000.com/js/spriteUtilities.js"></script> <script> //创建一个 Pixi应用 需要的一些参数 var option = { width: 400, height: 300, transparent: true, } //创建一个 Pixi应用 var app = new PIXI.Application(option); //获取渲染器 var renderer = app.renderer; var playground = document.getElementById(‘px-render’); //把 Pixi 创建的 canvas 添加到页面上 playground.appendChild(renderer.view); let su = new SpriteUtilities(PIXI); //需要加载的雪碧图的地址(该图片服务器端已做跨域处理) let imgURL = “https://www.kkkk1000.com/images/learnPixiJS-AnimatedSprite/dnf.png"; PIXI.loader.add(imgURL).load(setup); function setup() { //创建纹理数组 let frames = su.frames(imgURL, [[0,0],[80,0],[160,0],[240,0]],80, 143); //创建动画精灵 let pixie = new PIXI.extras.AnimatedSprite(frames); //设置动画精灵的速度 pixie.animationSpeed=0.1; //把动画精灵添加到舞台 app.stage.addChild(pixie); //播放动画精灵 pixie.play(); } </script></body></html>查看效果除了上面提到的方式,还可以用纹理贴图集来创建动画精灵。使用纹理贴图集来创建动画精灵,就是先通过json文件,加载所有纹理,然后把需要的纹理再放进一个数组中,最后把这个数组当参数,传入PIXI.extras.AnimatedSprite 方法中,来创建动画精灵。 代码:<!doctype html><html lang=“zn”><head> <meta charset=“UTF-8”> <title>动画精灵</title></head><body> <div id=“px-render”></div> <script src=“https://cdnjs.cloudflare.com/ajax/libs/pixi.js/4.8.2/pixi.min.js"></script> <script> //创建一个 Pixi应用 需要的一些参数 var option = { width: 400, height: 300, transparent: true, } //创建一个 Pixi应用 var app = new PIXI.Application(option); //获取渲染器 var renderer = app.renderer; var playground = document.getElementById(‘px-render’); //把 Pixi 创建的 canvas 添加到页面上 playground.appendChild(renderer.view); //需要加载的纹理贴图集的地址 let textureURL = “https://www.kkkk1000.com/images/learnPixiJS-AnimatedSprite/dnf.json"; //加载纹理贴图集,加载完成后执行setup函数 PIXI.loader.add(textureURL).load(setup); function setup() { let id = PIXI.loader.resources[textureURL].textures; //创建纹理数组 let frames = [ id[“dnf0.png”], id[“dnf1.png”], id[“dnf2.png”], id[“dnf3.png”] ]; //创建动画精灵 let pixie = new PIXI.extras.AnimatedSprite(frames); //设置动画精灵的速度 pixie.animationSpeed=0.1; //把动画精灵添加到舞台 app.stage.addChild(pixie); //播放动画精灵 pixie.play(); } </script></body></html>查看效果上面的代码创建纹理数组时,是把纹理一个一个的放进数组中,如果数量比较少还好,多一点呢?假如有100个呢?一个一个的放就太麻烦了,这时候我们可以用 SpriteUtilities 库中提供的 frameSeries 方法。定义:frameSeries 方法可以通过已加载的纹理贴图集,使用一系列编号的帧ID来创建动画精灵。用法:su.frameSeries(startNumber, endNumber, baseName, extension)参数:名称类型描述startNumbernumber起始帧序列号(默认值是0)endNumbernumber结束帧序列号(默认值是1)baseNamestring可选的基本文件名extensionstring可选的文件扩展名返回值: 返回一个数组,可用于制作动画精灵的纹理数组。注意: 使用 frameSeries 方法时,要确保在 json 文件中,定义的每帧的名称都是按顺序来的,比如 frame0.png frame1.png frame2.png 这种。因为 frameSeries 方法的源码是这样写的 frameSeries(startNumber = 0, endNumber = 1, baseName = “”, extension = “”) { //创建一个数组来存储帧名 let frames = []; for (let i = startNumber; i < endNumber + 1; i++) { let frame = this.TextureCache[${baseName + i + extension}]; frames.push(frame); } return frames; }源码中其实是用 for 循环把帧名拼接起来的。所以要保证帧名是按顺序来的,不然就获取不到了。下来我们就试试 frameSeries 方法吧。<!doctype html><html lang=“zn”><head> <meta charset=“UTF-8”> <title>动画精灵</title></head><body> <div id=“px-render”></div> <script src=“https://cdnjs.cloudflare.com/ajax/libs/pixi.js/4.8.2/pixi.min.js"></script> <script src=“https://www.kkkk1000.com/js/spriteUtilities.js"></script> <script> //创建一个 Pixi应用 需要的一些参数 var option = { width: 400, height: 300, transparent: true, } //创建一个 Pixi应用 var app = new PIXI.Application(option); //获取渲染器 var renderer = app.renderer; var playground = document.getElementById(‘px-render’); //把 Pixi 创建的 canvas 添加到页面上 playground.appendChild(renderer.view); let su = new SpriteUtilities(PIXI); //需要加载的纹理贴图集的地址 let textureURL = “https://www.kkkk1000.com/images/learnPixiJS-AnimatedSprite/dnf.json"; PIXI.loader.add(textureURL).load(setup); function setup() { //创建纹理数组 let frames = su.frameSeries(0,7,“dnf”,".png”); //创建动画精灵 let pixie = new PIXI.extras.AnimatedSprite(frames); //设置动画精灵的速度 pixie.animationSpeed=0.1; //把动画精灵添加到舞台 app.stage.addChild(pixie); //播放动画精灵 pixie.play(); } </script></body></html>查看效果注意版本问题: 1、PIXI.extras.AnimatedSprite 这个方法原来叫PIXI.extras.MovieClip ,是在 4.2.1 版本的时候修改的,本文示例代码中用 PixiJS 的版本是 4.8.2,所以没有问题,如果你在使用过程中发现调用PIXI.extras.AnimatedSprite 这个方法有问题,可以先检查下版本是否正确。2、 SpriteUtilities 目前支持的 PixiJS 的版本是 3.0.11,而 SpriteUtilities 中用的就是PIXI.extras.MovieClip 方法,所以你如果用了比较高的 PixiJS 的版本,需要在SpriteUtilities 中修改下方法的别名。在 spriteUtilities.js 文件中需要把 renderingEngine.extras.MovieClip 改成renderingEngine.extras.AnimatedSprite,把 renderingEngine.ParticleContainer 改成 PIXI.particles.ParticleContainer 。这个 spriteUtilities.js 就是修改后的。当然你也可以使用低版本的 PixiJS,这样就不用改 spriteUtilities.js 的代码了。总结动画精灵就是逐帧动画,通过一帧一帧的播放图像来产生运动的幻觉。本文就是聊了聊创建动画精灵的一些方式和如何使用动画精灵。如果文中有错误的地方,还请小伙伴们指出,万分感谢。 ...

January 14, 2019 · 4 min · jiezi

从零到一:实现通用一镜到底H5

写在前面整个2018年都被工作支配,文章自17年就断更了,每次看到有消息提示过往的文章被收藏,或者有人点赞,都不胜唏嘘。不过,凡事要始终保持积极的心态,现在回归为时未晚。最近有项目要做一镜到底,那就稍作研究吧。一镜到底是什么?百度百科-一镜到底一镜到底,是指拍摄中没有cut情况,运用一定技巧将作品一次性拍摄完成。那么运用到H5上面,是怎样的表现?网上案例也有很多,这里推荐数英的一篇文章,应用尽有:一镜到底H5大合集:一口气看尽一个H5的套路主要表现形式为以下几类:画中画(例如:网易-《娱乐画传》)时空穿梭(例如:天猫-《穿越时空的邀请函》)滚动动画(例如:网易-《爱的形状》)视频(这个好像没什么好说的…跟本文无关)体验方式主要有:按住滑动技术需求分析如上图的《爱的形状》,用户滑动屏幕,方块滚动,并且用户能控制播放进度;期间方块上面的纹理一直在变化,意味着动画一直在播放。提取要点,要实现一个一镜到底H5,通常会有以下技术需求:绘制画面:这里我们一般选用基于canvas的库,性能会更好,也方便实现效果。添加动画:其中包括过渡、帧动画,因此需要一个动画库。进度控制:要实现通过用户操作,来控制整个H5的前进、后退、暂停等,我们会需要进度控制相关的库。用户操作:一镜到底的H5一般都需要用户操作以“播放”,按住或滑动,按住比较简单,用原生事件实现就好,滑动相对复杂一点,涉及阻尼运动,因此需要一个滑动相关的库。有了需求,我们就可以相应去找解决方案了。绘图有用3D的threejs的,动画有人用anime.js,各有所好,能实现需求就行。最终针对以上需求,我选用了AlloyTouch、TimelineMax、Pixi.js、TweenMax这几个库来实现通用的一镜到底。各个框架的优点这里就不赘述了,想了解详情的可以自行搜索,几乎都有中文资料,也很容易使用。实现步骤要点用Pixi创建场景,加入到想要加入的DOM容器当中。用Pixi.loader加载精灵图。将精灵图、背景及文本等元素绘制出来。用TimelineMax创建一个总的Timeline,初始设置paused为true,可以设定整条Timeline的长度为1。用TweenMax创建好过渡动画,然后将TweenMax加入到Timeline中,duration比如是占10%的话,就设定为0.1,从滚动到30%开始播放动画的话,delay就设置为0.3。用AlloyTouch创建滚动监听,并设置好滚动高度,例如1000。监听AlloyTouch的change事件,用当前滚动值 / 滚动高度 得到当前页面的进度。调用总Timeline的seek方法,寻找到当前页面进度的地方,可以简单理解成拨动视频播放器的进度条滑块。至此就可以通过用户滑动操作,控制页面元素的动画播放、后退了。你可能会问那怎样实现上面说的几种类型的一镜到底?实际上,几种类型的不同只是动画变换方式不一样而已。画中画(缩放同时平移)时空穿梭(以中心缩放)滚动动画(平移为主,期间播放其他动画)示例项目简单写了个demo,如果感兴趣的朋友可以拉下来自己把玩一下。点此查看仓库点此查看demo(注:项目中素材来源于网络,仅供交流学习使用,切勿商用!)展望这里只实现了一个一镜到底H5的主要效果部分,距离完成还有很多工作:微信分享设置及引导添加一个加载界面添加音乐音效(用过howler,感觉不错)可能需要的生成海报(html2canvas,生成海报easy job)…结语这次没有用太多篇幅铺开来讲细节,主要是运用几个库组合来实现,而实际操作上还有很多地方要注意的,例如帧动画的实现,滑动的速度控制,滑到顶部、底部的处理等等。实际应用上还要继续打磨,毕竟一个漂亮的H5,是要花很多精力去构思,去优化体验的。最后也希望能认识到更多在H5领域有研究的小伙伴,可以互相交流,甚至一起工作!email: vincent@shikehuyu.com

January 10, 2019 · 1 min · jiezi