由于周末我们更新了服务器系统,我周日晚上才拿到,所以这篇博客更新较晚。这篇是补的上周末的博客。
周末我做的内容就是存储下线经验值。
左侧的5是cout的具体经验值。经验条是紫色的那个。
我打一个怪之后会涨10点经验。
然后我关闭游戏,重新登录。
经验条成功保存。
具体实现是,我们将获取经验的代码放到了服务端。就是用户杀死怪,传信息到服务器,服务器计算涨的经验,然后将数值发回客户端。客户端接收到数值之后,计算出现有经验然后显示。
下面是怪物被玩家打的函数:
bool monster::fight(double damage, int id) { //被玩家打 hp -= damage; if (hp <= 0) { hp = 10; initPosition(); for (int i = 0; i < curmap->csz.size(); i++) { if (curmap->csz[i]->p.id == id) { curmap->csz[i]->p.getexp(getexp); } } } sprintf(buffer, "MG %d %d %d %lf %lf %lf", curmap->id, this->id, 0,wx, wy, hp); //Send to 所有玩家 GengXinMonster(buffer); return true; }
中间那段,if中的内容就是杀怪玩家调用getexp(int ge)函数。
服务端clientplayer.cpp下的getexp(int ge)函数实现如下:
void Player::getexp(int ge) { //获得经验 char buf[MAXSIZE + 1]; exp += ge; sprintf(buf, "HE %d %d %d", curmap->id, id, ge); //发送获得经验消息 SendAcquireInfo(buf); while (exp > maxexp) { exp -= maxexp; lvup(); } }
服务端获得经验值,发送HE消息传给客户端。
而客户端接收信息的代码如下:
else if (c == 'H') { ss >> c; if (c == 'E') { ss >> temp; p1.exp += temp; } }
显示经验条可见之前博客。