cocos2d-x 3.3 之卡牌设计 NO.4 定时器的使用(清理内存)
来源:互联网 发布:安全座椅选择 知乎 编辑:程序博客网 时间:2024/05/21 10:54
我的卡牌游戏卡牌有两个类,分别是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,便于清理。
2 0
- cocos2d-x 3.3 之卡牌设计 NO.4 定时器的使用(清理内存)
- cocos2d-x 3.3 之卡牌设计 NO.6 Loading界面(异步加载图片,plist)
- cocos2d-x 3.3 之卡牌设计 NO.1 点击选取卡牌
- cocos2d-x 3.3 之卡牌设计 NO.2 卡牌翻转
- cocos2d-x 3.3 之卡牌设计 NO.3 卡牌移动
- cocos2d-x 3.3 之卡牌设计 NO.5 设置界面(透明层和屏蔽下层触控)
- cocos2d-x之三种定时器的使用
- cocos2d-x 3.3 之黑白棋设计 NO.1 初步设计
- cocos2d-x 3.3 之黑白棋设计 NO.2 搜索
- cocos2d-x 3.3 之黑白棋设计 NO.5 AI
- cocos2d-x定时器设计的一些想法
- cocos2d-x 3.3 之黑白棋设计 NO.4 动画效果
- cocos2d-x之定时器的设置
- cocos2d-x中定时器的使用
- Cocos2D-X定时器selector的使用
- Cocos2D-X@定时器selector的使用(…
- cocos2d-x的定时器
- Cocos2d-x lua 使用定时器
- iOS网络监测如何区分2、3、4G?
- 国生教育:创新自考备考方案 享受自考备考乐趣
- 23种设计模式全解析
- Flex读取XML文件的两种方法
- CAS协议
- cocos2d-x 3.3 之卡牌设计 NO.4 定时器的使用(清理内存)
- IOS开发---视频录制
- fastjson解析中的javaBean
- 日志、Toast、网络、像素单位转换、屏幕、App相关、键盘、文件上传下载、加密、时间等工具类
- 在Flex中用Validator检测数字、字符串、Email、电话号码等 .
- android paint 研究总结
- squid介绍
- 记录自己做的一个简单的局域网聊天程序
- Linux之crontab定时任务