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。便于清理。
cocos2d-x 3.3 之卡牌设计 NO.4 定时器的使用(清理内存)的更多相关文章
- 在WebGL场景中管理多个卡牌对象的实验
这篇文章讨论如何在基于Babylon.js的WebGL场景中,实现多个简单卡牌类对象的显示.选择.分组.排序,同时建立一套实用的3D场景代码框架.由于作者美工能力有限,所以示例场景视觉效果可能欠佳,本 ...
- [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计
源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...
- 使用UIKit制作卡牌游戏(三)ios游戏篇
译者: Lao Jiang | 原文作者: Matthijs Hollemans写于2012/07/13 转自朋友Tommy 的翻译,自己只翻译了这第三篇教程. 原文地址: http://www.ra ...
- cocos2d-x 卡牌翻牌效果的实现
转自:http://blog.csdn.net/yanghuiliu/article/details/9115833 这个能实现翻牌的action就是CCOrbitCamera. static CCO ...
- TCG卡牌游戏研究:《炉石战记:魔兽英雄传》所做的改变
转自:http://www.gameres.com/665306.html TCG演进史 说到卡牌游戏,大家会联想到什么呢? 是历史悠久的扑克牌.风靡全球的<MTG 魔法风云会>与< ...
- [JLOI2013]卡牌游戏 概率DP
[JLOI2013]卡牌游戏 概率DP 题面 \(dfs\)复杂度爆炸,考虑DP.发现决策时,我们只用关心当前玩家是从庄家数第几个玩家与当前抽到的牌是啥.于是设计状态\(f[i][j]\)表示有\(i ...
- 「Unity卡牌自走棋」项目NABCD分析
项目 内容 这个作业属于哪个课程 2021学年春季软件工程(罗杰 任健) 这个作业的要求在哪里 团队项目-初次邂逅,需求分析 在这个课程的目标是 锻炼在大规模开发中的团队协作能力 这个作业在哪个具体方 ...
- BZOJ 4205: 卡牌配对
4205: 卡牌配对 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 173 Solved: 76[Submit][Status][Discuss] ...
- CCOrbitCamera卡牌翻转效果
static CCOrbitCamera* create(float t, float radius, float deltaRadius, float angleZ, float deltaAngl ...
随机推荐
- hibernate cascade属性
cascade属性是存在于set标签中,用来做级联删除和保存. 它的值有以下几种: 1)默认值是none,不做级联动作: 2)save-update:级联保存 3)delete:级联删除 4)all: ...
- CREATE TRIGGER - 定义一个新的触发器
SYNOPSIS CREATE TRIGGER name { BEFORE | AFTER } { event [ OR ... ] } ON table [ FOR [ EACH ] { ROW | ...
- 最后一个非零数字(POJ 1604、POJ 1150、POJ 3406)
POJ中有些问题给出了一个长数字序列(即序列中的数字非常多),这个长数字序列的生成有一定的规律,要求求出这个长数字序列中某个位上的数字是多少.这种问题通过分析,找出规律就容易解决. 例如,N!是一个非 ...
- Python机器学习——Agglomerative层次聚类
层次聚类(hierarchical clustering)可在不同层次上对数据集进行划分,形成树状的聚类结构.AggregativeClustering是一种常用的层次聚类算法. 其原理是:最初将 ...
- MFC模拟鼠标点击
MFC 工程 把以下代码放到你想要响应的函数里面就行 CPoint pt; GetCursorPos(&pt);//获取鼠标在屏幕的当前位置 SetCursorPos(100,200);//移 ...
- C语言的移位操作符及位运算
C语言的移位操作符 位移位运算符是将数据看成二进制数,对其进行向左或向右移动若干位的运算.位移位运算符分为左移和右移两种,均为双目运算符.第一运算对象是移位对象,第二个运算对象是所移的二进制位数. 位 ...
- UVa Sculpture(离散化 floodfill)
题意: 给定n个立方体的一个顶点坐标和3边长度, 问这些立方体组成的雕塑的表面积和体积, 坐标都是整数,n最大为50, 最大为500, 边长最大也是500. 分析: 继UVa221后又一道离散 ...
- Qt笔记——连接第三方库&用libZPlay库获取音频文件的艺术家、专辑等信息
连接第三方库libZPlay 概述 需要.a/.lib ,.h , .dll 三个文件 官网下载 http://libzplay.sourceforge.net/ import .h 链接 .a 放入 ...
- jQuery_计算器实例
知识点: fadeIn()---计算器界面载入淡入效果 hover()---鼠标移入移出某个元素时触发的事件 click()---鼠标单击事件 css()---对元素样式的操作 val()---获取表 ...
- 数据库 SQL SQL转义
SQL转义 @author ixenos 前言 类似文件分隔符在不同系统的实现不同,我们需要一个中间的转义字符来作为接口,各厂商再具体实现 而SQL的转义语法主要为了支持各种数据库普遍支持的特性,但各 ...