来源:未知 时间:2022-03-30 21:08 作者:小飞侠 阅读:次
[导读] pixi.js教程中文版--基础篇入门 前言 Pixi.js使用WebGL,是一个超快的HTML5 2D渲染引擎。作为一个Javascript的2D渲染器,Pixi.js的目标是提供一个快速的、轻量级而且是兼任所有设备的2D库。提供...
pixi.js教程中文版--基础篇入门 前言Pixi.js使用WebGL,是一个超快的HTML5 2D渲染引擎。作为一个Javascript的2D渲染器,Pixi.js的目标是提供一个快速的、轻量级而且是兼任所有设备的2D库。提供无缝 Canvas 回退,支持主流浏览器,包括桌面和移动。 Pixi渲染器可以开发者享受到硬件加速,但并不需要了解WebGL。 网上暂时没有找到关于 pixi.js的中文说明文档,我这里仅是记录项目中使用的经验,即记录利用pixi在制作精灵动画时的一些方法。 ========================================================================= 概述需要说明的是,有些示例需要使用http://方式才能有效果,也就是说file://的方式有些示例是无法显示的。 下面我们来看一下,用pixi创建一个精灵要经历哪些步骤: 创建一个PIXI的实例,并展示出来,通常需要以下几步:
概念解释:舞台(stage): // A Stage represents the root of the display tree. Everything connected to the stage is rendered var stage = new PIXI.Stage(0xFFFFFF); //接收一个16进制的值,用于背景的颜色
画布(renderer): var renderer = PIXI.autoDetectRenderer(400, 300);
材质(texture): 可以理解成一种承载图片的结构,它本身不能直接用于显示,需要通过精灵(sprite)才能显示,有点类似于dom中的临时碎片(DocumentFragment) var texture = PIXI.Texture.fromImage("bunny.png"); 精灵(sprite): 可以直接用于舞台显示的对象,可以理解为DOM中的element.
var sprite = new PIXI.Sprite.fromImage('assets/image.png');//直接由图片创建 //... var texture = PIXI.Texture.fromImage("bunny.png");var sprite = new PIXI.Sprite(texture);//由材质创建
// sprite.position.x = 30; //没有单位 // sprite.position.y = 20; // 这就和给element设置样式是一样的道理。
stage.click = function(data){ var event = data.originalEvent } sprite.click = function(data){ var event = data.originalEvent var target = event.target //阻止默认行为,sprite.buttonMode = false; event.preventDefault(); } 此外,还有.mousedown,.mouseover,.mouseout,.mousemove,.mouseup ,.mouseupoutside , .touchstart,.touchend,.tap
不过又不完全相同,如data.originalEvent.stopPropagation()就不起作用. 关于stopPropagation的问题,我问过pixijs的开发者,他答复说stopPropagation是dom中的概念,在canvas/webGL中是没有的,所以不能说是pixi的问题。
var stage = new PIXI.Stage();var renderer = PIXI.autoDetectRenderer(400, 300); document.body.appendChild(renderer.view);var sprite = new PIXI.Sprite.fromImage('bunny.png'); stage.addChild(sprite); 直接贴出上面的代码,在网页上只能看到漆黑的背景, 这是因为精灵的创建是异步的,必须等加载完图片之后才能把精灵加入舞台中
requestAnimFrame(animate); function animate(){ renderer.render(stage); requestAnimFrame(animate); }
sprite.texture.baseTexture.on('loaded',function(){ renderer.render(stage); })
在项目中实践的时候发现用基于baseTexture的loaded事件有两个问题
var img = new Image(); img.src = 'bunny.png'; img.onload = function(){ var baseTexture = new PIXI.BaseTexture(this); var texture = new PIXI.Texture(baseTexture); var sprite = new PIXI.Sprite(texture); stage.addChild(sprite); renderer.render(stage); }
此方案对于批量加载图片也是适用的。最后再重复一遍,请用localhost://xxxxxx的方式进浏览 细心的比较也许你会发现,我和官方的示例不相同,官方使用了requestAnimFrame( animate ),而然我这里没有用,为什么?因为我只是要显示一张图片而已,没有必要不断的去刷新舞台。requestAnimFrame( animate );这个是在精灵有变化的时候才需要用到。当然,如果不考虑性能,对一张静态的图不断的刷新也没有什么问题。 完整的示例:
var stage = new PIXI.Stage(0xFFFFFF); var renderer = PIXI.autoDetectRenderer(400, 300); document.body.appendChild(renderer.view); var sprite = new PIXI.Sprite.fromImage('bunny.png'); stage.addChild(sprite); sprite.texture.baseTexture.on('loaded',function(){ renderer.render(stage); }) sprite.interactive = true stage.click = stage.tap = function(data){ console.log(data.originalEvent.target); //alert('you hit the stage') } sprite.mousedown = sprite.touchstart =function(data){ // stop the default event... data.originalEvent.preventDefault(); this.data = data; this.alpha = 0.9; this.dragging = true; console.log('mousedown'); } sprite.mouseup = sprite.mouseupoutside = sprite.touchend = function(data){ this.alpha = 1 this.dragging = false; // set the interaction data to null this.data = null; console.log('mouseup'); }; sprite.mousemove = sprite.touchmove = function(data){ if(this.dragging){ var newPosition = this.data.getLocalPosition(this.parent); this.position.x = newPosition.x; this.position.y = newPosition.y; console.log('mousemove') renderer.render(stage); } } //requestAnimFrame(animate); function animate(){ renderer.render(stage); requestAnimFrame(animate); } 精灵放大2倍var sprite = new PIXI.Sprite.fromImage('bunny.png'); var sx = sprite.scale.x; var px = sprite.position.x; sprite.scale.x += 1; sprite.position.x -= px; //Y方向同理 ... //刷新一下 requestAnimFrame(animate); 精灵的层级问题在canvas中,由于不能用css的层级样式表来控制层级关系,所以只能另想办法进行模拟。pixi.js中没有提供现成的方法,不过我们研究发现,只要控制精灵加入画布的顺序就可以实现类似的层级效果。它的规则是这样的,先加入画布的,出现在最下面,后加入的,出现在最上面。于是自然的就想到了先用一个数组收集这些精灵,排好序之后再循环加入画布。可是问题就来了,有时候,我们事先往往不能确定层级,或者有时候是用户触发某一个动作之后才改变层级的,这怎么实现呢?这个我想到了给精灵人为的加一个zindex属性。然后遍历这个属性,进行排序,最后再刷新一下舞台。
/** * 对象按指定的属性排序 * @param {array} arr 对象集合 * @return null */ function pixiSort(arr){ var ln = arr.length; var tmp; for(var i = 0;i<ln-1;i++){ for(var j=i+1;j<ln;j++){ tmp = arr[i]; if(arr[i].sortIndex > arr[j].sortIndex){ arr[i] = arr[j]; arr[j] = tmp; } } } }
受html dom操作的影响,有时候我们需要精灵按照指定的层级进行排列显示,比如给精灵指定index属性。要做到对zindex的控制,可以用到如下方法 function updateZindex(ob,stage){ Object.defineProperty(ob,'zIndex',{ set : function(value){ if(this.sortIndex !== value){ this.sortIndex = value; pixiSort(stage.children); } }, get : function(){ return this.sortIndex; } }); } 说白了,就是控制精灵的先后顺序来达到显示层级的效果。 最后是如何销毁: //移除全部精灵stage.removeChildren() //移除整个舞台的引用stage.removeStageReference()
以上创建的是建静止的精灵,及在精灵上邦定事件。这个在官方没有找到示例,特补充一下。(或许pixi就是为动画而生的,所以没有考虑这种简单的需求了) 如果需要动画效果的精灵,官方提供了多种方法。这里就不再细述了。我目前正在研究这一块,有兴趣的可以和我(@frog)一起交流!
在线资源Pixi.js的GitHub主页上,列举了很多在线Demo。 GitHub:https://github.com/GoodBoyDigital/pixi.js/ 官网: http://www.pixijs.com/ API :http://pixijs.download/release/docs/index.html 官方教程:https://github.com/kittykatattack/learningPixi https://github.com/GoodBoyDigital/pixi.js 以上就是pixi.js教程中文版--基础篇入门全部内容,感谢大家支持自学php网。 |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com