Pixi.js技术探索:开发者必备的视觉开发工具

pixi.js是一个开源的轻量级2D渲染引擎,专注于利用WebGL和HTML5中的Canvas技术来实现高性能的交互式图形和动画。它旨在提供一个简单而强大的工具集,使开发者能够轻松地创建各种类型的视觉效果,包括游戏、数据可视化、广告和其他富媒体应用程序。

目录

搭建pixi应用

纹理与动画交互实现

设置文字效果


搭建pixi应用

pixi是一个强大的跨平台的js图形库,它是专门用于开发我们交互式的图形、游戏等方面的一个渲染库,它可以帮助我们开发类似于搞定设计或者非常酷炫的网站。它的渲染速度非常快速并且其对应的api也是非常简单,它的兼容性也是非常强的基本上适配我们主流的所有浏览器,最重要的是它是开源免费的,我们可以对其进行任意的修改和加强。

这里先给出pixi的 官网 和 中文网 便于后期我们翻阅查看相关API文档进行学习,接下来我们开始正式的去使用我们的这个pixi库,这里我们借助vite框架进行项目搭建,如果不了解vite框架的朋友,可以阅读我之前的文章:vite脚手架的搭建与使用 ,接下来我们开始搭建我们的项目:

框架搭建好之后,接下来我们需要安装相应的pixi库了,终端执行如下命令进行安装,目前博主安装的pixi.js版本是^8.2.5,如果你使用的版本更高或者更低导致语法出现问题的话,需要自行去翻阅官方文档,查阅对应的写法,这里不再赘述:

npm install pixi.js

安装完相应的库之后,接下来我们在App根组件处开始创建初始pixi应用,如下:

<script setup lang="ts">
import { onMounted } from 'vue'
// 导入pixi
import * as PIXI from 'pixi.js'

let app: PIXI.Application;
// 初始化pixi容器
const initPixiContainer = async () => {
    app = new PIXI.Application();
    await app.init({ width: 640, height: 360, backgroundColor: 0x1099bb });
    document.body.appendChild(app.canvas); // 添加容器到body中
}

onMounted(() => {
    initPixiContainer()
})
</script>

<style lang="scss">
* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}
canvas {
    width: 100vw;
    height: 100vh;
    position: fixed;
    left: 0;
    top: 0;
}
</style>

最终呈现在页面的效果如下所示:

接下来我们开始一个最简单的操作就是在场景当中添加一个红色的矩形,具体代码如下所示:

<script setup lang="ts">
import { onMounted } from 'vue'
// 导入pixi
import * as PIXI from 'pixi.js'

let app: PIXI.Application;
// 初始化pixi容器
const initPixiContainer = async () => {
    app = new PIXI.Application();
    await app.init({ 
        width: 640, 
        height: 360, 
        backgroundColor: 0x1099bb, 
        antialias: true, // 添加抗锯齿
        resolution: window.devicePixelRatio || 1, // 设备像素比
    });
    document.body.appendChild(app.canvas); // 添加容器到body中
    // 创建图形对象
    let graphics = new PIXI.Graphics();
    // 开始绘图设置填充颜色,两个参数分别为(颜色, 不透明度)
    graphics.fill({color: 0xff0000, alpha: 0.5})
    // 创建图形,四个参数分别是x,y,widht,height,也就是从x,y坐标开始绘制一个宽100,高200的长方形
    graphics.rect(50, 50, 100, 200)
    // 图形缩放 参数为缩放比例
    graphics.scale.set(2, 1)
    // 图形位移 参数为位移x,y
    graphics.position.set(10, 20)
    // 图形旋转
    graphics.rotation = 0.1
    // 设置图形锚点(原点)
    graphics.pivot.set(10, 10)
    // 结束绘制操作
    graphics.fill()

    // 开始绘图设置填充颜色,两个参数分别为(颜色, 不透明度)
    graphics.fill({color: 0xffff00, alpha: 0.5})
    graphics.circle(100, 50, 50) // 绘制圆形, 参数分别为x,y,半径
    graphics.fill()
    //将绘制的图形添加到舞台stage中
    app.stage.addChild(graphics);
}

