Map类改变的最少,直接贴代码了
Map.h
// // Map.h // Fight // // Created by Cytzrs on 15/2/3. // // #ifndef __Fight__Map__ #define __Fight__Map__ #include <iostream> #include "cocos2d.h" USING_NS_CC; class IMap:public Node { public: IMap(); ~IMap(); //初始化地图,window_sizeo为控制台大小 void InitMap(const char *map_name,const Size &window_size); //根据精灵的位置移动地图,visibleSize为当前窗口的大小 void MoveMap(Node *hero,Size visibleSize); //判断地图是否到达边缘 bool JudgeMap(Node *hero,Size visibleSize); //virtual void update(float delta); CREATE_FUNC(IMap); private: Sprite *m_map;//地图精灵 }; #endif /* defined(__Fight__Map__) */Map.cpp
// // Map.cpp // Fight // // Created by Cytzrs on 15/2/3. // // #include "Map.h" IMap::IMap():m_map(NULL) { } IMap::~IMap() { } void IMap::InitMap(const char *map_name,const Size &window_size) { this->m_map=Sprite::create(map_name); m_map->setAnchorPoint(Vec2(0,0));//设置锚点 this->setAnchorPoint(Vec2(0,0));//设置锚点 this->addChild(m_map); } void IMap::MoveMap(Node *hero,Size visibleSize)// { if(hero->getPositionX()==visibleSize.width/2)//精灵运动到中间,地图才移动 { if(this->getPositionX()!=-(m_map->getContentSize().width-visibleSize.width))//防止地图左边运动后超出边缘 this->setPosition(this->getPositionX()-1,this->getPositionY()); } } bool IMap::JudgeMap(Node *hero,Size visibleSize) { if(this->getPositionX()!=-(m_map->getContentSize().width-visibleSize.width))//防止地图左边运动后超出边缘 return false; else //地图已经移动到达边缘 return true; }
最后,当然我们需要在Scene中添加IMap对象,然后再update中检测hero和map的的位置关系,以决定是hero移动呢还是map移动,
从而实现地图无限滚动的效果。
mymap=IMap::create(); mymap->InitMap("12.png",visibleSize); this->addChild(mymap,0);将update修改为:
void HelloWorld::update(float delta) { Size visibleSize1 = Director::getInstance()->getVisibleSize(); //判断是否按下摇杆及其类型 switch(rocker->rocketDirection) { case 1: //hero->SetAnimation("attack1_animation.plist","attack1_animation.png","attack_",6,rocker->rocketRun); hero->SetAnimation("run_animation.plist","run_animation.png","run_",8,rocker->rocketRun);//"run_"为run_animation.png集合图片中每张图片的公共名称部分 if(hero->getPositionX()<=visibleSize1.width-8)//不让精灵超出右边,8可以改成你喜欢的 { if(!hero->JudgePositona(visibleSize1)||mymap->JudgeMap(hero,visibleSize1))//精灵没到达窗口中间位置或者地图已经移动到边缘了,精灵才可以移动,否则只播放动画 hero->setPosition(Vec2(hero->getPosition().x+1,hero->getPosition().y)); //向右走 //下面是移动地图 mymap->MoveMap(hero,visibleSize1); } break; case 2: hero->SetAnimation("run_animation.plist",rocker->rocketRun);//"run_"为run_animation.png集合图片中每张图片的公共名称部分 hero->setPosition(Vec2(hero->getPosition().x,hero->getPosition().y+1)); //向上走 break; case 3: hero->SetAnimation("run_animation.plist",rocker->rocketRun);//"run_"为run_animation.png集合图片中每张图片的公共名称部分 if(hero->getPositionX()>=8)//不让精灵超出左边,8可以改成你喜欢的 hero->setPosition(Vec2(hero->getPosition().x-1,hero->getPosition().y)); //向左走 break; case 4: hero->SetAnimation("run_animation.plist",hero->getPosition().y-1)); //向下走 break; case 0: hero->StopAnimation();//停止所有动画和运动 break; } if(attackBtn->isHighlighted()) { hero->AttackAnimation("attack1_animation.plist",rocker->rocketRun); log("-------------------_____________"); } }