上次向大家介绍了底层的地图逻辑,这次来看看视觉层面,也就是地图图片的绘制。
大型地图肯定不能一次绘制,我的方法是运用缓存然后绘制出“看得到”的地图部分。
· 地图分为很多张屏幕大小的图片,在我这里是1000*500,每次只需要绘制四张图片必然能包括屏幕的所有范围,如图:
中间的黑色线框为屏幕,黑白色的方块为地图图片
下面是具体实现:
#ifndef _VISION_MAP_H_
#define _VISION_MAP_H_
#include"GlobalEntity.h"
#include"NullSprite.h"
#include"Hero.h"
using namespace cocos2d;
#define MAX_VISION_LAND 10
#define MAX_VISION_PLANTS 10
#define MAP_Z_ORDER 0
#define LAND_Z_ORDER 10
#define CONTROLLER_Z_ORDER 100
#define VISION_FPS 40
//from 0 to 401 are entities' Z-ORDERs
typedef std::function<void()> VisionMapCB;//回调函数对象
class VisionMap:public Layer
{
public:
VisionMap();
~VisionMap();
virtual bool init();
CREATE_FUNC(VisionMap);
void handleMessage();
virtual bool setCache();
bool drawMap();
void clearCache();
void scheduleFunc(float fl);
void getVisionLand();
void getVisionPlant();
protected:
static Point _lastHeroPosition;
private:
Sprite* _displayedMap[4];
Vector<Sprite*> _displayedLand;
Vector<Sprite*> _displayedPlant;
bool _firstDraw;
Hero* _hero;
};
#endif
· 消息处理器和init里的初始化暂且不表,先看加载缓存:
bool VisionMap::setCache()
{
//normal map Img
for (int i = 0; i < 4; i++)
{
Texture2D* texture = Director::getInstan