象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个视图坐标~
这样就实现了多卷轴视差效果~

posted on 2009-05-20 17:51 icecoldmoon 阅读(1620) 评论(1)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理