pixi.js的显示对象都可以响应鼠标事件,官方的api不好,学习起来着实费劲。
pixi.js中EventEmitter相当于as中的EventDispatcher,所有接受发送事件的对象,都继承自EventEmitter。addListener是在这个类中定义的,但是官方的api中不显示该类的属性和方法。
源码中,EventEmitter = require('eventemitter3');不知道怎么才能导出EventEmitter中的方法。有时间得熟悉熟悉nodejs开发,要不真的落伍了。
发现InteractionManager类,不知道怎么用。
先老老实实学会应用吧。
代码:
<html>
<head>
<title>pixi.js入门-事件</title>
<script type="text/javascript" src="../pixi.js"></script>
<script type="text/javascript">
var frameRate=30;
var renderer;
var stage;
var tf;
var fps=0;
var ticker;
window.onload = function() {
renderer = new PIXI.WebGLRenderer(600, 400,{transparent:true});
document.body.appendChild(renderer.view);
stage = new PIXI.Container();
var texture = PIXI.Texture.fromImage('bunny.png');
var sp1 = new PIXI.Sprite(texture);
stage.addChild(sp1);
sp1.x = 200;
sp1.y = 200;
sp1.interactive = true;
stage.interactive = true;
sp1.mousedown =function(e){
console.log("sp1.mousedown");
}
sp1.mouseover=function(e){
console.log("sp1.mouseover");
}
sp1.mouseout=function(e){
console.log("sp1.mouseout");
}
stage.mouseup=function(e){
console.log("stage.mouseup");
}
sp1.click=function(e){
console.log("sp1.click");
}
sp1.touchstart=function(e){
console.log("sp1.touchstart");
}
sp1.touchmove=function(e){
console.log("sp1.touchmove");
}
sp1.touchend=function(e){
console.log("sp1.touchend");
}
sp1.addListener("mousedown",function(e){
console.log("mousedown:",e);
});
sp1.addListener("mouseover",function(e){
console.log("mouseover:",e);
});
sp1.addListener("mouseout",function(e){
console.log("mouseout:",e);
});
stage.addListener("mouseup",function(e){
console.log("mouseup:",e);
});
sp1.addListener("click",function(e){
console.log("click:",e);
});
sp1.addListener("touchstart",function(e){
console.log("touchstart:",e);
});
sp1.addListener("touchmove",function(e){
console.log("touchmove:",e);
});
sp1.addListener("touchend",function(e){
console.log("touchend:",e);
});
tf = new PIXI.Text("fps:0", {
font: '24px Arial',
fill: 0xff1010,
align: 'left'
});
stage.addChild(tf);
refresh();
setInterval(showFps, 1000);
}
function showFps(){
tf.text="fps:"+fps;
fps=0;
}
function refresh(){
fps++;
var t=new Date().getTime();
renderer.render(stage);
t=new Date().getTime()-t;
var delay=1000/frameRate;
if(t>=delay){
refresh();
}
else{
setTimeout(refresh,delay-t);
}
}
</script>
</head>
<body>
</body>
</html>关键在这句,一定要设置为true。
官方API中有这样一句:Any DisplayObject can be interactive if its interactive parameter is set to true。所有DisplayObject都可以交互,但是需要设置interactive 为true。
sp1.interactive = true;
可以使用addListener,也可以直接使用sp1.click,用过js的应该都很熟悉了。
touch事件和mouse事件是分开的,pc端只支持mouse事件,移动端只支持touch事件,不知道能不能像createjs那样,设置一个和开关,开启之后,自动识别并转换mouse和touch事件,这样大多数情况下,开发者就只需要关注逻辑了。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。