onMounted(() => {
    initPixiContainer()
})
</script>

最终呈现的效果如下所示:

当然还有一些其他常见的图形的绘制,这里举几个简单的例子:

<script setup lang="ts">
import { onMounted } from 'vue'
// 导入pixi
import * as PIXI from 'pixi.js'

let app: PIXI.Application;
// 初始化pixi容器
const initPixiContainer = async () => {
    app = new PIXI.Application();
    await app.init({ 
        width: 640, 
        height: 360, 
        backgroundColor: 0x1099bb, 
        antialias: true, // 添加抗锯齿
        resolution: window.devicePixelRatio || 1, // 设备像素比
    });
    document.body.appendChild(app.canvas); // 添加容器到body中
    // 创建图形对象
    let graphics = new PIXI.Graphics();
    // 开始绘图设置填充颜色,两个参数分别为(颜色, 不透明度)
    graphics.fill({color: 0xff0000, alpha: 0.9})
    // 绘制圆角矩形
    graphics.roundRect(10, 10, 150, 150, 30); // 参数分别为(x, y, width, height, radius)
    graphics.position.set(100, 100); // 设置位置
    graphics.fill();

    graphics.fill({color: 0xff00ff, alpha: 0.9});
    // 绘制椭圆
    graphics.ellipse(200, 200, 100, 80); // 参数分别为(x, y, width, height)
    graphics.position.set(80, 0); // 设置位置
    graphics.fill();

    graphics.fill({color: 0xffff00, alpha: 0.9});
    // 绘制多边形
    graphics.poly([0, 0, 100, 0, 100, 100, 0, 100]);
    graphics.position.set(0, 20); // 设置位置
    graphics.fill();

    //将绘制的图形添加到舞台stage中
    app.stage.addChild(graphics);
}

onMounted(() => {
    initPixiContainer()
})
</script>

最终呈现的效果如下所示:

纹理与动画交互实现

从官方文档我们可以看出,要处理图像第一步就是将图像文件从网络服务器中拉到用户的网络浏览器当中,所以这里我们要使用Assets.load进行获取图像,官方文档如下:

接下来我们在本地的编辑器中进行测试,代码如下:

const initPixiContainer = async () => {
    app = new PIXI.Application();
    await app.init({ 
        width: 640, 
        height: 360, 
        backgroundColor: 0x1099bb, 
        antialias: true, // 添加抗锯齿
        resolution: window.devicePixelRatio || 1, // 设备像素比
    });
    document.body.appendChild(app.canvas); // 添加容器到body中
    // 创建一个纹理
    const texture = await PIXI.Assets.load("../public/textures/jian.png")
    // 创建一个精灵
    const sprite = new PIXI.Sprite(texture);
    // 设置精灵的位置
    sprite.x = app.screen.width / 3;
    sprite.y = app.screen.height / 4;
    // 设置精灵的旋转角度
    sprite.rotation = Math.PI / 7;
    // 设置精灵图的缩放
    sprite.scale.set(0.2, 0.2);
    // 设置精灵图的透明度
    sprite.alpha = 0.5;
    // 添加精灵到舞台
    app.stage.addChild(sprite);
}

最终呈现的效果如下所示,可以看到我们的页面出现了一个大宝剑,这个图片是加载本地资源出现的,我们可以这个图片资源进行各种操作,操作的方式上述代码给出了部分代码的颜色,效果如下:

接下来我们可以借助官方文档给我们提供的ticker函数实现动画效果:

这里我们设置每一帧实现旋转角度+0.01的效果,代码如下:

最终实现的效果如下所示:

当然,我们也可以给精灵图添加一些点击的交互事件,这些点击交互的事件pixi也是给我们已经封装好了的,效果大致如下所示:

sprite.interactive = true; // 开启交互
// 为精灵添加点击事件
sprite.on("click", () => {
    console.log("点击了")
})
// 鼠标进入离开修改精灵图的透明度
sprite.on("pointerenter", () => {
    sprite.alpha = 1
})
sprite.on("pointerout", () => {
    sprite.alpha = 0.5
})

最终呈现的效果如下所示:

