游戏编程伊始
物品、景物等按NPC处理(不规则处理,如“魔力宝贝”):
typedef struct{
bool IsGround;//是否显示地表
short GroundPicNum; //地表图片页面编号(059),(0-55)页为静态,(5659)页为动态
short GroundPicX; //地表材料在地表图片上的横坐标(以格子为坐标)
short GroundPicY; //地表材料在地表图片上的纵坐标(以格子为坐标)
short Block; //阻碍标志(ID_BLOCK_T,ID_BLOCK_F)
short Hook; //陷阱标志(ID_HOOK_F,ID_HOOK_T …………)
char HookScriptName[28];
char Reserve; //保留位,(我估计我们肯定还有想不到的一些信息,以后可以在这里添加,以免地图编辑完成之后,再修改cell结构时可避免重新编辑地图文件)
}stCell;
具体我也不说什么了,注释都很清楚!
物品、景物也按Tile处理但NPC按不规则处理(如:“仙剑奇侠转”,强烈不推荐!)
typedef struct{
bool IsGround;//是否显示地表
short GroundPicNum; //地表图片页面编号(059),(0-55)页为静态,(5659)页为动态
short GroundPicX; //地表材料在地表图片上的横坐标(以格子为坐标)
short GroundPicY; //地表材料在地表图片上的纵坐标(以格子为坐标)
bool IsObject1;//是否显示物品1
short Object1PicNum; //地表图片页面编号(059),(0-55)页为静态,(5659)页为动态
short Object1PicX; //物体材料1在物体图片上的横坐标(以格子为坐标)
short Object1PicY; //物体材料1在物体图片上的纵坐标(以格子为坐标)
bool IsObject2; //是否显示物品2
short Object2PicNum; //地表图片页面编号(059),(0-55)页为静态,(5659)页为动态
short Object2PicX; //物体材料2在物体图片上的横坐标(以格子为坐标)
short Object2PicY; //物体材料2在物体图片上的纵坐标(以格子为坐标)
short Block; //阻碍标志(ID_BLOCK_T,ID_BLOCK_F)
short Hook; //陷阱标志(ID_HOOK_F,ID_HOOK_T …………)
char HookScriptName[28];
char Reserve; //保留位,(我估计我们肯定还有想不到的一些信息,以后可以在这里添加,以免地图编辑完成之后,再修改cell结构时可避免重新编辑地图文件)
}stCell;
太清楚了,我也不解释了!
下一步就是地图了,地图的处理不管是什么方法大同小异.
int ID; //地图编号
char Name[32]; //地图名称(地图文件名)
int Width; //宽度(以格子为坐标) 斜
int Height; //高度(以格子为坐标) 斜
int MapStartX,MapStartY; //左上角坐标
stCell **Cell; //动态格子
char FileName[32]; //当前地图文件名
char ScrFName[32]; //地图初始化脚本文件名
char Reserve[4]; //保留位,(我估计我们肯定还有想不到的一些信息,以后可以在这里添加,以免地图编辑完成之后,再修改Map_struct格式,破坏原先编好的地图文件)
//这里先不用看,到了那里再说。
LPDIRECTDRAWSURFACE7 lpDDS_MapBack; //地图临时保存点
LPDIRECTDRAWSURFACE7 lpDDS_TMouse; //Tile鼠标
int MapBx,MapBy; //用来优化机器
坐标转换
//斜45度的坐标转换成屏幕坐标
inline void MIToMD(int Dx,int Dy,int &Ix,int &Iy)
{
Ix=(TileWidth>>1)(Dx-Dy);//转换为绝对坐标x
Iy=(TileHeight>>1)(Dx+Dy);//转换为绝对坐标y 大菱形
}
//屏幕坐标转换成斜45度的坐标
inline void MDToMI(int Ix,int Iy,int &Dx,int &Dy)
{
Dx=int(0.5*((Iy<<1)+Ix)/(TileWidth>>1));
Dy=int(0.5*((Iy<<1)-Ix)/(TileWidth>>1));
}
其中
#define TileWidth 32 //每个Tile的宽
#define TileHeight 16 //每个Tile的高
绘制地图
#define MapDMX int(0.5*((ScreenHeight<<1)+ScreenWidth)/(TileWidth>>1))+1 //最大画出点X
#define MapDMY int(0.5*(ScreenHeight<<1)/(TileWidth>>1))+1 //最大画出点Y
#define MapDSY int(0.5*(-ScreenWidth)/(TileWidth>>1))-1 //最小画出点Y(特殊)
然后
if (MapBx!=x&&MaxBy!=y)
{
for (int Y=IntSizeL(MapStartY+MapDSY,0); Y<IntSizeS(MapStartY+MapDMY,Height); Y++)
{
for (int X=IntSizeL(MapStartX-1,0); X<IntSizeS(MapStartX+MapDMX,Width); X++)
{
绘制。。。。。
更新MaxBx和MaxBy
备份地图(存成图片)
}
}
else
{
还原地图(取出图片)
}
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; //当触发人民的脚本文件名
};
首先是脚本类:
>class CScript
{
char Name[64];
vector<stVariable> VARA;
bool ScrIsFill; //脚本运行时是否使用黑屏
string str; //一行完整的指令
string M_CMD; //M_CMD 命令,M_CAN 临时储存参数
string M_CANX[MAX_CANX]; //参数数组
string M_CAN,M_RIGHT;
string M_VAR; //变量
string M_value; //变量,如果为空,就为"="右边去掉";"的数据,否则为"="右边脚本的返回值
string M_IFO,M_IFT;
int CanB[MAX_CANX]; //参数是布尔的话在这里储存
public:
CScript();
~CScript();
bool LoadScript(char *FileName);
void ScriptXCanC(