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

cocos2d-x 3.3 之卡牌设计 NO.3 卡牌移动,第1张

概述上次说了如何播放卡牌翻转的动画,卡牌翻到正面后,就需要让玩家将卡牌拖拽至出场区域或者墓地区域了。 这里重复一下之前的内容: 1.重载触控函数: virtual bool onTouchBegan(Touch* touch, Event* event); virtual void onTouchMoved(Touch* touch, Event* event); virtual void on

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

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

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);//卡牌@R_419_6975@移动时的信息			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;}

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

总结

以上是内存溢出为你收集整理的cocos2d-x 3.3 之卡牌设计 NO.3 卡牌移动全部内容,希望文章能够帮你解决cocos2d-x 3.3 之卡牌设计 NO.3 卡牌移动所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1058206.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存