当然我们也可以对我们的资源进行一个异步的加载,代码如下:

const initPixiContainer = async () => {
    app = new PIXI.Application();
    await app.init({ 
        width: 640, 
        height: 360, 
        backgroundColor: 0x1099bb, 
        antialias: true, // 添加抗锯齿
        resolution: window.devicePixelRatio || 1, // 设备像素比
    });
    document.body.appendChild(app.canvas); // 添加容器到body中
    // 添加资源
    PIXI.Assets.add({ alias: 'jian', src: '../public/textures/jian.png' })
    PIXI.Assets.add({ alias: 'jian2', src: 'https://pixijs.com/assets/bunny.png' })

    // 异步加载资源
    const texturesPromise = PIXI.Assets.load(['jian', 'jian2'], (progress) => {
        console.log("加载完成:", progress)
    })
    // 加载资源后执行
    texturesPromise.then((textures) => {
        // 创建容器
        const container = new PIXI.Container()
        // 创建精灵
        const sprite = new PIXI.Sprite(textures['jian'])
        sprite.x = app.screen.width / 2
        sprite.y = app.screen.height / 2
        // 设置精灵的锚点
        sprite.anchor.set(0.5)
        // 设置精灵的缩放
        sprite.scale.set(0.5)
        // 设置精灵的透明度
        sprite.alpha = 0.5
        // 设置精灵的旋转角度
        sprite.rotation = 0.1
        // 设置精灵交互
        sprite.interactive = true
        sprite.on('pointerdown', () => {
            console.log("点击了精灵")
        })
        // 添加精灵到舞台
        container.addChild(sprite)

        // 创建精灵2
        const sprite2 = new PIXI.Sprite(textures['jian2'])
        sprite2.scale.set(0.5)
        container.addChild(sprite2)

        app.stage.addChild(container)
    })
}

效果如下所示:

设置文字效果

如果想在pixi中设置文字效果的话,可以采用下面的代码进行:

const initPixiContainer = async () => {
    app = new PIXI.Application();
    await app.init({ 
        width: 640, 
        height: 360, 
        backgroundColor: 0x1099bb, 
        antialias: true, // 添加抗锯齿
        resolution: window.devicePixelRatio || 1, // 设备像素比
    });
    document.body.appendChild(app.canvas); // 添加容器到body中
    // 显示文字
    const text = new PIXI.Text({
        text: 'Hello World',
        style: {
            fontSize: 36,
            fontFamily:'short-stack',
            fill: 'red',
            align: 'center'
        }
    })
    text.x = app.screen.width / 2;
    text.y = app.screen.height / 2;
    //设置文字锚点
    text.anchor.set(0.5, 0.5);
    app.stage.addChild(text);
}

最终呈现的效果如下所示:

接下来我们可以给这个文字设置一个模糊度处理,代码如下所示:

// 创建模糊效果
const filter = new PIXI.BlurFilter();
filter.blur = 10; // 设置模糊度
text.filters = [filter]; // 添加滤镜
// 监听鼠标是否进入文字
text.interactive = true;
text.on('pointerover', () => {
    filter.blur = 0; // 取消模糊
})
text.on('pointerout', () => {
    filter.blur = 10; // 恢复模糊
})

最终呈现的效果如下所示:

当然这里我们也可以安装如下的pixi的相关第三方库来对一些效果更深一层的进行处理:

 npm i pixi-filters

具体的可以参考文档:地址  ,里面也记载了一些API函数的实际效果,供大家进行选择:

这里我简单的举几个代码的例子,安装完第三方库之后,接下来我们需要引入相关函数:

import { OutlineFilter, GlowFilter } from 'pixi-filters'

然后对文字进行相关的滤镜处理,如下:

// 创建轮廓滤镜
const outlineFilter = new OutlineFilter({
    thickness: 1,
    color: 0xffff00
});
// 创建发光轮廓
const glowFilter = new GlowFilter({
    distance: 10, // 发光距离
    outerStrength: 5, // 发光强度
    innerStrength: 0, // 内部发光强度
    color: 0x00ffff, // 发光颜色
    quality: 0.5, // 发光质量
})

