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","run_animation.png","run_",8,rocker->rocketRun);//"run_"为run_animation.png集合图片中每张图片的公共名称部分
hero->setPosition(Vec2(hero->getPosition().x, hero->getPosition().y+1)); //向上走
break;
case 3:
hero->SetAnimation("run_animation.plist","run_animation.png","run_",8,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","run_animation.png","run_",8,rocker->rocketRun);//"run_"为run_animation.png集合图片中每张图片的公共名称部分
hero->setPosition(Vec2(hero->getPosition().x,hero->getPosition().y-1)); //向下走
break;
case 0:
hero->StopAnimation();//停止所有动画和运动
break;
}
if(attackBtn->isHighlighted())
{
hero->AttackAnimation("attack1_animation.plist","attack1_animation.png","attack_",6,rocker->rocketRun);
log("-------------------_____________");
}
}