象DNF~冒险岛等地图他们都有很多层的地图层并且移动速度不同~那么是如何实现的呢?下面我给大家讲解一下具体实现原理,我做的是一个地图编辑器,不过原理是一样的
首先我们应该知道我们的这个游戏有几层我们先创建一个枚举类型
enum MAPTYPE
{
ForeGround ,//前景层
Ground,//地图层
BackGround,//背景层
FundusGround,//背景最后层
};
然后创建一个基类我们这里就叫做CMap
class CMap
{
public:
CMap(float _x,float _y,const int _ID,bool _bCheck = true);
virtual ~CMap();
void GameLogic(float _dt);//游戏主逻辑函数
void GameRender(); //游戏主渲染函数
void GameInit(); //游戏初始化函数
void GameReleaser(); //游戏释放函数
virtual bool CheckActive()= 0; //子对象碰撞检测
virtual bool ShowActive() = 0; //子对象是否显示
virtual void Logic(float _dt) = 0; //子对象逻辑
virtual void Render() = 0; //子对象渲染
STRMAP StrMap; //地图属性
protected:
int ID;
float PosX,PosY; //对象位置
static HGE* g_pHGE; //HGE指针
int Width,Height; //对象宽和高度
static float StrWidth,StrHeight; //当前卷动宽度
static float ForeWidth,ForeHeight; //前景层卷动宽和高度
static float FundusWidth,FundusHeight;//最后一层背景卷动宽度和高度
static float BackWidth,BackHeight;//背景卷动宽度和高度
static float Speed;//卷动速度
};
从这里我们可以看到有3个卷动坐标,我们可以认为有3个视图窗口,
可以看图理解
我们可以通过CMap的派生类来创建地图对象然后通过一个链表来管理这些对象
但是虽然我们有3个视图但是我们要统一他们的坐标~也就是我们最后看到的屏幕左上的坐标,当然也许你创建的地图有2级缓存~有可能左上并不是0,0点。自已定义了;
我们在派生类里可以定义一个变量float x,float y;来存放这个对象的左上角坐标;
通过枚举在我们创建这个地图对象的时候给它赋值不同的视图坐标~就是我们先前定义的那3个视图坐标~
这样就实现了多卷轴视差效果~