void SceneGame::CheckRecv(float) { if (Net::isRecvComplete()) { int len; char* data = Net::RecvData(len); unschedule(schedule_selector(SceneGame::CheckRecv)); // 悔棋 if (data[0] == 3) { doRegret2(); // 继续接收 Net::RecvStart(); schedule(schedule_selector(SceneGame::CheckRecv)); } // 选棋 else if (data[0] == 1) { _selectid = data[1]; _selectSprite->setPosition(_s[_selectid]->fromPlate()); _selectSprite->setVisible(true); // 继续接收 Net::RecvStart(); schedule(schedule_selector(SceneGame::CheckRecv)); } else if (data[0] == 2) { // 接受移动信息 Stone* s = _s[data[1]]; int row = 9 - data[2]; int col = 8 - data[3]; int killid = Common::getStoneFromRowCol(row, col, _s); // 记录走棋信息 recordStep(_selectid, killid, _s[_selectid]->_row, _s[_selectid]->_col, row, col); // 移动棋子 s->_row = row; s->_col = col; s->setPosition(s->fromPlate()); // 杀死棋子 if (killid != -1) { Stone* ks = _s[killid]; ks->_dead = true; ks->setVisible(false); } // 更新数据 _selectid = -1; _selectSprite->setVisible(false); _bRedTurn = !_bRedTurn; } } }
void SceneGame::MoveStone(CCTouch* touch) { int row, col; bool bClick = Common::Screen2Plate(touch->getLocation(), row, col); if (!bClick) { return; } // 相同棋子更换选择 int clickid = Common::getStoneFromRowCol(row, col, _s); if (clickid != -1) { if (Common::isSameColor(clickid, _selectid, _s)) { _selectid = clickid; CCPoint pt = Common::Plate2Screen(row, col); _selectSprite->setPosition(pt); _selectSprite->setVisible(true); return; } } // 判断棋子是否可以移动 canMove *move = canMove::createMove(this, _selectid, row, col, clickid); if (!move->move()) { return; } CC_SAFE_DELETE(move); // 记录走棋信息 recordStep(_selectid, clickid, _s[_selectid]->_row, _s[_selectid]->_col, row, col); // 杀掉棋子 if (clickid != -1) { _s[clickid]->setVisible(false); _s[clickid]->_dead = true; } // 移动棋子 _s[_selectid]->_row = row; _s[_selectid]->_col = col; _s[_selectid]->setPosition(Common::Plate2Screen(row, col)); // 更新数据 _selectid = -1; _selectSprite->setVisible(false); _bRedTurn = !_bRedTurn; // 发送移动棋子报文 Step* step = *_steps.rbegin(); char buf[4]; buf[0] = 2; buf[1] = step->moveid; buf[2] = step->rowTo; buf[3] = step->colTo; Net::Send(buf, 4); // 接收信息 Net::RecvStart(); schedule(schedule_selector(SceneGame::CheckRecv)); }
void SceneGame::MoveChess(Touch* touch) { #if 0 Vec2 ptClicked = touch->getLocation(); int row, col; bool bClick = Screen2Plate(ptClicked, row, col); if (!bClick) { return; } int clickid = getChessFromRowCol(row, col); if (clickid != -1) { if (isSameColor(clickid, _selectid)) { _selectid = clickid; Vec2 pt = Plate2Screen(row, col); _selectSprite->setPosition(pt); //_selectSprite->setVisible(true); _selectSprite->setOpacity(255); return; } /*else { _c->at(clickid)->setVisible(false); _c->at(clickid)->_dead = true; }*/ } if (!canMove(_selectid, row, col, clickid)) { return; } recordStep(_selectid, clickid, _c->at(_selectid)->_row, _c->at(_selectid)->_col, row, col); if (clickid != -1) { _c->at(clickid)->setVisible(false); _c->at(clickid)->_dead = true; } _c->at(_selectid)->_row = row; _c->at(_selectid)->_col = col; //_c->at(_selectid)->setPosition(Plate2Screen(row, col)); _c->at(_selectid)->setZOrder(100); MoveTo* moveto = MoveTo::create(1.0f, Plate2Screen(row, col)); CallFuncN* callfuncN = CallFuncN::create(CC_CALLBACK_1(SceneGame::AfterMove,this, (void*)(intptr_t)clickid)); _c->at(_selectid)->runAction(CCSequence::createWithTwoActions(moveto, callfuncN)); FadeOut* fadeout = FadeOut::create(1.0f); MoveTo* SelectMoveto = MoveTo::create(1.0f, _c->at(_selectid)->fromPlate()); Spawn* spawn = Spawn::createWithTwoActions(fadeout, SelectMoveto); _selectSprite->runAction(spawn); _selectid = -1; //_selectSprite->setVisible(false); _bRedTurn = !_bRedTurn; /* if (!_bRedTurn) { //单步智能 Step* step = AI::getStep(this); Chess* moveChess = _c->at(step->moveid); moveChess->_row = step->rowTo; moveChess->_col = step->colTo; _bRedTurn = !_bRedTurn; moveChess->setPosition(moveChess->fromPlate()); if (step->killid != -1) { Chess* killChess = _c->at(step->killid); killChess->_dead = true; killChess->setVisible(false); } _steps->push_back(step); //多步智能 // scheduleOnce(schedule_selector(SceneGame::computerMove), 0.01f); //网络对战 } */ Step* step = *_steps->rbegin(); char buf[4]; buf[0] = 2; buf[1] = step->moveid; buf[2] = step->rowTo; buf[3] = step->colTo; NetBattle::Send(buf, 4); NetBattle::RecvStart(); schedule(schedule_selector(SceneGame::CheckRecv)); #endif Vec2 ptClicked = touch->getLocation(); int row, col; bool bClick = Screen2Plate(ptClicked, row, col); if (!bClick) { return; } int clickid = getChessFromRowCol(row, col); // 如果点击位置没有象棋,那么点击也无效 if (clickid != -1) { // 如果后一次点击的棋子和前一次相同,那么换选择 if (isSameColor(clickid, _selectid)) { _selectid = clickid; // 显示该棋子被选中的效果 Vec2 pt = Plate2Screen(row, col); _selectSprite->setPosition(pt); //_selectSprite->setVisible(true); _selectSprite->setOpacity(255); // 换选择之后,这次点击处理就结束了 return; } } // 判断棋子是否可以移动 if (!canMove(_selectid, row, col, clickid)) { return; } // 可以移动 // 记录移动信息 recordStep(_selectid, clickid, _c->at(_selectid)->_row, _c->at(_selectid)->_col, row, col); // 走棋相关 if (clickid != -1) { // 杀掉 //_s[clickid]->setVisible(false); _c->at(clickid)->_dead = true; } _c->at(_selectid)->_row = row; _c->at(_selectid)->_col = col; // _s[_selectid]->setPosition(Plate2Screen(row, col)); _c->at(_selectid)->setZOrder(100); MoveTo* moveto = MoveTo::create(1.0f, Plate2Screen(row, col)); CallFuncN* callfuncN = CallFuncN::create(CC_CALLBACK_1(SceneGame::AfterMove, this,(void*)(intptr_t)clickid)); _c->at(_selectid)->runAction(Sequence::createWithTwoActions(moveto, callfuncN)); FadeOut* fadeout = FadeOut::create(1.0f); MoveTo* SelectMoveto = MoveTo::create(1.0f, _c->at(_selectid)->fromPlate()); Spawn* spawn = CCSpawn::createWithTwoActions(fadeout, SelectMoveto); _selectSprite->runAction(spawn); _selectid = -1; //_selectSprite->setVisible(false); _bRedTurn = !_bRedTurn; // 发送移动棋子报文 Step* step = *_steps->rbegin(); char buf[4]; buf[0] = 2; buf[1] = step->moveid; buf[2] = step->rowTo; buf[3] = step->colTo; NetBattle::Send(buf, 4); // 接收信息 NetBattle::RecvStart(); schedule(schedule_selector(SceneGame::CheckRecv)); }
void SceneGame::CheckRecv(float) { if (NetBattle::isRecvComplete()) { unschedule(schedule_selector(SceneGame::CheckRecv)); int len; char* data = NetBattle::RecvData(len); if (data[0] == 4) { _bRedSide = !_bRedSide; restartInit(); } else if (data[0] == 3) { doRegret2(); NetBattle::RecvStart(); schedule(schedule_selector(SceneGame::CheckRecv)); } else if (data[0] == 1) { _selectid = data[1]; _selectSprite->setPosition(_c->at(_selectid)->fromPlate()); _selectSprite->setVisible(true); NetBattle::RecvStart(); schedule(schedule_selector(SceneGame::CheckRecv)); } else if (data[0] == 2) { Chess* s = _c->at(data[1]); int row = 9 - data[2]; int col = 8 - data[3]; int killid = getChessFromRowCol(row, col); recordStep(_selectid, killid, _c->at(_selectid)->_row, _c->at(_selectid)->_col, row, col); s->_row = row; s->_col = col; //s->setPosition(s->fromPlate()); MoveTo* moveto = MoveTo::create(1.0f, s->fromPlate()); // CCCallFuncN* callfuncN = CCCallFuncN::create(this, callfuncN_selector(SceneGame::setChessZOrder)); CallFuncN* callfuncN = CallFuncN::create(CC_CALLBACK_1(SceneGame::AfterMove,this,(void*)(intptr_t)killid)); s->runAction(Sequence::createWithTwoActions(moveto, callfuncN)); FadeOut* fadeout = FadeOut::create(1.0f); MoveTo* SelectMoveto = MoveTo::create(1.0f, s->fromPlate()); Spawn* spawn = Spawn::createWithTwoActions(fadeout, SelectMoveto); _selectSprite->runAction(spawn); if (killid != -1) { Chess* ks = _c->at(killid); ks->_dead = true; ks->setVisible(false); } _selectid = -1; _selectSprite->setVisible(false); _bRedTurn = !_bRedTurn; } } }
void GameStartLayer::moveStone(CCTouch *touch) { CCPoint ptClicked = touch->getLocation(); int row, col; bool bClick = Screen2Plate(ptClicked, row, col); //! 点击在棋子间的空隙点击无效 if (!bClick) { return; } int clickid = getStoneFromRowCol(row, col); if (clickid != -1) { //! 如果颜色相同,更换选中棋子 if (isSameColor(clickid, _selectid)) { _selectid = clickid; CCPoint pt = Plate2Screen(row, col); _selectedSprite->setPosition(pt); _selectedSprite->setVisible(true); return; } //else //{ // //! kill // _s[clickid]->setVisible(false); // _s[clickid]->_dead = true; //} } //! 判断是否可以移动棋子 if (!canMove(_selectid, row, col, clickid)) { return; } recordStep(_selectid, clickid, _s[_selectid]->_proper._row, _s[_selectid]->_proper._col, row, col); //! kill if (clickid != -1) { // 杀掉 _s[clickid]->setVisible(false); _s[clickid]->_dead = true; } //! 移动棋子 _s[_selectid]->_proper._row = row; _s[_selectid]->_proper._col = col; _s[_selectid]->setPosition(Plate2Screen(row, col)); //! 重置属性 _selectid = -1; //_selectedSprite->setVisible(false); _selectedSprite->setPosition(Plate2Screen(row, col)); _bRedTurn = !_bRedTurn; //! 智能移动 if (!_bRedTurn) { //CCDelayTime *delay = CCDelayTime::create(0.01f); //CCCallFunc *ai = CCCallFunc::create(this, callfunc_selector(GameStartLayer::computerMove)); //CCSequence *seq = CCSequence::create(delay, ai, nullptr); //this->runAction(seq); scheduleOnce(schedule_selector(GameStartLayer::computerMove), 0.01f); } }