因为之前看过three.js的缘故,所以pixi学习起来也是很快的,主要就是熟悉pixi的API,所以,在这里记录一下pixi常用API,废话不多说,下面上干货。

一、为你的PIXI场景添加图片(精灵类)

注:请自行提前下载pixi.min.js,后续案例基于pixi.js - v4.5.5

//新建一个pixo的实例,并加以配置
let app = new PIXI.Application({width: , height: });
app.renderer.backgroundColor = 0x061639;
app.renderer.view.style.position = "absolute";
app.renderer.view.style.display = "block";
app.renderer.autoResize = true;
app.renderer.resize(window.innerWidth, window.innerHeight);
//将该实例append到页面中用于展示
document.body.appendChild(app.view); //全局定义常用的pixi常量和方法
let Application = PIXI.Application,
Loader = PIXI.loader,
Resources = PIXI.loader.resources,
Sprite = PIXI.Sprite,
TextureCache = PIXI.utils.TextureCache; //load一张图片,并取个别名orange
Loader.add("orange","images/orange.png").load(setup); function setup() {
for (var i = ; i < ; i++) {
//利用orange图片贴图生成精灵
let sprite = new PIXI.Sprite(
Resources.orange.texture
);
sprite.x = (i%)*;
sprite.y = ~~(i/)*;
app.stage.addChild(sprite);
}
}

还有一点,你的demo要跑在服务器环境下,所以,本地搭个服务先!

二、加载纹理贴图集

从面的例子中,我们只是加载了一个纹理,并且直接用这个纹理的texture来初始化一个精灵类,下面是通过加载json的方式,一次性加载多个纹理贴图集。

首先我们下载一个软件Texture Packer,他可以将你的多个贴图生成单个图片文件和对应的json文件。

Loader.add("images/imgs.json").load(setup);

上面的代码执行之后,每一个图像的帧都被加载进Pixi的纹理缓存之中了。你可以选择如下3种方式从已经加载的纹理贴图集中创建精灵。

①TextureCache

let texture = TextureCache["orange.png"],sprite = new Sprite(texture);

可以理解为从pixi的纹理缓存中拿到orange这个纹理,并借此实例化一个精灵实例。

②Resources

let sprite = new Sprite(
Resources["images/imgs.json"].textures["orange.png"]
);

注意,Resources = PIXI.loader.resources,这在博客第一个例子就已经贴出。

这句可以理解为获取指定json文件资源,并且获取其中orange纹理,实例化一个精灵实例。

③上一步的方便写法

let json1 = Resources["images/imgsr.json"].textures;
let sprite = new Sprite(json1["orange.png"]);

因为后续要实例化不同精灵实例的话,第一句话其实就是复用了,所以单独提出来,作为一个变量。

Loader.add("images/imgs.json").load(setup);
function setup() {
//利用orange图片贴图生成精灵
let texture = TextureCache["orange.png"];
let sprite = new PIXI.Sprite(texture);
sprite.x = ;
sprite.y = ;
app.stage.addChild(sprite);
}

 三、纹理替换

Loader.add("images/imgs.json").load(setup);
function setup() {
//利用orange图片贴图生成精灵
let texture = TextureCache["orange.png"];
let sprite = new PIXI.Sprite(texture);
//在渲染之前替换纹理贴图
sprite.texture = TextureCache['gakki.jpg'];
sprite.x = ;
sprite.y = ;
app.stage.addChild(sprite);
}

 四、精灵分组

let sprite;
Loader.add("images/imgs.json").load(setup);
function setup() {
//利用orange图片贴图生成精灵
sprite = new PIXI.Sprite(TextureCache["orange.png"]);
let sprite1 = new PIXI.Sprite(TextureCache["gakki.jpg"]);
let wrap = new PIXI.Container();
sprite.x = ;
sprite.y = ;
sprite1.x = ;
sprite1.y = ;
wrap.addChild(sprite,sprite1);
//将精灵实例组添加到场景
app.stage.addChild(wrap);
//为pixi循环添加事件队列
app.ticker.add(gameLoop);
}

精灵分组之后,我们可以以组为单位来操纵这些精灵了,但不影响我们像之前那样,单个操作它们。

但是,此时单个精灵的位置(x,y)是它们相对于容器的位置。不过你还是可以通过如下API得出精灵的全局位置:

wrap.toGlobal(sprite.position)  或者
sprite.getGlobalPosition()

其实就是容器的位置加上单个精灵的位置(因为他们的位置是相对于容器的),这样就算出了精灵相对于全局(舞台)的位置了。

下面是计算两个精灵之间的距离:

sprite.toLocal(sprite.position, sprite1)

其实这个方法有待优化(根本没必要传精灵的位置好吧,函数内部可以算啊)

关于精灵分组,还有一个API:ParticleContainer,他的渲染速度比Container的渲染速度快2到5倍,但是为此你得做出一些牺牲:

pixi之加载纹理贴图和精灵类的使用的更多相关文章

  1. WebGL编程指南案例解析之加载纹理(贴图)

    var vShader = ` attribute vec4 a_Position; attribute vec2 a_TexCoord; varying vec2 v_TexCoord; void ...

  2. SDL2.0的加载图片贴图

    加载图片贴图,采用了SDL_Window.SDL_Renderer.SDL_Texture和SDL_Image库 实例: #include <stdio.h> #include <m ...

  3. cocos2dx 3.3 异步加载纹理

    这里以3d场景加载为例,2d情况类似. 先同步加载模型数据和尺寸缩小了100倍的贴图,创建mesh.然后异步加载所有精细纹理并每加载完一个就替换一个,并进入场景. 如此做法的效果是当刚进入场景时看到的 ...

  4. cocos2d-x lua中实现异步加载纹理

    原文地址:  http://www.cnblogs.com/linchaolong/p/4033118.html 前言   问题:最近项目中需要做一个loading个界面,界面中间有一个角色人物走动的 ...

  5. Unity3D学习笔记9——加载纹理

    目录 1. 概述 2. 详论 2.1. Resources方式 2.2. API方式 2.3. Web方式 1. 概述 理论上,Unity中加载纹理并没有什么难度,只需要将图片放置在Assets文件夹 ...

  6. 加载未安装APK中的类

    一.前提 目的:动态加载SD卡中Apk的类. 注意:被加载的APK是未安装的. 相关:本文是本博另外一篇文章:Android动态加载jar/dex的升级版. 截图: 成功截图: 二.准备 准备被调用A ...

  7. dll的加载方式主要分为两大类,显式和隐式链接

    之前简单写过如何创建lib和dll文件及简单的使用(http://blog.csdn.net/betabin/article/details/7239200).现在先再深入点写写dll的加载方式. d ...

  8. Android应用开发提高系列(4)——Android动态加载(上)——加载未安装APK中的类

    前言 近期做换肤功能,由于换肤程度较高,受限于平台本身,实现起来较复杂,暂时搁置了该功能,但也积累了一些经验,将分两篇文章来写这部分的内容,欢迎交流! 关键字:Android动态加载 声明 欢迎转载, ...

  9. 动态加载Dll时,通过Type生成类对象

    原文:动态加载Dll时,通过Type生成类对象 转:http://www.cnblogs.com/zfanlong1314/p/4197383.html "反射"其实就是利用程序集 ...

随机推荐

  1. CentOS7.5基础优化与常用配置

    目录 最小化全新安装CentOS7基础优化 配置yum源 安装常用软件 关闭防火墙 关闭SELinux 优化ulimit 历史命令记录改为1万条 把命令提示符改为绿色 添加vim配置文件 添加一个普通 ...

  2. MySQL中特有的函数If函数

    上面我们已经知道了case函数可以实现逻辑判断,可以是很复杂的逻辑判断,但是如果我们只想实现的是如果这个条件成立就返回A否则就返回B这样简单的逻辑如果用case的话,未免复杂了.我们可以使用if函数来 ...

  3. Java基础知识陷阱(九)

    本文发表于本人博客. 今天我来说说关于JAVA多线程知识,有错误请指出.大家都知道JAVA在服务端上处理也有很大优势,很多公司也有在服务器跑JAVA进程,这说明JAVA在处理这个多线程以及并发下也有一 ...

  4. Restoring Numbers

                                                                                  D. Restoring Numbers   ...

  5. 服务器环境配置nginx / php / php-fpm(一)

    登陆,升级应用,查询和关闭selinux yum update getenforce setenforce 0 vi /etc/selinux 添加非root用户 adduser deploy pas ...

  6. Python笔记 #15# Pandas: Missing Data

    10 Minutes to pandas import pandas as pd import numpy as np import matplotlib.pyplot as plt dates = ...

  7. linux及安全第六周总结——20135227黄晓妍

    总结部分: 操作系统内核三大功能: 进程管理,内存管理,文件系统 最核心的是进程管理 为了管理,首先要对每一个进程进行描述.进程描述符提供了所有内核需要了解的信息. 进程控制模块:task_struc ...

  8. SSL/TLS协议概览

    SSL/TLS协议是什么 计算机网络的OSI七层模型和TCP/IP四层模型想必大家都知道.其中SSL/TLS是一种介与于传输层(比如TCP/IP)和应用层(比如HTTP)的协议.它通过"握手 ...

  9. SDN原理 OpenFlow协议 -2

    本文由SDN原理视频而成:SDN原理 流表 FlowTable --- OpenFlow的核心 问题3 流表项 Flow Entry 单流表(OpenFlow 1.0版本) -> 多流表(Ope ...

  10. 【转载】解决telnet无法连接 Connection refused

    原文:解决telnet无法连接 Connection refused telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式.它为用户提供了在本地计算机上完成 ...