网络游戏demo开发实例:多人在线RPG游戏(MMO RPG)demo的开发记录(第17篇下)

网络游戏demo开发实例:多人在线RPG游戏(MMO RPG)demo的开发记录(第17篇上)
本篇地址 http://blog.csdn.net/changjixiong/article/details/8102512,转载请注明出处

version19  csdn下载地址请猛击这里

主要内容:

客户端:重构了Sprite类、修改了资源加载、修改了消息格式

服务端:增加了GameLoop用来刷怪、修改了消息格式


代码地址 https://github.com/changjixiong/MMO-RPGGame/downloads, 如何获得代码,请参考如何用SVN从github上检出代码的不同版本

邮件地址:changjixiong@gmail.com   微博 http://weibo.com/changjixiong

本系列目录


本篇分为上下2篇

此为上篇


将Sprite类修改为抽象类,静态函数Load_Resource通过调用Load_Frame,和Load_Animation,来创建加载位图资源和动画序列,通过静态变量resouceLoaded来控制只加载一次资源,这个和单例模式有点像,不同的是,单例模式控制的是只创建一个实例。

先用Load_Frame加载位图

加载完以后 静态变量 Sprite::spBitMapResource 里面的内容是这样的

spBitMapResource[0] ~ spBitMapResource[24]        人物站立位图资源

spBitMapResource[25] ~ spBitMapResource[74]     人物行走位图资源

spBitMapResource[75] ~ spBitMapResource[124]  人物攻击位图资源

spBitMapResource[125] ~ spBitMapResource[174] 人物死亡位图资源

spBitMapResource[175] ~ spBitMapResource[199]  狼站立位图资源

spBitMapResource[200] ~ spBitMapResource[249] 狼行走位图资源

spBitMapResource[250] ~ spBitMapResource[299] 狼攻击位图资源

spBitMapResource[300] ~ spBitMapResource[375] 狼死亡及腐烂位图资源


再用Load_Animation加载动画序列

加载完以后静态变量Sprite::spAnimationsResource里面的内容是这样的

spAnimationsResource[0] ~ spAnimationsResource[7]      人物站立动画的8个序列

spAnimationsResource[8] ~ spAnimationsResource[15]    人物行走动画的8个序列

spAnimationsResource[16] ~ spAnimationsResource[23]  人物攻击动画的8个序列

spAnimationsResource[24] ~ spAnimationsResource[31]  人物死亡动画的8个序列

spAnimationsResource[32] ~ spAnimationsResource[39]  狼站立动画的8个序列

spAnimationsResource[40] ~ spAnimationsResource[47]  狼行走动画的8个序列

spAnimationsResource[48] ~ spAnimationsResource[55]  狼攻击动画的8个序列

spAnimationsResource[56] ~ spAnimationsResource[63]  狼死亡立动画的8个序列


下面,类Player需要获得这些资源的指针

通过函数AttachBitMaps 获取这些资源的指针以后静态变量Player::MyBitMap **pBitMap里面的内容是这样的

pBitMap[0] ~ pBitMap[24]        人物站立位图资源

pBitMap[25] ~ pBitMap[74]     人物行走位图资源

pBitMap[75] ~ pBitMap[124]  人物攻击位图资源

pBitMap[125] ~ pBitMap[174] 人物死亡位图资源


通过函数AttachAnimations获取动画序列指针以后静态变量Player::int **pAnimations里面的内容是这样的

pAnimations[0] ~ pAnimations[7]      人物站立动画的8个序列

pAnimations[8] ~ pAnimations[15]    人物行走动画的8个序列

pAnimations[16] ~ pAnimations[23]  人物攻击动画的8个序列

pAnimations[24] ~ pAnimations[31]  人物死亡动画的8个序列


类wolf获取资源,需要注意偏移,

wolf的站立动画位图资源是spBitMapResource[175] ~ spBitMapResource[199] ,站立动画序列是spAnimationsResource[32] ~ spAnimationsResource[39]

其他动作的以此类推

获取以后,内容是这样

pBitMap[0] ~ pBitMap[24]        狼站立位图资源

pBitMap[25] ~ pBitMap[74]     狼行走位图资源

pBitMap[75] ~ pBitMap[124]   狼攻击位图资源

pBitMap[125] ~ pBitMap[199] 狼死亡及腐烂位图资源(死亡10帧,腐烂5帧)

pBitMap[0]里面的内容,是Sprite::spBitMapResource[175]


pAnimations[0] ~ pAnimations[7]      狼站立动画的8个序列

pAnimations[8] ~ pAnimations[15]    狼行走动画的8个序列

pAnimations[16] ~ pAnimations[23]  狼攻击动画的8个序列

pAnimations[24] ~ pAnimations[31]  狼死亡动画的8个序列

pAnimations[0]里面的内容是Sprite::spAnimationsResource[0]

这样,如果以后将位图和动画序列资源打包成一个文件,只需要修改Sprite::Load_Resource函数。


现在,如果需要显示Player向西行走,则动画序列是pAnimations[animIndex], 这里animIndex = action + Dir,action=WALK, Dir = WEST, WALK =8, Dir = 2

最终animIndex = 10,也就是pAnimations[10][0] ~pAnimations[10][9],那么所需要的位图资源就是pBitMap[pAnimations[10][0]] ~ pBitMap[pAnimations[10][9]]


Sprite的绘图函数Draw用到的位图是spBitMap[spAnimations[animIndex][BitMapFrame]]

这个是因为在Sprite::Init函数里面有这么2句

spAnimations	= getpAnimations();
	spBitMap		= getpBitMap();

getpAnimations()和getpBitMap()都是虚函数

Player和wolf类调用以后,将pBitMap 赋值给spBitMap,将pAnimations赋值给spAnimations,于是

spBitMap[spAnimations[animIndex][BitMapFrame]]

   ↑                     ↑                  ↑                        

pBitMap  [pAnimations  [10]                       [0~9]]


这样,在以后的使用中,都是用Sprite指针来操作,非常方便。


消息格式修改为

[typeid, id, statu, action, targetTypeID, targetid, x, y]   类型为typeid,ID为id状态为statu的sprite 用action动作作用到目标,目标的类型是targetTypeID,ID是targetid,坐标是x,y

这个消息格式非常简单,便于说明,后面会将消息设计为包结构,而不是像这样的字符串。

收到消息以后解析

action = INITMAINROLE

需要创建主角

spMainRole	= CreateSprite(typeID);

action =INITSPRITE

创建精灵,不管是其他玩家,还是狼,还是以后的其他怪,BOSS等

Sprite * sp = CreateSprite(typeID);
				sp->Init(msg.c_str());
				vecpSprite.push_back(sp);

这个用工厂模式来创建,非常方便

而且,基于上面的资源加载,精灵的动作和动画,用Sprite指针调用虚函数即可。