一、循环动画

let sprite;
Loader.add("images/imgs.json").load(setup);
function setup() {
//利用orange图片贴图生成精灵
let texture = TextureCache["orange.png"];
sprite = new PIXI.Sprite(texture);
//在渲染之前替换纹理贴图
sprite.texture = TextureCache['gakki.jpg'];
sprite.x = ;
sprite.y = ;
//将精灵实例添加到场景
app.stage.addChild(sprite);
//为pixi循环添加事件
app.ticker.add(delta => gameLoop(delta));
} function gameLoop(delta){
sprite.x += +delta;
}

应该很好理解吧,delta参数值代表帧的部分的延迟。你可以把它添加到元素的位置,让元素移动的速度和帧率无关,就像上面代码所示一样;

是否加进去这个delta的值其实是一种审美的选择。它往往只在你的动画没法跟上60帧的速率时候出现(比如你的游戏运行在很老旧的机器上)。

如果你不需要这个参数的话,你的代码可以简化成这样:

let sprite;
Loader.add("images/imgs.json").load(setup);
function setup() {
//利用orange图片贴图生成精灵
let texture = TextureCache["orange.png"];
sprite = new PIXI.Sprite(texture);
//在渲染之前替换纹理贴图
sprite.texture = TextureCache['gakki.jpg'];
sprite.x = ;
sprite.y = ;
//将精灵实例添加到场景
app.stage.addChild(sprite);
//为pixi循环添加事件
app.ticker.add(gameLoop);
} function gameLoop(){
sprite.x += ;
}

我们再来谈谈app.tick.add()的原理:

通过该方法,会将事件逐个添加到了一个事件队列,然后通过requestAnimationFrame()来执行这些方法,该方法类似于setInterval(),只不过比他更为流畅,该API是以帧为单位的,一般1s==60帧,所以每一帧这些函数都会跑一次,1秒跑60次,所以肉眼看起来就会流畅很多了。

二、按键动画

动画,始终是要由人操控的,所以我们卡可以通过键盘的key相关事件来处理,动画的移动

首先,我们利用工厂模式,新建一个keyboard工厂类来实现键盘事件的监听(这里通过函数的方式新建工厂类):

function keyboard(keyCode) {
let key = {
code : keyCode,
isDown : false,
isUp : true,
press : undefined,
release : undefined
}; //The `downHandler`
key.downHandler = event => {
if (event.keyCode === key.code) {
if (key.isUp && key.press) key.press();
key.isDown = true;
key.isUp = false;
}
event.preventDefault();
}; //The `upHandler`
key.upHandler = event => {
if (event.keyCode === key.code) {
if (key.isDown && key.release) key.release();
key.isDown = false;
key.isUp = true;
}
event.preventDefault();
}; //Attach event listeners
window.addEventListener(
"keydown", key.downHandler.bind(key), false
);
window.addEventListener(
"keyup", key.upHandler.bind(key), false
);
return key;
}

虽然代码简单,但是还是要提一下,首先初始化按键状态:keyCode、按键是Up状态的、down的回调key.press和up的回调key.release;

按下键盘时,如果按下的键盘的keyCode和我们定义的按键code一致并且该按键状态为up,那么执行该按键的presss事件;

松开键盘,同理。

let left = keyboard(),
up = keyboard(),
right = keyboard(),
down = keyboard(); left.press = () => {
sprite.vx = -;
sprite.vy = ;
};
left.release = () => {
if (!right.isDown && sprite.vy === ) {
sprite.vx = ;
}
}; right.press = () => {
sprite.vx = ;
sprite.vy = ;
};
right.release = () => {
if (!left.isDown && sprite.vy === ) {
sprite.vx = ;
}
};

上述代码我们定义了上下左右四个键(对应ASCII码值分别为37~40),并且:

left键按下时触发的press事件为精灵x轴速度为-5,也就是向左走,left键松开的时候触发的release事件中如果right键没有按下并且上下键没有按(vy==0),那么精灵的x轴速度变为0(停止)。

其余同理。

在这里提一下,因为循环动画一旦开启那就会一直执行,页面按着一定的规律逐帧渲染,所以,我们只有通过改变元素的移动速度来间接地使其运动/停止。

