用事件队列来处理pixi中的场景元素入场
在pixi中,添加一个精灵元素,你可能需要,先将贴图load进来,然后才能添加到场景中去,所以一般会这么操作
Loader.add("tree","static/images/tree.png").load(function(){
for (var i = ; i < ; i++) {
let sprite = new PIXI.Sprite(
Resources.tree.texture
);
sprite.x = (i%)*;
sprite.y = ~~(i/ + )*;
sprite.type = 'tree';
sprite.scale.x = 0.1;
sprite.scale.y = 0.1;
sprite._zIndex = -;
sprite.buttonMode = true;
sprite.interactive = true;
sprite.on('pointerdown', function(){
console.log(this)
});
app.stage.addChild(sprite);
}
});
不难看出,上述代码,往场景中加了6棵树。
当要添加很多不同元素的时候,需要的贴图可能会很多,而且load贴图是不能同时load两张以上的贴图,会报如下错误

所以,雪碧图就产生了,将多张资源贴图整合在一起,生成一张图(用texturepacker工具可以附带生成一个json,不用手动计算每一帧所需的图片在雪碧图中的位置,很方便)
但是,我觉得这样的话,所有的元素都会由于雪碧图的原因,不得不将不同元素的业务逻辑集中写在同一个雪碧图load后的回调里面,个人感觉很鸡肋,耦合度过高!
于是,我想到了用事件队列。
一、用事件队列管理不同元素的业务逻辑
具体代码,长这样:

效果是这样的:

人物由上下左右键控制运动;
松鼠自由运动,每3秒随机换个方向;
寸草不生的土地由136个精灵拼接而成;
一片水和6棵树。
二、代码解析
//任务队列对象
var tasklist = {
task:[],
run:function(){
var task = this.task.shift();
if(task){
task();
}
},
push:function(task){
this.task.push(task)
}
}; //单个任务
function tasktree(){
Loader.add("tree","static/images/tree.png").load(function(){
tasklist.run();
for (var i = ; i < ; i++) {
let sprite = new PIXI.Sprite(
Resources.tree.texture
);
sprite.x = (i%)*;
sprite.y = ~~(i/ + )*;
sprite.type = 'tree';
sprite.scale.x = 0.1;
sprite.scale.y = 0.1;
sprite.buttonMode = true;
sprite.interactive = true;
sprite.on('pointerdown', function(){
console.log(this)
});
app.stage.addChild(sprite);
}
});
} //任务队列初始化和开始运行
tasklist.task=[taskground,taskwater,taskperson,tasktree,taskanimal];
tasklist.run();
该事件队列机制的核心就在于利用数组的shift()方法模拟了队列的FIFO规则,并且规避了不能同时load两个以上贴图的问题。
因为上述红色粗体字可以看出,上一个任务的贴图load结束之后,立马load下一个任务的贴图,并且此时同步执行上个任务的逻辑部分,如此循环直到任务队列里面的任务全部清空。
有了这个事件队列机制,大大地降低了各个场景元素之间的雪碧图加载的带来的这种高耦合度问题。并且场景元素的加载与拆卸也会变得很便捷,只要不把这个任务放到事件队列里面那么他就不会被被执行,并且不会影响其他代码块的执行。
是不是很方便呢?如果你有更好的方法,不妨在下方评论
用事件队列来处理pixi中的场景元素入场的更多相关文章
- 在pixi中使用你的自定义着色器
通过几天的学习,对openGL.shader有了一个大致的了解. 回到学习的初衷吧,在基于pixi.js重构D3项目的时候,因为精灵层级的问题,我得按照一定的先后顺序将不同类别的精灵添加到场景中去. ...
- Unity制作游戏中的场景
Unity制作游戏中的场景 1.2.3 场景 在Unity中,场景(Scene)就是游戏开发者制作游戏时,所使用的游戏场景.它是一个三维空间,对应的三维坐标轴分别是X轴.Y轴和Z轴本文选自Unity ...
- cocos2dx中的场景和使用方法
1.一个游戏中有且只有一个导演,但是至少有一个场景 2.场景是游戏元素节点数的根节点,也可以理解为该场景下的渲染树的根节点 3.场景是一个容器,包含了该场景下的所有游戏元素,比如层,精灵 4.场景是导 ...
- LoadRunner中运行场景时提示"You do not have a license for this Vuser type."
LoadRunner中运行场景时提示"You do not have a license for this Vuser type." 2012-06-15 17:09:07| 分 ...
- Spring Data JPA系列3:JPA项目中核心场景与进阶用法介绍
大家好,又见面了. 到这里呢,已经是本SpringData JPA系列文档的第三篇了,先来回顾下前面两篇: 在第1篇<Spring Data JPA系列1:JDBC.ORM.JPA.Spring ...
- 萌新笔记——Cardinality Estimation算法学习(一)(了解基数计算的基本概念及回顾求字符串中不重复元素的个数的问题)
最近在菜鸟教程上自学redis.看到Redis HyperLogLog的时候,对"基数"以及其它一些没接触过(或者是忘了)的东西产生了好奇. 于是就去搜了"HyperLo ...
- CSharpGL(6)在OpenGL中绘制UI元素
CSharpGL(6)在OpenGL中绘制UI元素 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo,更适合入 ...
- CSharpGL(2)设计和使用场景元素及常用接口
CSharpGL(2)设计和使用场景元素及常用接口 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo,更适合入 ...
- Cardinality Estimation算法学习(一)(了解基数计算的基本概念及回顾求字符串中不重复元素的个数的问题)
最近在菜鸟教程上自学redis.看到Redis HyperLogLog的时候,对“基数”以及其它一些没接触过(或者是忘了)的东西产生了好奇. 于是就去搜了“HyperLogLog”,从而引出了Card ...
随机推荐
- JavaScript(JS)入门篇
<script type="text/javascript"> 表示在<script></script>之间的是文本类型(text),javas ...
- HTML table 边框双线变单线
table{border-collapse:collapse;border-spacing:0;border-left:1px solid #888;border-top:1px solid #888 ...
- MyBatis中#{}和${}的不同和${}的妙用(转)
突然意识到sql语句的独特语义要和代码分离,我们就不能够在代码中写sql语句!!比如我要用${}在MyBatis的sql中拼接排序类型的时候,我就不能够在Java代码中直接写参数字符串为Ord ...
- python不换行输出
python默认的print是换行输出的.要想实现不换行输出,方法如下: python 2.X版本: print('要在print后面加个逗号-> , '), python 3.X版本: pri ...
- 11 git第二部分(未完成)
https://www.cnblogs.com/shangchunhong/p/9444335.html
- IF语句及代码练习
接着上篇的内容 ㈠ if . . . else . . .语句 ⑴语法 if(条件表达式){ 语句. . . } else { 语句. . . } ...
- PHP mysqli_fetch_field_direct() 函数
返回结果集中某个单一字段(列)的 meta-data,并输出字段名称.表格和最大长度: mysqli_fetch_field_direct(result,fieldnr); 参数 描述 result ...
- 【luoguP4124 】[CQOI2016]手机号码
题目描述 人们选择手机号码时都希望号码好记.吉利.比如号码中含有几位相邻的相同数字.不含谐音不吉利的数字等.手机运营商在发行新号码时也会考虑这些因素,从号段中选取含有某些特征的号码单独出售.为了便于前 ...
- Linux查看进程的启动路径——pwdx
想要找到transfer的启动路径. 一般是ps -ef | grep keyward 但是这个刚好是没有用绝对路径执行. 再用pwdx pid获得
- codeforces#1187E. Tree Painting(树换根)
题目链接: http://codeforces.com/contest/1187/problem/E 题意: 给出一颗树,找到一个根节点,使所有节点的子节点数之和最大 数据范围: $2 \le n \ ...