45度斜三通:斜45度游戏开发(一)



注:写十分粗糙如果看不懂请对照KgameV1.0源代码浏览

  最好游戏末过于RPG游戏了但如果赢得大众好评那么必须要采用(甚至说现在是种标准)斜45度地图、人物游戏引擎下面我们分别展开分析

.地图数据结构

Soft圣剑英雄传 2定义就不错可以参考它
定义地图结构以前我们要先定义Tile结构分两种情况

(1).物品、景物等按NPC处理(不规则处理如“魔力宝贝”):
typedef struct{
    bool IsGround;//是否显示地表
     GroundPicNum; //地表图片页面编号(0~59),,,(0-55)页为静态(56~59)页为动态
     GroundPicX;   //地表材料在地表图片上横坐标(以格子为坐标)
     GroundPicY;   //地表材料在地表图片上纵坐标(以格子为坐标)
     Block;         //阻碍标志(ID_BLOCK_T,ID_BLOCK_F)
     Hook;     //陷阱标志(ID_HOOK_F,ID_HOOK_T …………)
    char HookscriptName[28];
    char Reserve;        //保留位(我估计我们肯定还有想不到些信息以后可以在这里添加以免地图编辑完成的后再修改cell结构时可避免重新编辑地图文件)
}stCell;

具体我也不说什么了注释都很清楚!

(2).物品、景物也按Tile处理但NPC按不规则处理(如:“仙剑奇侠转”,强烈不推荐!)
typedef struct{
    bool IsGround;//是否显示地表
     GroundPicNum; //地表图片页面编号(0~59),,,(0-55)页为静态(56~59)页为动态
     GroundPicX;   //地表材料在地表图片上横坐标(以格子为坐标)
     GroundPicY;   //地表材料在地表图片上纵坐标(以格子为坐标)
    bool IsObject1;//是否显示物品1
     Object1PicNum;     //地表图片页面编号(0~59),,,(0-55)页为静态(56~59)页为动态
     Object1PicX;  //物体材料1在物体图片上横坐标(以格子为坐标)
     Object1PicY;  //物体材料1在物体图片上纵坐标(以格子为坐标)
    bool IsObject2; //是否显示物品2
     Object2PicNum;     //地表图片页面编号(0~59),,,(0-55)页为静态(56~59)页为动态
     Object2PicX;  //物体材料2在物体图片上横坐标(以格子为坐标)
     Object2PicY;  //物体材料2在物体图片上纵坐标(以格子为坐标)
     Block;         //阻碍标志(ID_BLOCK_T,ID_BLOCK_F)
     Hook;     //陷阱标志(ID_HOOK_F,ID_HOOK_T …………)
    char HookscriptName[28];
    char Reserve;        //保留位(我估计我们肯定还有想不到些信息以后可以在这里添加以免地图编辑完成的后再修改cell结构时可避免重新编辑地图文件)
}stCell;

太清楚了我也不解释了!

步就是地图了地图处理不管是什么思路方法大同小异.
     ID;  //地图编号
char Name[32];        //地图名称(地图文件名)
     Width;    //宽度(以格子为坐标) 斜
     Height;   //高度(以格子为坐标) 斜
     MapStartX,MapStartY; //左上角坐标
    stCell **Cell; //动态格子
    char FileName[32];    //当前地图文件名
    char ScrFName[32];    //地图化脚本文件名
    char Reserve[4];        //保留位(我估计我们肯定还有想不到些信息以后可以在这里添加以免地图编辑完成的后再修改Map_struct格式破坏原先编好地图文件)

    //这里先不用看到了那里再说
    LPDIRECTDRAWSURFACE7 lpDDS_MapBack; //地图临时保存点
    LPDIRECTDRAWSURFACE7 lpDDS_TMouse; //Tile鼠标
     MapBx,MapBy; //用来优化机器

  这样不就介绍完了吗?简单吧不过后面越来越难做好心理准备

2.坐标转换

各大文章在这里都快讲疯了我不想说推理思路方法了你记住以下就可以:

    //斜45度坐标转换成屏幕坐标
    inline void MIToMD( Dx, Dy, &Ix, &Iy)
    {
        Ix=(TileWidth>>1)*(Dx-Dy);//转换为绝对坐标x
        Iy=(TileHeight>>1)*(Dx+Dy);//转换为绝对坐标y      大菱形
    }

    //屏幕坐标转换成斜45度坐标
    inline void MDToMI( Ix, Iy, &Dx, &Dy)
    {
        Dx=(0.5*((Iy<<1)+Ix)/(TileWidth>>1));


        Dy=(0.5*((Iy<<1)-Ix)/(TileWidth>>1));
    }

其中
    # TileWidth 32 //每个Tile
    # TileHeight 16 //每个Tile


3.绘制地图

  绘制地图有什么难错!地图绘制好了FPS能提高数倍

传统地图绘制思路方法:

for( i=0;i<height;i)
{
    for( t=0;t<width;t)
    {
        绘制
    }
}

经过改进我这样做

 (MapBx!=x&&MaxBy!=y)
{
    for( i=0;i<height;i)
    {
        for( t=0;t<width;t)
        {
            绘制
            更新MaxBx和MaxBy
            备份地图(存成图片)
        }
    }
}

{
    还原地图(取出图片)
}

这样空闲状态FPS就会提升什么?还想提升这样办吧!

推理思路方法从略(其实我也不记得春天写):

    # MapDMX (0.5*((ScreenHeight<<1)+ScreenWidth)/(TileWidth>>1))+1  //最大画出点X
    # MapDMY (0.5*(ScreenHeight<<1)/(TileWidth>>1))+1 //最大画出点Y
    # MapDSY (0.5*(-ScreenWidth)/(TileWidth>>1))-1  //最小画出点Y(特殊)

然后
 (MapBx!=x&&MaxBy!=y)
{
    for ( Y=IntSizeL(MapStartY+MapDSY,0); Y<IntSizeS(MapStartY+MapDMY,Height); Y)
    {
        for ( X=IntSizeL(MapStartX-1,0); X<IntSizeS(MapStartX+MapDMX,Width); X)
        {
            绘制
            更新MaxBx和MaxBy
            备份地图(存成图片)
        }
    }

{
    还原地图(取出图片)
}

其中IntSizeL取两个数大IntSizeS取两个数小!

速度优化到极限了好了先写到着次我再说遮挡

Tags:  45度网络 45度弯头 倾斜45度 45度斜三通

延伸阅读

最新评论

发表评论