这次实现容器类的植物,即睡莲和花盆
不过在写之前,需要重写下以前的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();
}
}
本节是为了下一节的容器植物作的小小改变。