您的位置:首页 > 移动开发 > Cocos引擎

cocos2dx 植物大战僵尸 8 植物类和向日葵的小更新

2017-05-28 22:20 856 查看
这次实现容器类的植物,即睡莲和花盆

不过在写之前,需要重写下以前的Plant代码。

/*植物类型*/
enum class PlantType
{
Common,//普通类植物
Vessel,//容器类植物
};
这个是植物类型,目前仅仅有一般性植物和容器类植物,以后也可能会再添加

然后在Plant添加属性m_plantType,表示当前的植物类型,和m_pVesselPlant,这个是为了跟随睡莲运动添加的属性

virtual void update(float dt);
//每次更新都会调用的钩子函数
virtual void updateHook(float dt) = 0;

void setVesselPlant(Plant*plant);
接着就是update的实现有所改变了

void Plant::update(float dt)
{
updateHook(dt);
//跟随容器植物运动
if (m_pVesselPlant)
{
auto pos = m_pVesselPlant->getPosition();
auto size = m_pVesselPlant->getContentSize();

this->setPosition(pos + Point(0,-size.height/2));
}
}


看上面的代码,是所有植物通用的方法,如果植物有特定的需求的话,调用updateHook()即可

然后需要改变向日葵和双生向日葵的代码

void SunFlower::updateHook(float dt)
{
//负责绘图的更新
//当前处于正常状态
if (m_curState == State::Normal)
{
m_elapsed += dt;
//切换状态
if (m_elapsed >= this->getColdDownTime() - m_produceSunDuration)
{
m_curState = State::ProducingSun;
//改变内部精灵位置
auto pos = m_pSprite->getPosition();
auto size = this->getContentSize();

m_pSprite->setPosition(pos - Point(0.f,size.height));
}
}
else if (m_curState == State::ProducingSun)
{
m_elapsed += dt;
//恢复正常状态
if (m_elapsed >= this->getColdDownTime())
{
m_elapsed = 0.f;

m_curState = State::Normal;
//改变内部精灵位置
auto pos = m_pSprite->getPosition();
auto size = this->getContentSize();

m_pSprite->setPosition(pos + Point(0.f,size.height));
//生产阳光这个是虚函数
this->productSun();
}
}
}


在向日葵和双生向日葵中的updateHook中,用于绘图的更新和技能的释放

void TwinSunflower::productSun()
{
//调用两次
for (auto i = 0;i < 2;i++)
{
SunFlower::productSun();
}
}
本节是为了下一节的容器植物作的小小改变。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: