本篇地址 http://blog.csdn.net/changjixiong/article/details/8065835,转载请注明出处
主要内容:增加了玩家PK 重构了部分服务端代码
所属部分:客户端 服务器端
邮件地址:changjixiong@gmail.com
本次更新,重构了服务端的部分代码,增加了玩家PK
使用方法:将代码编译,将GameClient.exe和pic文件夹,拷贝到文件夹role1(内含配置文件)、role2、role3中
运行GameServer文件夹中的GameServer.py(需要安装python2.X),点击role1的GameClient.exe,登陆玩家1,需要登陆玩家2,3,各位看官应该知道怎么做吧
增加玩家PK,只需要做几个步骤
Sprite部分
1.在Sprite中增加动作序列 int man_Attack[8][10],int man_Die[8][10]
2.添加资源 pic 120~169, 280~329,以及记录坐标偏移的txt文件
3.在Sprite中加载对应的资源,只需要在函数int SpriteResource::init()里面增加
Load_Frame(120, 50);
for (i=0;i<DIRCOUNT;i++)
{
Load_Animation(ATTACK+i, 10, man_Attack[i]);
}
Load_Frame(280, 50);
for (i=0;i<DIRCOUNT;i++)
{
Load_Animation(DIE+i, 10, man_Die[i]);
}
4.在函数void Sprite::Animate()里面增加判断,如果死了,就躺在地下,直到收到复活消息
5.增加函数void Sprite::Attack(int x, int y)用于切换攻击动作,增加函数void Sprite::Die(int x, int y)用于切换死亡动作
6.增加函数bool Sprite::NeedRevive()用于判断是否该复活了(需要复活了,就发消息给服务器,服务器确认以后,发回,客户端接收并复活玩家)
GameWorld部分
1.在enum Action中 增加ATTACK、DIE、SPRITEREVIVE 表示攻击、死亡、复活
2.在函数 GameWorld::HandleMsg()里面增加了对攻击消息,死亡消息和复活消息的处理
当然了,用循环查找比较低效,在以后的重构中,将把循环查找改为映射查找
case ATTACK:
for (iter=vecPplayer.begin(); iter!=vecPplayer.end();iter++)
{
if ((*iter)->GetID() == id)
{
(*iter)->Attack(x,y);
}
}
break;
case DIE:
for (iter=vecPplayer.begin(); iter!=vecPplayer.end();iter++)
{
if ((*iter)->GetID() == id)
{
(*iter)->Die(x,y);
}
}
break;
case SPRITEREVIVE:
for (iter=vecPplayer.begin(); iter!=vecPplayer.end();iter++)
{
if ((*iter)->GetID() == id)
{
(*iter)->ChangeAction(STAND);
(*iter)->ChangePos(x, y);
}
}
break;
3.增加函数GameWorld::GenerateMsg(),用来生产复活消息,发送给服务端(以后这个函数还将按逻辑产生其他非用户点击相关的消息)
4.增加函数GameWorld::haveSprite(int x, int y)用来判断是否点击到玩家(自己除外)
5.增加函数 GameWorld::SetMessageFromInput(UINT msg, int x, int y)用来判断是否攻击其他玩家并产生消息
服务器部分
1.actionDic 中增加 ATTACK、DIE、SPRITEREVIVE
2.增加处理器class HandlerDie 处理玩家死亡,等待复活的逻辑
玩家PK,HP为3,每次攻击HP减少1,也就是砍3刀就死,然后,在 320,240复活,如图: