首先汇总下pixi中的全部事件:vue
最近写了个pixi简单的拖拽demo:json
<!-- * @Descripttion: * @Author: * @Date: 2019-04-04 11:47:42 --> <template> <div></div> </template> <script> export default { name: "testline", data() { return {} }, mounted() { let PIXI = this.PIXI; const _this = this; // 建立应用 let app = new PIXI.Application(); app.renderer.view.style.position = "absolute"; app.renderer.view.style.display = "block"; app.renderer.autoResize = true; app.renderer.resize(window.innerWidth, window.innerHeight); document.body.appendChild(app.view) // 加载图片 let textureUrl = "/testTexture/textures.json", heartId = "heart.png"; PIXI.loader .add(textureUrl) .load(setup); function setup() { // 至关于把这个加载拆分出一个方法 // new PIXI.Sprite(PIXI.loader.resources[textureUrl].textures[backgroundId]) let id = PIXI.loader.resources[textureUrl].textures let heart = new PIXI.Sprite(id[heartId]) heart.anchor.set(0.5); heart.position.set( window.innerWidth / 2, window.innerHeight / 2 ); // 加入舞台中 app.stage.addChild(heart); // 开启交互 heart.interactive = true; heart.buttonMode = true; console.log(this) // 拖拽事件 heart .on('pointerdown', _this.onDragStart) .on('pointerup', _this.onDragEnd) .on('pointerupoutside', _this.onDragEnd) .on('pointermove', _this.onDragMove) } }, created() {}, methods: { onDragStart(event) { let currentTarget = event.currentTarget; currentTarget.data = event.data currentTarget.alpha = 0.5; currentTarget.dragging = true; }, onDragEnd(event) { let currentTarget = event.currentTarget; currentTarget.alpha = 1; currentTarget.dragging = false; }, onDragMove(event) { let currentTarget = event.currentTarget; if (currentTarget.dragging) { var newPosition = currentTarget.data.getLocalPosition(currentTarget.parent); //获取鼠标移动的位置 currentTarget.position.x = newPosition.x; currentTarget.position.y = newPosition.y; } } } } </script> <style> </style>
// 没有参数 .on("pointerdown", _this.onDragStart) // 正确 .on("pointerdown", _this.onDragStart()) //错误:会 直接执行函数 // 须要传参 .on("pointerup", _this.buttonSubmit.bind(_this, { params: "aaa" })); .on("pointerup", (event) => { _this.buttonSubmit("aaa",event) }); // 须要传递回调函数 .on("pointerup",_this.buttonSubmit.bind(_this, { params: "aaa", callback: target => { doSomethis(target); // 接受当前事件绑定对象,方便doSomethis中使用 } }) ); // 在事件中能够经过下面方式拿到data buttonSubmit(data, event) { if (data.callback) data.callback(event.currentTarget) }
若是把绑定的事件写到mounted中,那么这个事件中的this就是pixi的对象(sprite),可是把事件写到methods中,这个时候的this就是vue自己,必定要区别开。app
在methods中的事件中直接拿this,打印出的是VueComponent,而不是咱们想要的pixi对象,这个时候,你设置this的透明度、大小之类的确定都会报错。解决办法是咱们能够经过event.currentTarget拿到事件的绑定对象,打印currentTarget会发现他就是咱们须要的pixi对象Sprite,经过它来实现事件触发后的一些效果就能够了。要留意的是,直接在控制台打印event,会看见它的currentTarget是null,可是打印event。currentTarget是有东西的,查了资料发现原来是由于:currentTarget 在你控制台展开查看的时候,已经不存在了。你要是想拿到它,须要将它赋值给一个值,而后再进行操做。能够参考:https://stackoverflow.com/que...ide
交互以前,必定要把设置对象的interactive和buttonMode属性为true。函数