cocos2d-x 3.3 之卡牌设计 NO.4 定时器的使用(清理内存)

cocos2d-x 3.3 之卡牌设计 NO.4 定时器的使用(清理内存),第1张

概述我的卡牌游戏卡牌有两个类,分别是OpenCard和CardSprite。 不知道分成两个是不是有些奇怪,我分开的原因是:一个卡牌用来当手牌,一个用来当场上的牌,这样说是不是更加奇怪了。。 玩家类里定义了两个容器,分别存放两种卡牌类: Vector<CardSprite *> cardSprite;//卡牌精灵容器Vector<OpenCard *> openSprites;//翻转卡牌精灵容器

我的卡牌游戏卡牌有两个类,分别是OpenCard和CardSprite。

不知道分成两个是不是有些奇怪,我分开的原因是:一个卡牌用来当手牌,一个用来当场上的牌,这样说是不是更加奇怪了。。


玩家类里定义了两个容器,分别存放两种卡牌类:

Vector<CardSprite *> cardSprite;//卡牌精灵容器Vector<OpenCard *> openSprites;//翻转卡牌精灵容器

游戏开始:

1.调用函数player_1->player_deal_cards()给玩家一发牌,现在看看函数:

voID Player::player_deal_cards(){	if(player_num==1)	{		    for(int i =1; i <= 5; ++i)		   {				OpenCard* card = OpenCard::create(i,1);				cclOG("PLAYER---------------Opencard <%d>'s rc is <%d>",i,card->getReferenceCount());			    this->addChild(card);			   openSprites.pushBack(card);			}	}	else	{			for(int i =11; i <= 15; ++i)		   {				OpenCard* card = OpenCard::create(i,1);			    this->addChild(card);			   openSprites.pushBack(card);			}	}	cclOG("PLAYER---------------end deal cards");}

其实就是create一个opencard和压进vector(发牌动画在create的时候播放,这是分成两个的原因之一)

2.当玩家将opencard拖拽到场上的时候(并且有效):

		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("GAME---create a cardsprite in <%d>,<%d>",(int)point.x,(int)point.y);			playcard->setposition(point);			player->cardSprite.pushBack(playcard);			this->addChild(playcard);		}
会create一个cardsprite,并压入vector。


好了,以上都是题外话,现在开始正题:

当一个玩家结束回合的时候,手上的卡牌,场上的Opencard和被拖拽到墓地的卡牌就没用了,我们需要移除它,当然可以马上remove掉,但是这样会严重影响游戏体验,所以我们得等卡牌消失动画播放完毕之后再在内存中清除它。

现在我会的方法有两个:

1.在动画播放完毕后使用CallFunc调用清除函数,但是我的卡牌是存在容器里的,所以没有去考虑用这个方法(之后说到攻击特效再用这个方法)

2.每次结束回合都在规定时间内清理opensprite容器,和已经死亡的cardsprite。


我来说说第二个方法:

卡牌消失动画大概需要0.4秒,所以定时器将在每次玩家回合结束后0.5内清除opensprite容器

//-计时器		scheduleOnce(schedule_selector(Game::Delete_rubbish),0.5);//清除垃圾
这是一次性计时器,顾名思义,就是只使用一次的,每次调用它,它都会在0.5秒后执行Delet函数,然后就失效了
voID Game::Delete_rubbish(float t){	player_1->Delete_cards();	player_2->Delete_cards();	cclOG("GAME---rubbish is deleted");	test_num_vector_OpenCards();	return;}
voID Player::Delete_cards(){	int a=0;	int size;	//--翻转卡牌	if(opencards_should_del)//是否需要删除	{		openSprites.clear();	}		//--游戏卡牌	a=0;	size=cardSprite.size();	for(int i=0;i<size;i++)	{		CardSprite * sprite=cardSprite.at(i);		if(sprite->locate_num==101010)		{			cardSprite.eraSEObject(sprite);			a++;			i=0;			size-=1;		}	}	//cclOG("PLAYER---------------cardsprite has <%d> cards and Delet <%d> cards",size,a);}
opencard都是成堆出现的,如果需要删除那么直接把容器clear了就行,但是cardSprite只有在死亡的时候才需要清除,我把死亡的cardSprite的num都设为101010,便于清理。 总结

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

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

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存