如何让多个棋子,点一下选中,再点一下棋盘移动到那里?

我用了touch_start触发事件,但是用这个只能拖动。我想要的效果是,点一下一个棋子,再点一下屏幕,到屏幕上点击的地方。如果点击的是棋子右边,向右走一格,如果是左边,向左走一格。

我用touchend触发,但是不行。代码如下。问题是,如何实现,得到点击屏幕上那点的坐标?目前必须点击这个棋子,点击到屏幕就无效。如有答复,先谢谢了!

onTouchEnd (event) {
//var cpos=this.node.convertToNodeSpaceAR(event.getLocation());
var cpos=event.getLocation(); 注意:不管转不转坐标,都不行,无法实现判断x2>x1
var x2=cpos.x;
var y2=cpos.y;

if(this.xvalue>3){this.xvalue=3;}
if(this.yvalue>7){this.yvalue=7;}

if(x2>x1 ){
this.node.x =x1+64.8;
this.xvalue=this.xvalue+1; //mcount=1;
}else{
this.node.x =x1-64.8;
this.xvalue=this.xvalue-1;}
}

用转坐标的方法多麻烦啊,象棋64个格子等于是有64个元素的数组,围棋324个格子等于是一个长度为324的数组,鼠标点击某一个棋子就做一个标记,当下一次点击鼠标的时候判断被点击的格子有没有棋子,没有的话就把棋子放到第二次点击的格子就好了!我的理解是这样 不知道能不能帮到你!

代码建议格式化好,这样别人才愿意看啊

onTouchEnd (event) {
  //var cpos=this.node.convertToNodeSpaceAR(event.getLocation());
  var cpos=event.getLocation(); 注意:不管转不转坐标,都不行,无法实现判断x2>x1
  var x2=cpos.x;
  var y2=cpos.y;

  if(this.xvalue>3){this.xvalue=3;}
  if(this.yvalue>7){this.yvalue=7;}

  if(x2>x1 ){
    this.node.x =x1+64.8;
    this.xvalue=this.xvalue+1; //mcount=1;
  }else{
    this.node.x =x1-64.8; 
    this.xvalue=this.xvalue-1;
  }
}
1赞

谢谢你!您的思路很好,我觉得很对。就是实施起来,我这样试过,关键是第二次点击难搞啊,第二次点击怎么获得呢?

谢谢整理!

正好在写五子棋,第一次点击用个变量保存下,_readyPos,第二次就判断下这个变量

`

public onTouchBoard(event:cc.Event.EventTouch){

    let loc = this.chessBoard.convertToNodeSpaceAR(event.getLocation());

    let pos = this.convertToPos(loc);
    if(this._chessMap[pos]) return PopView.ins.popMsg("此处已落子");

    if(GameDataManager.ins.isMyTturn() && pos == this._readyPos){
        ColyseusEngine.ins.sendData(CMD.PutChess,{pos:pos});
    }
    else {
        this._readyPos = pos;
        this.tipIco.position = this.canvertToLoc(pos);
        this.tipIco.active = true;
    }

}`

点击事件不要挂在棋子上,挂到棋盘上,节点区域外的点击是获取不到的

谢谢,那挂在棋盘上,咋选定棋子呢?

棋牌保存所有棋子的位置,点击的时候判断是不是点在棋子上。

谢谢。但是有两次点击,用touchend无法区分啊,怎么判断点在棋盘还是棋子呢?小白,还请谅解

门都打不开 还想进去搞事。。先搞搞其他更简单的吧

1赞

承认你牛,大伙都是从0开始的,不帮忙就算了,也没必要嘲讽吧

或者可以试试点击棋子的时候获取下坐标,如果棋盘有点击事件不要穿透了,点击棋盘的时候获取下点击位置的坐标,通过转换世界坐标去实现移动(貌似感觉像下象棋的效果):mask:

场景里有一堆棋子 创建个变量去存你点击过的 然后点击某个地方就放过去完事呗

谢谢你!我发现实际是我坐标换算有问题,初学,搞不懂:
event.getLocation()得出的x,y
var cpos=this.node.convertToNodeSpaceAR(event.getLocation());得出的xy
还有我发在棋盘上的node xy不知为啥都不同
我得再理解下

谢谢你!

是不是考虑先转为世界坐标 convertToWorldSpaceAR 之后
再由 convertToNodeSpaceAR 转换为局部坐标

local location = touch:getLocation()
local position = self:convertToNodeSpace(location);

local touchPosition = position
self.tox = 0
self.toy = 0;
-- 判断点击的是不是棋盘内,并把点击的坐标的x,y确定下来
if not self:checkTouchPositionStone(touchPosition) then
    return false;
end
local clickStoneID = self:getStoneIDByXY(self.tox, self.toy);
if self.select_id == -1 then
    self:setSelectedID(clickStoneID);
else
    self:moveToXY(self.select_id, clickStoneID, self.tox, self.toy)
end

return true

非常感谢!

谢谢!这个代码太好了!:slight_smile: