前端动画渲染引擎pixi.js系列(4)如何实现鼠标交互事件

一.鼠标交互事件概念

鼠标事件交互是指用户通过操作鼠标所触发的事件。常用的交互事件主要有如点击、拖拽等。可以监听到的用户所触发的事件可以分为4类:左键触发,右键触发,触摸屏触发,兼容鼠标和触摸屏的共同触发。如监听点击事件,源码写法是:

sprite.on('click', onClick);

其中onClick是触发点击事件后回调的方法。

1.鼠标左键触发事件:

click:点击事件
mousedown:鼠标按下
mousemove:鼠标移动
mouseout:鼠标移出
mouseover:鼠标经过
mouseup:鼠标松开
mouseupoutside:鼠标按下,移出对象松开

2.鼠标右键触发事件:

rightclick:点击事件
rightdown:鼠标按下
rightup:鼠标松开
rightupoutside:鼠标按下,移出对象松开

3.触摸屏触发事件:

touchcancel:触摸系统cancels键
touchend:触摸结束
touchendoutside:触摸开始,移出对象松开
touchmove:触摸移动
touchstart:触摸开始

4.兼容鼠标和触摸屏的共同触发:

pointercancel:触发系统cancels键
pointerdown:触发按下
pointermove:触发移动
pointerout:触发移出
pointerover:触发经过
pointertap:触发点击
pointerup:触发松开

(注)一般在应用中使用第四种交互事件触发,即兼容触发。

二.参考案例

交互事件在前端常用于实现按钮的三种状态触发:按下、松开、经过。要实现这种效果,我们可以使用下面的代码:

var textureButton = PIXI.Texture.fromImage('../img/button.png');
var textureButtonDown = PIXI.Texture.fromImage('../img/buttonDown.png');
var textureButtonOver = PIXI.Texture.fromImage('../img/buttonOver.png');

var button = new PIXI.Sprite(textureButton);
button.buttonMode = true;
button.interactive = true;

button.on('pointerdown', onButtonDown)
	.on('pointerup', onButtonUp)
	.on('pointerupoutside', onButtonUp)
	.on('pointerover', onButtonOver)
	.on('pointerout', onButtonOut);
app.stage.addChild(button);

function onButtonDown() {
	this.isdown = true;
	this.texture = textureButtonDown;
	this.alpha = 1;
}

function onButtonUp() {
	this.isdown = false;
	if(this.isOver) {
		this.texture = textureButtonOver;
	} else {
		this.texture = textureButton;
	}
}

function onButtonOver() {
	this.isOver = true;
	if(this.isdown) {
		return;
	}
	this.texture = textureButtonOver;
}

function onButtonOut() {
	this.isOver = false;
	if(this.isdown) {
		return;
	}
	this.texture = textureButton;
}




除了以上的交互事件外,还有一种常用的鼠标交互实现就是对显示对象的拖拽,拖拽源码实现如下:其中.dragging属性并不是sprite自带属性,为自定义属性,是为了触发onDragMove后判断所需。所以读者们不要误认为是自带属性。

var texture = PIXI.Texture.fromImage('../img/bunny.png');
var bunny = new PIXI.Sprite(texture);
bunny.interactive = true;
bunny.buttonMode = true;
bunny.anchor.set(0.5);
bunny.position.set(100, 100);
bunny.scale.set(2);
bunny.on('pointerdown', onDragStart)
	.on('pointerup', onDragEnd)
	.on('pointerupoutside', onDragEnd)
	.on('pointermove', onDragMove);
app.stage.addChild(bunny);

function onDragStart(event) {
	this.data = event.data;
	this.alpha = 0.5;
	this.dragging = true;
}

function onDragEnd(event) {
	this.alpha = 1;
	this.dragging = false;
	this.data = null;
}

function onDragMove(event) {
	if(this.dragging) {
		var newPosition = this.data.getLocalPosition(this.parent); //获取鼠标移动的位置
		this.position.x = newPosition.x;
		this.position.y = newPosition.y;
	}
}

(注)要注册交互事件前,一定要把显示对象的interactive和buttonMode属性设为true。

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,以下是使用pixi.js渲染引擎实现上述效果的示例代码。 首先,我们需要在HTML文件中添加一个画布元素,并引入pixi.js库: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>小飞机射击游戏</title> </head> <body> <canvas id="gameCanvas"></canvas> <button id="shootBtn">发射子弹</button> <script src="https://cdn.jsdelivr.net/npm/pixi.js%401.3.1/dist/pixi.min.js"></script> <script src="game.js"></script> </body> </html> ``` 接下来,在JavaScript文件中创建画布对象和小飞机对象,并添加事件监听器处理子弹发射: ```javascript // 创建画布对象 var app = new PIXI.Application({ width: 800, height: 600, antialias: true, transparent: false, resolution: 1 }); document.body.appendChild(app.view); // 加载小飞机图片 PIXI.loader.add("plane", "plane.png").load(function() { // 创建小飞机对象 var plane = new PIXI.Sprite(PIXI.loader.resources["plane"].texture); plane.anchor.set(0.5); plane.x = app.renderer.width / 2; plane.y = app.renderer.height / 2; app.stage.addChild(plane); // 添加点击事件监听器 app.renderer.plugins.interaction.on('pointerdown', function(event) { // 计算子弹的起始和目标位置 var startX = plane.x; var startY = plane.y; var endX = event.data.global.x; var endY = event.data.global.y; // 创建子弹对象 var bullet = new PIXI.Graphics(); bullet.lineStyle(2, 0xFF0000); bullet.moveTo(startX, startY); bullet.lineTo(endX, endY); app.stage.addChild(bullet); // 计算子弹的移动方向和速度 var dx = endX - startX; var dy = endY - startY; var distance = Math.sqrt(dx * dx + dy * dy); var speed = 5; var vx = dx / distance * speed; var vy = dy / distance * speed; // 每一帧更新子弹位置 app.ticker.add(function() { bullet.x += vx; bullet.y += vy; }); }); // 添加按钮事件监听器 var shootBtn = document.getElementById('shootBtn'); shootBtn.addEventListener('click', function() { // 触发点击事件,模拟子弹发射 var event = new Event('pointerdown'); event.data = { global: { x: Math.random() * app.renderer.width, y: Math.random() * app.renderer.height } }; app.renderer.plugins.interaction.emit('pointerdown', event); }); }); ``` 在上述代码中,我们使用 `PIXI.Application` 创建了一个画布对象,然后加载了小飞机图片,创建了小飞机对象并添加到画布中。接着,我们为画布添加了一个点击事件监听器,当点击画布时,计算出子弹的起始和目标位置,并创建一个子弹对象,然后每一帧更新子弹的位置。最后,我们还为按钮添加了一个事件监听器,用于模拟子弹的发射。 需要注意的是,上述代码中使用的是pixi.js 1.3.1版本,如果使用其他版本的pixi.js库,则需要根据文档进行相应修改。同时,为了使代码更加简洁易懂,我们省略了一些错误处理和异常处理的代码,实际开发中需要添加这些代码以保证代码的健壮性和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值