一、前言
至此,我们的战斗场景关于角色移动已经讲得七七八八了。不过还是有一些问题需要注意注意。
二、正文
在第五节里面我们讲了FlightLayer里面有一个很重要的容器m_rolesArray,并且说道其初始化是由以下两个函数负责的。
void FlightLayer::initTeam(const HeroMessage& h1,const HeroMessage& h2,const HeroMessage& h3){ Hero* hero1 = Hero::create(h1.r_name,this); hero1->setPosition(-100,380); hero1->setDesPoint(Point(200,380)); hero1->initWithMessage(h1); this->addRole(hero1); Hero* hero2 = Hero::create(h2.r_name,this); hero2->setPosition(-100,260); hero2->setDesPoint(Point(400,260)); hero2->initWithMessage(h2); this->addRole(hero2); Hero* hero3 = Hero::create(h3.r_name,this); hero3->setPosition(-100,140); hero3->setDesPoint(Point(200,140)); hero3->initWithMessage(h3); this->addRole(hero3); } void FlightLayer::initMonsterDeq(deque<MonsterMessage> deq){ this->m_monsterDeq = deq; }
仔细看这两个函数,发现出现了两个新东西 Hero类和m_monsterDeq
其实Hero类就是Role的派生类,Monster也是Role的派生类。在将真正战斗的时候(而不是单单的行走),我们还会讲二者的区别。
假如你上一节已经能够成功地实现角色的控制移动,那么可能你会发现有一个很严重的问题,就是Role的Z轴次序并不会改变,导致越后addChild的Role越在上面。这很明显是不符合我们的要求的。我们的要求是根据Role的y坐标来判断谁在前谁在后。一般y坐标小的层次应该越高,以遮挡y坐标大的。
所以我们还需要作如下修改:
思路,在update函数里面判断m_rolesArray里面的每个role的y值,并且排好序,并且更新他们的z轴次序
void FlightLayer::refreshLocalZOrder(){; int max_z_order = m_rolesArray.size(); if(max_z_order <= 1){ return; } //sort(m_rolesArray.begin(),m_rolesArray.end(),bind(&FlightLayer::comparePosY,this,std::placeholders::_1,std::placeholders::_2)); m_rolesArray.sort(bind(&FlightLayer::comparePosY,std::placeholders::_2)); for(auto it = m_rolesArray.begin();it!=m_rolesArray.end();it++){ (**it)->setLocalZOrder(max_z_order--); } }
comparePosY是一个比较的谓词(不懂std::list.sort的可以百度)
bool FlightLayer::comparePosY(Role_Ptr a,Role_Ptr b){ return ((*a)->getPositionY() < (*b)->getPositionY()); }
这样子,我们的z轴次序就可以根据role的y坐标的改变而改变。达到我们的要求。
这节内容比较少,主要是交代完善好FlightLayer。
我的csdn地址:http://blog.csdn.net/hezijian22
邮箱地址:578690286@qq.com
如有问题或指教,欢迎与我交流,谢谢。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。