上次说了如何播放卡牌翻转的动画,卡牌翻到正面后,就需要让玩家将卡牌拖拽至出场区域或者墓地区域了。
这里重复一下之前的内容:
1.重载触控函数:
virtual bool onTouchBegan(Touch* touch,Event* event); virtual void onTouchMoved(Touch* touch,Event* event); virtual void onTouchEnded(Touch* touch,Event* event);
2.在init里添加:
//-------------------------------------------------------------添加鼠标监听 listener->setSwallowTouches(true);//保证同时只能触摸到一个精灵 listener->onTouchBegan = CC_CALLBACK_2(Game::onTouchBegan,this); listener->onTouchMoved = CC_CALLBACK_2(Game::onTouchMoved,this); listener->onTouchEnded = CC_CALLBACK_2(Game::onTouchEnded,this); _eventDispatcher->addEventListenerWithSceneGraPHPriority(listener,this);
好了,现在开始实现移动卡牌的功能:
1.假设我们已经选取了翻转过的卡牌(未翻转前的卡牌不能移动):
bool Game::onTouchBegan(Touch* touch,Event* event) { Point touchpoint=touch->getLocation(); this->selectSpriteForTouch(touchpoint); return true; }
void Game::selectSpriteForTouch(Point touchpoint) { Player* player;//比上次多了玩家的指针,因为一局游戏有两个玩家,每个玩家都有自己的卡牌 if(who_turn==1) { player=player_1; } else { player=player_2; } int x,y; x=(int)touchpoint.x; y=(int)touchpoint.y; for (OpenCard *sprite: player->openSprites)//在容器中遍历卡牌精灵 { if (sprite->card_isTouched(x,y) && sprite->isOpend==0 && (player->player_magic_now>=sprite->need_magic))//如果点击的区域存在精灵&这个精灵没有被翻开过 { CCLOG("open a card"); isTouchCard=1; sprite->card_set_openCard(); player->player_magic_now-=sprite->need_magic; print_players_message(); sprite->isOpend=1; Open_sel = sprite; break; } else if(sprite->card_isTouched(x,y) && sprite->isOpend==1 && sprite->touchable==1)//这里是这次的重点,移动卡牌 { isTouchMove=1;//翻转后就可以移动 sprite->card_show_message(true);//移动的时候显示卡牌的信息 sprite->card_setsize_big(2);//移动的时候卡牌变大2 sprite->setZOrder(100);//覆盖其他精灵 Open_sel=sprite;//操作的精灵指针指向这个精灵 break; } } }
2.现在是移动卡牌:
void Game::onTouchMoved(Touch* touch,Event* event) { if(isTouchMove==1 && Open_sel->touchable==1) { int x,y; x=(int)touch->getLocation().x; y=(int)touch->getLocation().y; Open_sel->card_set_position(x,y); } }这样就能实现卡牌跟随触摸点移动了。
3.但是游戏不能只做到上面两步,当我们把卡牌移动到不同地方的时候卡牌需要做不同的动作,我分成了3个部分
1)移动到非法位置,卡牌自动回到手牌
2)移动到出牌区域,卡牌自动对准位置
void Game::onTouchEnded(Touch* touch,Event* event) { Player* player; if(who_turn==1) { player=player_1; } else { player=player_2; } int locate_try=0; if(isTouchMove==1) { if(((locate_try=Open_sel->card_judge_is_out())!=0) && had_card(locate_try,Open_sel->card_type))//如果卡牌移动到了出牌区域 { Open_sel->card_home_to_out(locate_try);//卡牌移动到尝试区域 Open_sel->card_loc_num=locate_try;//卡牌位置编号等于尝试的区域编号 Open_sel->card_setsize_small();//卡牌恢复大小 Open_sel->card_show_message(false);//卡牌不显示移动时的信息 auto playcard=CardSprite::create(Open_sel->card_loc_num,Open_sel->card_num);//创建游戏卡牌精灵(与之前播放动画的卡牌精灵不同) Point point=playcard->card_get_locate(Open_sel->card_loc_num); CCLOG("create a cardsprite in %f,%f",point.x,point.y); playcard->setPosition(point); playcard->setGlobalZOrder(0); this->addChild(playcard); player->cardSprite.pushBack(playcard); } else if(Open_sel->card_home_to_die())//如果移动到了墓地 { player->player_magic_now+=Open_sel->need_magic/2;//玩家恢复一般翻开这张卡牌的魔法 print_players_message(); Open_sel->card_setsize_small(); Open_sel->card_show_message(false); } else { Open_sel->card_setsize_small(); Open_sel->card_show_message(false); Open_sel->setZOrder(0); Open_sel->card_go_home();//卡牌回手牌 } } Open_sel = NULL; isTouchCard=0; isTouchMove=0; }
这里和之前的有重复,就不做阐述了
原文链接:https://www.f2er.com/cocos2dx/343003.html