主要内容:
客户端:重构了Sprite类、修改了资源加载、修改了消息格式
服务端:增加了GameLoop用来刷怪、修改了消息格式
邮件地址: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] 人物攻击位图资源
通过函数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[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();
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);
创建精灵,不管是其他玩家,还是狼,还是以后的其他怪,BOSS等
Sprite * sp = CreateSprite(typeID);
sp->Init(msg.c_str());
vecpSprite.push_back(sp);
而且,基于上面的资源加载,精灵的动作和动画,用Sprite指针调用虚函数即可。