注意:本文代码使用的Pixi.js版本为PixiJS 5.3.3

pixi中常用的鼠标交互事件:

//兼容鼠标和触摸屏的共同触发
type InteractionPointerEvents = "pointerdown" | "pointercancel" | "pointerup" | "pointertap" | "pointerupoutside" | "pointermove" | "pointerover" | "pointerout";
//触摸屏触发事件
type InteractionTouchEvents = "touchstart" | "touchcancel" | "touchend" | "touchendoutside" | "touchmove" | "tap";
//鼠标触发事件
type InteractionMouseEvents = "rightdown" | "mousedown" | "rightup" | "mouseup" | "rightclick" | "click" | "rightupoutside" | "mouseupoutside" | "mousemove" | "mouseover" | "mouseout";

点击事件

首先,我们再Stage中添加一个圆形按钮,将其interactive属性设置为true,并给它绑定一个点击事件。

interactive 默认为false,不会响应交互事件。同样的还有buttonMode属性,默认为false,表示无法交互。设置为true时,鼠标悬浮会变成手型。

const point = new Graphics();
point.beginFill(0x0bef47)
point.drawCircle(300, 300, 50)
point.endFill()
point.interactive = true;//响应交互
point.buttonMode = true;//鼠标变手型
point.on("pointerdown", (event: PIXI.InteractionEvent) => {
console.log("graphics")
})
app.stage.addChild(point)

同样的还可以给舞台stage也添加一个点击事件,因为stage其实就是一个特殊的Container

app.stage.interactive = true;//这个不能忘记
app.stage.on("pointerdown", (event: PIXI.InteractionEvent) => {
console.log("stage")
})

先测试下,上面的点击事件。

  • 点击point按钮,控制台输出graphics -> stage。由于点击事件传递,触发了按钮和舞台的点击事件。
  • 点击stage空白处,控制台无输出。 这个原因其实是因为Container本身是无法被点击的,需要有一个hitAreagraphics继承于Container,在设定了图形范围后,其实就是确定了hitArea。或者可以直接设定点击区域app.stage.hitArea = new PIXI.Rectangle(0, 0, 300, 300);

还可以在renderer上添加点击事件,这个就可以直接响应在stage空白处的点击事件。

app.renderer.plugins.interaction.on("pointerdown", (event: PIXI.InteractionEvent) => {
console.log("renderer", event)
})

当然最外面还可以用window的点击事件。

window.addEventListener("pointerdown", (event: any) => {
console.log("window")
})

最后,点击point按钮就可以看到控制台依次输出的graphics -> stage -> renderer -> window

平移事件(拖拽)

知道了全屏的点击事件后,拖拽平移就简单了。通过dragFlag判断当前是否处于拖拽状态,绑定mousemove事件,移动后修改stageposition即可。

let dragFlag = false;
let startPoint: any;
app.renderer.plugins.interaction.on("mousedown", (event: PIXI.InteractionEvent) => {
dragFlag = true
startPoint = { x: event.data.global.x, y: event.data.global.y }
}) app.renderer.plugins.interaction.on("mousemove", (event: PIXI.InteractionEvent) => {
if (dragFlag) {
const dx = event.data.global.x - startPoint.x;
const dy = event.data.global.y - startPoint.y;
app.stage.position.x += dx;
app.stage.position.y += dy;
startPoint = { x: event.data.global.x, y: event.data.global.y }
}
}) app.renderer.plugins.interaction.on("mouseup", (event: PIXI.InteractionEvent) => {
dragFlag = false
})

缩放事件

缩放就直接绑定到window上,每次鼠标滚动修改stagescale即可。

window.addEventListener("mousewheel", (event: any) => {
const step = event.wheelDelta > 0 ? 0.1 : -0.1
if (app.stage.scale.x + step >= 0.1) {
app.stage.scale.x += step
app.stage.scale.y += step
}
})

总结

总的来说pixi内置的交互方法还是比较简单的,只能满足一些简单使用场景,更多使用样例,可以到 https://pixijs.io/examples/#/interaction/dragging.js 进行预览。

更复杂的使用场景可以引入第三方库Tink来实现。

下面列举一些好用的pixi第三方插件

  • Bump: 一个为了游戏准备的完整的2D碰撞函数集.
  • Tink: 拖放, 按钮, 一个通用的指针和其他有用的交互工具集。
  • Charm: 给Pixi精灵准备的简单易用的缓动动画效果。
  • Dust: 创建像爆炸,火焰和魔法等粒子效果。
  • Sprite Utilities: 创建和使用Pixi精灵的一个更容易和更直观的做法,包括添加状态机和动画播放器。让Pixi的工作变得更有趣。
  • Sound.js:一个加载,控制和生成声音和音乐效果的微型库。包含了一切你需要添加到游戏的声音。
  • Smoothie: 使用真正的时间增量插值实现的超平滑精灵动画。它也允许为你的运行的游戏和应用指定 fps (帧率) ,并且把你的精灵图循环渲染完全从你的应用逻辑循环中分离出去。

