斜45度游戏开发(二)

                                                     斜45度游戏开发(二)
作者:Flysky 2005

 

  上一篇我们讲了地图的结构和地图的基本的绘制,这个属于较简单的步骤,我做这些也不是特别的麻烦,如果你是老手,那么1天对你来说已经足够,我们这一组文章也没有讲任何的优化技巧,如果你想优化,还是需要在实际中摸索,当然,我有时间也会写的。

  这一篇我们主要研讨地图的物品、景物、NPC建立,并说一下遮挡的简单实现方法。

NPC/主角结构:
  主角和NPC在一起比较好,也便于管理(再次声明:作者已经不使用这些方法,这些方法只适用于初学者!),结构如下:

struct stRoleC
{
    //判断
    bool IsNPC;  //是不是NPC

    //----------Role基本--------------
    char *Name;     //NPC名字
    bool VS;  //是否有这个人物(是否可见)
    int x,y; //人物的XY坐标值
    RECT roler; //人物矩形
    int face;        //NPC面向的方向 0. 下 1. 上  2.左  3.右
    char *facePic;

    //----------属性值-------------
    int HP,MP; //目前的HP,MP
    int MaxHP,MaxMP; //满HP和MP
    int Level; //目前的等级
    int Exp; //目前的经验
    int MaxExp; //满血的经验

    //----------寻路相关--------------
    bool move;
    int movex,movey; //移动目标点

    //----------NPC相关---------------
    char *EScrFName;    //当触发人民的脚本文件名
};

struct stRole
{
    //判断
    bool IsNPC;  //是不是NPC

    //----------Role基本--------------
    char Name[32];     //NPC名字
    bool VS;  //是否有这个人物(是否可见)
    int x,y; //人物的XY坐标值
    int oldx,oldy; //人物上一步的XY值
    RECT roler; //人物矩形
    POINT PicS; //距像素坐标的偏移
    int face;        //NPC面向的方向 0. 下 1. 上  2.左  3.右
    bool facejd; //上一步的站向
    char facePic[64];
    int facej;       //NPC方向的脚步 0 1 2 3
    vector<POINT> zd; //遮挡列表

    //----------属性值-------------
    int HP,MP; //目前的HP,MP
    int MaxHP,MaxMP; //满HP和MP
    int Level; //目前的等级
    int Exp; //目前的经验
    int MaxExp; //满血的经验

    //----------寻路相关--------------
    bool move;
    vector<POINT> Path; //各个步数
    int PathSteps; //步数
    int PathCSteps; //已经走过步数
    int movex,movey; //移动目标点

    //----------NPC相关---------------
    char *EScrFName;    //当触发人民的脚本文件名
    bool WalkLoop;  //是向前走还是倒退

    //----------Surface--------------
    LPDIRECTDRAWSURFACE7 lpDDS_ROLEP; //Role的图片
    LPDIRECTDRAWSURFACE7 lpDDS_ROLEL; //Role的logo
};

  这两个结构其中stRole是内部储存的结构,而stRoleC是对外的接口,其实你完全不必那样,用一个也可以,具体的完全随你便。

  注意:以下的代码和KGameSrc一点关系也没有。

景物的建立:

struct st_scene
{
    int x,y; //房子等东西右下角的坐标
    int Width,Height; //物品的大小,利用这个可以选出房子等左上角的坐标
    LPDIRECTDRAWSURFACE7 lpDDS_SCENEPIC; //房子等的图片
    unsigned short b_isablock; //0: 不阻碍 1: 全部阻碍 2:使用阻碍表
    struct {unsigned int data;}**v_block; //阻碍表,比如房子,门那里是不遮挡的
    //注意:因为我们构件的是<<魔力宝贝>>式,所以陷阱并不是归这里
};

  我也注释了,应该很好看吧。

  遮挡问题:

  这个确实比较棘手,如果是单格遮挡,可以看云风的遮挡算法,可我们是多个格的,怎么办呢?

  根据几位前辈的讨论,他们想出了使用X+Y算法(画家算法),但当时不是很成功,我就做一下补充。

  首先,把地图上的一切东西(不管是物品还是主角)串成一个链表(遮挡链表),然后根据X+Y的值有小到大(左上到右下)排列,最后绘制,这样就完成了,很简单吧(哪位可以帮我画一下图,感激不尽.)

  优化方法也有:那就是这个景物的排列让地图编辑器排列,然后这个不动了,光人物在链表中的位置移动,这样就完成了快速遮挡。


  好了,基本的东西我也写完了,由于现在我在做操作系统,语言说的太急,下一次我会把更好的优化代码和例子程序给大家,谢谢大家观看!

VC++场景游戏,人物移动,学VC、编游戏中的示例,它的实现,靠的是以下知识和技术:   1.建立DirectX环境和创建工作页面的方法。   2.各种页面内容的拷贝方法。   3.GDI与DirectX图形处理方法的简单比较。   游戏测试操作方法:   A、在场景内点任意点,指挥主移动。   B、将鼠标移到场景外,可以移动地图。   C、在微缩地图上点一下,可以快速定位。   D、ESC键,退出游戏。   你可以指挥主去打猎了。但打不死的,因为这里我们还没有加对象的生命值。      部分代码:   #define MAXINT 8192 //定义一个最大整数, 地图上任意两点距离不会超过它8192   #define STACKSIZE 38536 //保存搜索节点的堆栈大小65536   #define tile_num(x,y) ((y)*map_w+(x)) //将 x,y 坐标转换为地图上块的编号   #define tile_x(n) ((n)%map_w) //由块编号得出 x,y 坐标   char map[WIDTH*SCRP/GX+2][HEIGHT*SCRP/GY+2];//地图障碍格数据    int map_w,map_h;//地图障碍格宽和高    int start_x,start_y,end_x,end_y; //起点坐标,终点坐标    PATHN pathn[500];//重组路径    int findpath();//路径寻找主函数    int stackmax;//最大值    private://私有,类内部使用    LINK queue;//保存没有处理的行走方法的节点    TREE stack[STACKSIZE]; //保存已经处理过的节点(搜索完后释放)    int dis_map[WIDTH*SCRP/GX+2][HEIGHT*SCRP/GY+2];//保存搜索路径时,中间目标地最优解    void init_queue();// 初始化队列    void enter_queue(TREE node,int f);//待处理节点入队列,依靠对目的地估价距离插入排序    TREE get_from_queue(); //将离目的地估计最近的方案出队列    void freetree();//释放申请过的所有节点    int judge(int x,int y);//估价函数,估价x,y到目的地的距离,估计值必须保证比实际值小    int trytile(int x,int y,TREE father);//尝试下一步移动到x,y可行否    int zlpath(); //重组路径
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值