近期做了几款棋牌类游戏,在游戏中遇到了一些特效的问题,网上也很少有案例和源代码摸索了很久才搞定,故在这里简单的介绍一下自己的心得,留给以后的自己和后人,个人原创,不喜勿喷,如果你觉得有问题,欢迎提出。
一. 扑克牌翻转特效。
意思就是我们看到的一张扑克牌从中间翻转,由扑克牌的背面转向正面。
首先我们去创建一张需要翻转的扑克牌:
Auto mycard = UICard::create(0xFF,1);
UICard是扑克牌空间,继承于Sprite,用16进制的数字来表示扑克牌的数字和颜色。
然后我们需要创建的是动作:
首先创建一个移动的动作:
Auto move = MoveTo::create(0.5f,Point(x,x));
再创建一个动作Sequence:
Sequence *seq = Sequence::create(DelayTime::create(0.3f),OrbitCamera::create (0.3f,1,0,0,-90,0,0),Hide::create(),CallFunN::create([=](Node*obj)
{
UICard::card = (UICard*)obj;
Card = updateCard(ox01);
Card->runAction(Sequence::create(Show::create(),OribitCamera::create (0.3f,1,0,90,-90,0,0),NULL));
}
),NULL);
auto ani = Sequence::create(move,seq,NULL);
mycard->runAction(ani);
解释:这个ani动作是先让扑克牌翻转90度,然后把扑克牌的数字更新,再让扑克牌转回来,就可以完成整个特效了。
二. 如何让扑克牌一张一张发牌,就如我们现实生活中的发牌一样,等到第一个人的整个发牌动作完成之后,再发第二个人的牌。刚开始的时候弄了不行,其实很简单,注意到是运用到一个动作结束回调函数CCCallFuncND,利用这个函数就可以达到这个效果,下面用简短的代码来描述一下:
Void main()
{
UICard* S_card[20];//定义一个数组
for(int i=0;i<20;i++)
{
S_card[i] = UICard::Create(oxFF,1);.
S_card[i]->setposition(Point(x,x));
}
dispathCardsCallback(NULL,(void*)0);
}
Void dispathCardsCallback(CCNode* pSende,(void*)args)
{
int num = (int )args;
float speed = 0.15;
num++;
if(num>20)
return;
switch(num%4)
{
Case 1:
{
Auto move = MoveTo::create(int ,Point);
Auto seq = Sequence::Create(move,CCCallFuncND::create(this,callfuncND_selector(dispathCardsCallback),(void*)num,NULL));
S_card[num]->runAction(seq);
}break;
Case 2:
{
Auto move = MoveTo::create(int ,Point);
Auto seq = Sequence::Create(move,CCCallFuncND::create(this,callfuncND_selector(dispathCardsCallback),(void*)num,NULL));
S_card[num]->runAction(seq);
}break;
Case 3:
{
Auto move = MoveTo::create(int ,Point);
Auto seq = Sequence::Create(move,CCCallFuncND::create(this,callfuncND_selector(dispathCardsCallback),(void*)num,NULL));
S_card[num]->runAction(seq);
}break;
Case 4:
{
Auto move = MoveTo::create(int ,Point);
Auto seq = Sequence::Create(move,CCCallFuncND::create(this,callfuncND_selector(dispathCardsCallback),(void*)num,NULL));
S_card[num]->runAction(seq);
}break;
}
}
这个例子是针对4人牛牛来的,对于不同的项目要做出相应的修改,不可直接照抄,这里提供的只是方法和原理。利用回调函数和迭代完成整个发牌效果。
三. 圆形进度条
对于长条形的进度条见到的特别多,实现起来也很容易,在cocostdios上就可以直接造一个出来,可是圆环状的进度条就不行了,下面就简单的介绍一下:
m_progress = ProgressTimer::create(Sprite::create(“”));
m_progress->setpositon(point);
m_progress->setPercentage(0);//这里是设置初始进度
m_progress->setType(ProgressTmer::Type::RADIAL);//设置圆形类型
m_progress->setMidPoint(vec2::ANCHOR_MIDDLE);
m_progress->setReverseProgress(false);
m_progress->runAction(ProgressTo::create(30,100));//参数:时间,进度
this->addChild(m_progress);
这样就完成了圆环状的进度条,可以是减少也可以是增加的,这个原理和扇形进度条的原理是一样的,不同的是一个是圆环状的图片另一个可能是圆形的图片而已。
lua还有一个写法:
local left = cc.ProgressTimer:create(cc.Sprite:create("bg/jishikuang.png"))
left:setType(cc.PROGRESS_TIMER_TYPE_RADIAL)
-- 设置显示位置
left:setPosition(cc.p(99/2, 101/2))
local to1 = cc.ProgressFromTo:create(ft, 100,0)
-- 运行动作
left:runAction(cc.Repeat:create(to1,1))
left:setReverseDirection(false)
-- 添加到层当中
self.Image_kuang:addChild(left)