text.filters = [outlineFilter, glowFilter]; // 添加滤镜

最终呈现的效果如下所示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/801287.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JAVA零基础学习1(CMD、JDK、环境变量、变量和键盘键入、IDEA)

JAVA零基础学习1&#xff08;CMD、JDK、环境变量、变量和键盘键入、IDEA&#xff09; CMD常见命令配置环境变量JDK的下载和安装变量变量的声明和初始化声明变量初始化变量 变量的类型变量的作用域变量命名规则示例代码 键盘键入使用 Scanner 类读取输入步骤示例代码 常用方法处…

【服务器】端口映射

文章目录 1.端口映射的概念1.1 端口映射的类型1.2 端口映射的应用场景1.3 示例 2.为什么要进行端口映射呢&#xff1f;3.原理3.1【大白话】原理解释3.2 原理图 4.代码 1.端口映射的概念 端口映射&#xff08;Port Mapping&#xff09;&#xff0c;也称为端口转发&#xff08;P…

第二届大数据、计算智能与应用国际会议(BDCIA2024)

会议日期&#xff1a;2024年11月15-17日 会议地点&#xff1a;中国-湖北省-黄冈市 主办单位&#xff1a;黄冈师范学院 【大会主席】 【主讲嘉宾】 大会邀请到来自美国、英国、加拿大、新加坡、意大利、越南等10余位领域内学术大咖作主题报告&#xff0c;并与参会人员互动交…

【操作系统】文件管理——文件的物理结构(个人笔记)

学习日期&#xff1a;2024.7.15 内容摘要&#xff1a;文件的物理结构&#xff0c;逻辑结构与物理结构 目录 引言 文件分配方式 连续分配 链接分配 隐式链接 显式链接 索引分配 索引块大小不够装入整个索引表怎么办&#xff1f; ①链接方案 ②多层索引 ③混合索引 …

国产精品ORM框架-SqlSugar详解 进阶功能 集成整合 脚手架应用 专题二

国产精品ORM框架-SqlSugar详解 SqlSugar初识 专题一-CSDN博客 sqlsugar 官网-CSDN博客 4、进阶功能 5、集成整合 6、脚手架应用 4、进阶功能 4.1、生命周期 Queryable 什么时候操作库 Queryable是一个引用类型 Queryable拷贝机制 {ISugarQueryable<Student> quer…

切换网页visibilitychange,的升级版实现

目录 1 需求场景 2 用到的技术 3 日常检测方法 4 一个有意思的场景 5 升级版实现一 5.1 新建 /utils/browser.js 5.2 项目业务组件中使用 6 升级版实现二 6.1 安装js-tool-big-box工具库 6.2 引入 browserBox 对象 6.3 以控制累加定时器为例 6.4 查看定时器效果 1…

go 切片进行链式操作并支持泛型

背景&#xff1a; 由于团队不是专业级别的go开发人员&#xff0c;主开发还是java&#xff0c;用惯了java的lambda表达式特别是流式操作&#xff0c; 所以在用go语言时&#xff0c;发现切片处理起来比较麻烦&#xff0c;看看能不能支持类似流式操作&#xff0c;我这边就研究了下…

什么是STM32?嵌入式和STM32简单介绍

1、嵌入式和STM32 1.1.什么是嵌入式 除了桌面PC之外&#xff0c;所有的控制类设备都是嵌入式 嵌入式系统的定义&#xff1a;“用于控制、监视或者辅助操作机器和设备的装置”。 嵌入式系统是一个控制程序存储在ROM中的嵌入式处理器控制板&#xff0c;是一种专用的计算机系统。…

启动react 18.2.x项目报node错误

1、项目启动报错&#xff0c;node版本问题 可以考虑把node版本降低一点&#xff0c;我当时node版本是20.xx 后面我把本本降到16.13.1 2、tsconfig.json的飘红问题 这里提示的是这个字段已经不用了&#xff0c;建议删除该字段&#xff0c;所以删除该字段就好&#xff0c;其实…

[经典]Axrue部件库:Android系统部件

部件库预览链接&#xff1a;&#xff08;请与班主任联系获取文档&#xff09; 支持版本: Axrure RP 8 文件大小: 1200KB 模板目录 黑、白两种UI风格 每天 文档内容介绍 免费领取资料 “210630” 领取

JavaScript object 数据更新方法

https://andi.cn/page/621560.html

JS-11G1端子排静态时间继电器 约瑟JOSEF

JS-11G端子排静态时间继电器 系列型号&#xff1a; JS-11G1端子排静态时间继电器&#xff1b;JS-11G2端子排静态时间继电器; JS-11G3端子排静态时间继电器; JS-11G4端子排静态时间继电器; JS-11G5端子排静态时间继电器;JS-11G7端子排静态时间继电器; JS-11G9端子排静态时间…

沙袋装袋机的原理和特点_鼎跃安全

在现代工业和建筑领域&#xff0c;沙子等散状物料的包装是一个必不可少的环节。传统的手工包装方式效率低下且劳动强度大&#xff0c;而沙袋装袋机的出现则极大地提高了包装效率和质量。 一、沙袋装袋机的工作原理 沙子通过输送系统从储料仓输送到装袋机的料斗中。输送系统设计…

SpringBoot中动态注册Bean的方式

测试环境&#xff0c;本文源码 Java&#xff1a;8SpringBoot&#xff1a;2.5.14示例场景&#xff1a;动态注册ProxyServlet&#xff0c;间接实现类似于Nginx的反向代理功能 先理解如何实现动态注册 Bean 。 由于在 SpringBoot 中&#xff0c;先进行 Bean 的定义&#xff0c;…

道路巡检准确率优于90%,千寻驰观是怎么做到的?

在7月初落下帷幕的2024世界人工智能大会上&#xff0c;人形机器人十八罗汉齐聚现场&#xff0c;“百模大战”精彩开演&#xff0c;还有多种大模型在产业端应用和落地&#xff0c;AI浪潮席卷而来。千寻位置携北斗时空智能AI应用千寻驰观产品亮相大会&#xff0c;备受瞩目。 2024…

释放DOE的能量,快速确定最佳工艺设置,节省时间、成本和资源

您是否希望降低成本、提高生产效率&#xff0c;并最大限度地减少行业对环境的影响&#xff1f; 所有行业&#xff0c;尤其是钢铁、铝、水泥和石化等能源密集型行业&#xff0c;都面临着应对这些挑战的持续压力。供应链压力、可持续发展、严格的监管环境、日益增长的消费者预期…

在前端vue3 开发媒体查询代码 实现 响应式布局(js 和css 方式)

在上一篇文章中 我介绍了一下 媒体查询的知识以及概念 我只介绍了在html css3 中的使用方式以及书写 下面我来简单来演示一下 在vue3 中怎么使用这个 其实都一样的 只是.vue 的文件 我用的是ant-design-vue3 的前端web端框架 用这个来演示 一. css样式媒体查询 目前的框架 是…

mysql中的存储过程

存储过程的作用:有助于提高应用程序的性能。存储过程可以不必发送多个冗长的SQL语句 废话不说多&#xff0c;直接实操 ##实现num的相加 delimiter $$ CREATE PROCEDURE test1 () begindeclare num int default 0; -- 声明变量,赋默认值为0select num20;end $$ delimiter ; …

誉天教育与武汉晴川学院携手开展鸿蒙实训营,共筑鸿蒙生态新篇章!

在数字经济蓬勃发展的今天&#xff0c;鸿蒙系统作为华为自主研发的操作系统&#xff0c;正逐步构建起一个开放、协同、共赢的生态体系。为了进一步推动鸿蒙生态的繁荣发展&#xff0c;培养更多具备鸿蒙原生应用开发能力的专业人才&#xff0c;誉天教育与武汉晴川学院强强联合&a…

聚类分析方法(三)

目录 五、聚类的质量评价&#xff08;一&#xff09;簇的数目估计&#xff08;二&#xff09;外部质量评价&#xff08;三&#xff09;内部质量评价 六、离群点挖掘&#xff08;一&#xff09;相关问题概述&#xff08;二&#xff09;基于距离的方法&#xff08;三&#xff09;…