卡片更新主要在update(float)中,主要用于对卡片的cd,是显示正常图片还是显示不可点击图片进行更新
代码如下
void Card::update(float dt)
{
m_fCurCD -= dt;
//cd已经完成
if (m_fCurCD <= 0.f)
{
m_fCurCD = 0.f;
auto sunNum = DynamicData::getInstance()->getSunNumber();
if (sunNum >= m_nWorth)
{
this->setEnabled(true);
}
else
{
this->setEnabled(false);
}
}
//设置percentage
float percentage = m_fCurCD/m_fCD * 100.f;
m_pCDTimer->setPercentage(percentage);
}
另外就是setEnabled()的实现,这个是继承自MenuItem的一个方法
代码如下
void Card::setEnabled(bool enabled)
{
MenuItem::setEnabled(enabled);
if (enabled)
{
m_pNormalSprite->setVisible(true);
}
else
{
m_pNormalSprite->setVisible(false);
m_pDisableSprite->setVisible(true);
}
}
然后就是点击,点击我是新建了一个TouchLayer负责向GameScene传递事件,这样做的好处就是便于暂停 和恢复,
代码如下
bool TouchLayer::init()
{
auto listener = EventListenerTouchOneByOne::create();
listener->onTouchBegan = SDL_CALLBACK_2(TouchLayer::onTouchBegan,this);
listener->onTouchMoved = SDL_CALLBACK_2(TouchLayer::onTouchMoved,this);
listener->onTouchEnded = SDL_CALLBACK_2(TouchLayer::onTouchEnded,this);
_eventDispatcher->addEventListener(listener,this);
return true;
}
void TouchLayer::setDelegate(TouchLayerDelegate* delegate)
{
m_pDelegate = delegate;
}
bool TouchLayer::onTouchBegan(Touch*touch,SDL_Event*event)
{
return m_pDelegate->onTouchBegan(touch,event);
}
void TouchLayer::onTouchMoved(Touch*touch,SDL_Event*event)
{
m_pDelegate->onTouchMoved(touch,event);
}
void TouchLayer::onTouchEnded(Touch*touch,SDL_Event*event)
{
m_pDelegate->onTouchEnded(touch,event);
}
在这里我使用的是委托。m_pDelegate是TouchLayerDelegate
class TouchLayerDelegate
{
public:
virtual ~TouchLayerDelegate(){}
virtual bool onTouchBegan(Touch*,SDL_Event*)=0;
virtual void onTouchMoved(Touch*touch,SDL_Event*event)=0;
virtual void onTouchEnded(Touch*touch,SDL_Event*event)=0;
};
然后在GameScene中实现对应的方法
然后就是卡片是否可点击
代码如下
bool GameScene::onTouchBegan(Touch*touch,SDL_Event*event)
{
auto pos = touch->getLocation();
//是否点击了卡片层
auto clickedCard = m_pCardLayer->getClickedCard(pos);
if (clickedCard && clickedCard->isEnabled())
{
auto selectedCard = m_pCardLayer->getSelectedCard();
//取消选中
if (clickedCard == selectedCard)
{
m_pCardLayer->unselectedCard();
}
else//重新设置选中
{
m_pCardLayer->setSelectedCard(clickedCard);
}
return true;
}
return false;
}
另外就是card在阳光增加或者减少时也会有一个更新
void GameScene::addSun(int num)
{
auto sun = DynamicData::getInstance()->getSunNumber();
DynamicData::getInstance()->setSunNumber(sun + num);
//进行卡片的更新
m_pCardLayer->updateSelf();
}
至于updateSelf方法,则是对卡片的刷新
void CardLayer::updateSelf()
{
this->update(0.f);
}
这个跟实现有关,就是对卡片的刷新,至于为什么添加方法updateSelf(),则是为了以后扩展使用。
截屏如下
另外就是以后的代码中可能会需要获取当前动画已经播放到第几帧了,详细请看
http://www.cnblogs.com/mmc1206x/p/3708786.html