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


    我的卡牌游戏卡牌有两个类。各自是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。便于清理。





  • 相关阅读:
    js事件委托篇(附js一般写法和js、jq事件委托写法)
    markdown工作随笔总结
    论实际开发中按钮显示和隐藏自身或其他元素
    彻底理解行内元素和块级元素,不必硬背
    redis搭建主从配置
    [Python图像处理]三.获取图像属性及通道处理
    [Python图像处理]二 OpenCV借助Numpy库读取和修改像素
    [Python图像处理]一.图像处理基础知识及OpenCV入门函数
    opencv2图像处理--灰度变换
    提取新闻网站信息
  • 原文地址:https://www.cnblogs.com/lytwajue/p/6894123.html
Copyright © 2020-2023  润新知