这样子做的原因:
将当前节点绑定鼠标的按下、移动、抬起事件,当鼠标移动出当前节点范围的时候,发现抬起事件和移动事件失效,所以才讲当前节点的鼠标事件委托给舞台或者父节点以扩大监听范围
代码实现如下:(语言:AS3)=>代码思路解释在文章末尾
当前节点的类
//引入父节点或父节点以上的类
import game.main.view.scene.MainTestView;
public class GridTestNode extends Sprite
{
public function GridTestNode(){
addEvent();
}
public function addEvent():void{
this.on(Event.MOUSE_DOWN,this,onMouseDown);
}
private function onMouseDown(e:Event):void{
//讲当前节点对象传给父节点或父节点以上的类
MainTestView.Instance.setMoveItem(this,true);
//console.log("***按下");
}
//鼠标移动逻辑
public function onDragPos(e:Event):void{
// console.log("***移动");
}|
//鼠标抬起逻辑
public function upMouse():void{
// console.log("***抬起");
}
}
父节点或父节点以上的类
//导入子节点的类
import game.main.view.test.GridTestNode;
public class MainTestView{
//当前可操作节点的对象
private var _isMouseMove:Boolean;
private var _moveItem:GridTestNode;
public static var instance:MainTestView;
public function MainTestView(){
addEvent();
_isMouseMove=false;
}
//单例模式
static public function get Instance():MainTestView{
if(instance == null){
instance = new MainTestView();
}
return instance;
}
//设置可操作鼠标事件的当前节点对象
public function setMoveItem(node:GridTestNode=null,isMouseMove:Boolean=false):void{
this._moveItem=node;
_isMouseMove=isMouseMove;
}
public function addEvent():void{
Laya.stage.on(Event.MOUSE_MOVE,this,onMouseMove);
Laya.stage.on(Event.MOUSE_UP,this,onMouseUp);
}
private function onMouseMove(e:Event):void{
if(_isMouseMove){//可操作
this._moveItem.onDragPos(e);
}
}
private function onMouseUp(e:Event):void{
if(_isMouseMove){
this._moveItem.upMouse();
_isMouseMove=false;
}
}
}
代码思路解释:
- 当前节点绑定鼠标按下事件,并且将当前节点对象传给父节点对象;同时,写出鼠标的移动和抬起逻辑给父节点调用
- 父节点类中,给舞台绑定(也可以给当前类绑定,视监听范围大小确定)鼠标的移动和抬起事件,当鼠标移动的时候,判断_isMouseMove类确定是否可操作,若可以操作则通过传过来的子节点对象来调用子节点定义的移动和抬起逻辑函数
注意:节点之间的相互引用,若有更好想法,记得留言分享哦
网友评论