pixi.js 简单交互事件(点击、缩放、平移)的更多相关文章

  1. zepto.js 的tap事件中点击一次触发两次事件

    html代码: <div class="xh-lxx-cart-count1"> <span class="minus">-</s ...

  2. js简单自定义事件与主动触发事件

    var events = { addHandler: function (element, eventType, handler) { if (element.addEventListener) { ...

  3. js解决click事件点击事件间隔方法

    var myTimeout = null; $("#id").click(function(){ clearTimeout(myTimeout); myTimeout = setT ...

  4. androidannotations 简单复制与点击事件(1)

    现在最火的android开发框架 简单描述一下 这一篇简单描述寻找控件以及事件的使用 1.该方法可以不用写setconteview @EActivity(R.layout.activity_main) ...

  5. E4A 与JS交互事件无反应

    今天碰到一个问题,E4A与JS的交互,调用JS函数后,事件没有任何反应,给JS赋值,会看到浏览框中有内容显示,但是事件为什么就没反应呢. 把官方的例程打开编译试了也不行. 后来在群中问了,原来是这里设 ...

  6. js去掉浏览器右键点击默认事件(+vue项目开启右键行为)

    js去掉浏览器右键点击默认事件 1.阻止整个页面所有的右击事件 document.oncontextmenu = function(){ return false;} 2.特定的区域/元素 docum ...

  7. three.js中的事件

    以上一篇入门篇为例来简单的设置下3d模型当中的交互事件,上一篇我们已经完成了在3d页面中添加了一个红色球,下面我们给这个球一个点击事件让它Y轴位置上升,再设置一个鼠标移入到球上时让其变色. 1.其实t ...

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

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

  9. android与js的交互之jsbridge使用

    众所周知,app的一些功能可能会使用到H5开发,这就难免会遇到java与js 的相互调用,android 利用WebViewJavascriptBridge 实现js和java的交互,这里介绍下JsB ...

随机推荐

  1. day007|python基础回顾7

    文件处理 目录 文件处理 1 文件打开模式补充 2.1 文件操作之读操作 2.2 文件操作之写操作 3 控制文件指针移动 3.1 前提 3.2 f.seek() 4 文件修改的两种方式 4.1 方式一 ...

  2. Linux如何安装Docker?

    使用yum安装(centos7) Docker要求Centos系统的内核版本高于3.10,安装Docker前需要验证你的服务器内核版本是否支持Docker. 通过 uname -r 命令来查看你的服务 ...

  3. 没有wget Loading mirror speeds from cached hostfile

    问题描述 新装的系统,没有一些常用命令的rpm包.使用ifconfig,报错 Loading mirror speeds from cached hostfile解决 网上解决方案是换数据下载源,但是 ...

  4. 「刷题笔记」哈希,kmp,trie

    Bovine Genomics 暴力 str hash+dp 设\(dp[i][j]\)为前\(i\)组匹配到第\(j\)位的方案数,则转移方程 \[dp[i][j+l]+=dp[i-1][j] \] ...

  5. fist-冲刺第二天随笔

    这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzzcxy/2018SE1 这个作业要求在哪里 https://edu.cnblogs.com/campus/fz ...

  6. NodeJS+formidable实现文件上传加自动重命名

    前述 本人node初学者,此前使用原生node实现文件上传时遇到了一些困难,只做到了.txt 和.png两中格式的文件可以正常上传,如果上传其他格式文件服务端保存的文件会无法正常打开,原因是对form ...

  7. day8(使用celery异步发送短信)

    1.1在celery_task/mian.py中添加发送短信函数 # celery项目中的所有导包地址, 都是以CELERY_BASE_DIR为基准设定. # 执行celery命令时, 也需要进入CE ...

  8. PyQt(Python+Qt)学习随笔:Model/View架构中的Model模型概念

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 Model/View架构中的Model模型Model与数据源通信,为体系结构中的其他组件提供数据接口 ...

  9. 谈谈 javascript的 call 和 apply用法

    定义: ECMAScript规范为所有函数都包含两个方法(这两个方法非继承而来),call和apply,这两个函数都是在特定的作用域中调用函数,能改变函数的作用域,实际上是改变函数体内 this 的值 ...

  10. #2020征文-开发板#SYS_RUN()和MODULE_INIT()之间的那些事

    接触鸿蒙设备开发有一段时间了,也是时候好好挖一挖鸿蒙设备程序的启动流程了. 破冰问题:鸿蒙设备程序从哪里开始运行的? 相信大家都已经非常清楚了,鸿蒙设备程序需要指定入口函数,具体表现在代码层面就是通过 ...