注意:本文代码使用的Pixi.js版本为PixiJS 5.3.3
git
pixi中经常使用的鼠标交互事件:github
//兼容鼠标和触摸屏的共同触发 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,并给它绑定一个点击事件。app
interactive 默认为false,不会响应交互事件。一样的还有buttonMode属性,默认为false,表示没法交互。设置为true时,鼠标悬浮会变成手型。ide
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
自己是没法被点击的,须要有一个hitArea
。graphics
继承于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
事件,移动后修改stage
的position
便可。指针
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
上,每次鼠标滚动修改stage
的scale
便可。
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第三方插件