pixi之动画的更多相关文章

  1. 在pixi中使用你的自定义着色器

    通过几天的学习,对openGL.shader有了一个大致的了解. 回到学习的初衷吧,在基于pixi.js重构D3项目的时候,因为精灵层级的问题,我得按照一定的先后顺序将不同类别的精灵添加到场景中去. ...

  2. 利用pixi.js制作精灵动画

    CSS Sprites 技术对于广大的前端工程师来说应该是一点也不陌生.国内开发者昵称为CSS精灵,通过一定的技术手段,让精灵动起来,我称其为精灵动画,那么目前有哪些实现方式 呢?下面让我们详细的聊聊 ...

  3. HTML5骨骼动画Demo | 使用min2d、createjs、pixi播放spine动画

    Spine做骨骼动画是比较流行的,使用起来可能相对复杂,但功能毕竟强大,所以市场占有率较大. 在unity.cocos2d.starling中使用spine已经很成熟了,而HTML5这一块可能刚刚起步 ...

  4. 2d动画开发之PIXI开发

    简单的移动小游戏只要引入pixi.min.js就可以, 如果要用spine动画(龙骨也支持导出spine格式的)就要引入pixi-spine.js 如果还有声音的支持引入pixi-sound.js 学 ...

  5. PIXI AnimatedSprite 及打字爆炸动画(5)

    效果 : 消除字母 当前位置出现爆炸效果 这里使用到了AnimatedSprite 动画  Members An AnimatedSprite is a simple way to display a ...

  6. 动画requestAnimationFrame

    前言 在研究canvas的2D pixi.js库的时候,其动画的刷新都用requestAnimationFrame替代了setTimeout 或 setInterval 但是jQuery中还是采用了s ...

  7. pixi.js教程中文版--基础篇

    前言 Pixi.js使用WebGL,是一个超快的HTML5 2D渲染引擎.作为一个Javascript的2D渲染器,Pixi.js的目标是提供一个快速的.轻量级而且是兼任所有设备的2D库.提供无缝 C ...

  8. pixi.js

    添加基本文件(库文件) 渲染库 pixi.js pixi.lib.js是pixi.js的子集,依赖class.js,cat.js,event_emiter.js文件 pixi.scroller.js ...

  9. Javascript之pixi框架学习

    pixi 创建渲染器(renderer) 创建一个可以播放动画的区域,相当于(canvas). var renderer = PIXI.autoDetectRenderer(512, 512); do ...

随机推荐

  1. jquery 重复导入问题

    $(...).bootstrapTable is not a function

  2. [py]数据描述符优先级

    实例查找属性的顺序: 类属性 > 数据描述符 > 实例属性 > 非数据描述符 > __getattr__ 类属性>数据描述符>实例属性 class Str: def ...

  3. 已有模板与tp框架的结合 (前台)

    已有模板与tp框架的结合 具体步骤   A.复制模板文件到view指定目录 B. 复合css .js.img.静态资源文件到系统指定目录 C. 把静态资源(css,js,img)文件的路径设置为“常量 ...

  4. mssql查询所有上下级

    if exists (select * from sys.all_objects where name='GetOrgTreeByID') begin drop proc GetOrgTreeByID ...

  5. 《Java入门第二季》第三章 继承

    Java 中的继承1.作用:代码复用. 2.语法:extends关键字. 3.注意点:私有(private)财产(methods.fields)不可继承. Java 中的方法重写 Java 中的继承初 ...

  6. bzoj1617 / P2904 [USACO08MAR]跨河River Crossing

    P2904 [USACO08MAR]跨河River Crossing 显然的dp 设$f[i]$表示运走$i$头奶牛,木筏停在未过河奶牛一侧所用的最小代价 $s[i]$表示一次运$i$头奶牛到对面的代 ...

  7. jQuery获取不到隐藏DIV的高度和宽度

    今天做公司订单系统的修改,有同事将订单维护的四个部分拆成了四个小的tab页,由于数据表格时动态加载,所以表格的高度是动态变化的,可不知怎么,先点哪个哪个的高度就正常,其他的都是最小值,这下蒙了,这个找 ...

  8. HDU 2680 Choose the best route(多起点单终点最短路问题)题解

    题意:小A要乘车到s车站,他有w个起始车站可选,问最短时间. 思路:用Floyd超时,Dijkstra遍历,但是也超时.仔细看看你会发现这道题目好像是多源点单终点问题,终点已经确定,那么我们可以直接转 ...

  9. 嵌入式Linux应用程序开发环境搭建记录

    2016年2月 参考资料: OK210软件手册(Linux版).pdf Ubuntu下Qt4.7.1编译环境配置说明.pdf 我阅读了以下内容: OK210软件手册(Linux版).pdf 第七章 O ...

  10. POJ 2771 Guardian of Decency

    http://poj.org/problem?id=2771 题意: 一个老师想带几个同学出去,但是他怕他们会谈恋爱,所以带出去的同学两两之间必须满足如下条件之一: ①身高差大于40  ②同性 ③喜欢 ...