cocos2d-x 3.3 之卡牌设计 NO.3 卡牌移动

上次说了如何播放卡牌翻转的动画,卡牌翻到正面后,就需要让玩家将卡牌拖拽至出场区域或者墓地区域了。

这里重复一下之前的内容:

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)移动到出牌区域,卡牌自动对准位置

3)移动到墓地,卡牌自动对准位置,并关闭卡牌

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;
}

这里和之前的有重复,就不做阐述了



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值