今天将之前的用户界面显示的内容集合到了一个函数中,并且增加了屏幕左上角的角色状态栏,并且加入了魔法这项状态。界面与下图所示:
因为还没有技能,所以魔法还不能减。这也是为之后加入技能做出准备。图中灰色的框是头像框,灰色方块是默认的头像。
整合代码如下:
/*绘制UI界面*/ void Player::paintUI() { //计算用户界面的x,y值 double x, y; x = wx; y = wy; if (x < 1) x = 1; else if (x > mapmax - 1) x = mapmax - 1; if (y < 1) y = 1; else if (y > mapmax - 1) y = mapmax - 1; /*下面是显示经验条模块*/ //显示经验框 glColor3f(0.8, 0.8, 0.8); glBegin(GL_POLYGON); glVertex2f(x - 1, y - 0.982); glVertex2f(x + 1, y - 0.982); glVertex2f(x + 1, y - 1); glVertex2f(x - 1, y - 1); glEnd(); glColor3f(0.6, 0.2, 1); //显示经验条 glRectf(x - 1, y - 0.985, x - 1 + ((double)exp / (double)maxexp) * 2, y - 0.998); /*显示经验条模块到此为止*/ /*下面是显示屏幕左上角的头像及血量框*/ //画出头像框 glColor3f(1, 1, 1); glBegin(GL_LINE_LOOP); glVertex2f(x - 0.96, y + 0.925); glVertex2f(x - 0.83, y + 0.925); glVertex2f(x - 0.83, y + 0.73); glVertex2f(x - 0.96, y + 0.73); glEnd(); //画状态框(血条什么的) //血条 glColor3f(1, 1, 1); glBegin(GL_LINE_LOOP); glVertex2f(x - 0.83, y + 0.925); glVertex2f(x - 0.5, y + 0.925); glVertex2f(x - 0.5, y + 0.85); glVertex2f(x - 0.83, y + 0.85); glEnd(); //魔法条 glColor3f(1, 1, 1); glBegin(GL_LINE_LOOP); glVertex2f(x - 0.83, y + 0.85); glVertex2f(x - 0.5, y + 0.85); glVertex2f(x - 0.5, y + 0.78); glVertex2f(x - 0.83, y + 0.78); glEnd(); //状态条(待加) /*左上角头像框模块显示完毕*/ /*下面是显示屏幕左上角的头像及血量*/ //画头像 glColor3f(0.7, 0.7, 0.7); glBegin(GL_POLYGON); glVertex2f(x - 0.959, y + 0.924); glVertex2f(x - 0.8305, y + 0.924); glVertex2f(x - 0.8305, y + 0.731); glVertex2f(x - 0.959, y + 0.731); glEnd(); //画实际血条 glColor3f(1, 0, 0); glBegin(GL_POLYGON); glVertex2f(x - 0.829, y + 0.924); glVertex2f(x - 0.829 + (hp / maxhp)*0.3285, y + 0.924); glVertex2f(x - 0.829 + (hp / maxhp)*0.3285, y + 0.851); glVertex2f(x - 0.829, y + 0.851); glEnd(); //画实际魔法条 glColor3f(0, 0, 1); glBegin(GL_POLYGON); glVertex2f(x - 0.829, y + 0.849); glVertex2f(x - 0.829 + (mp / maxmp)*0.3285, y + 0.849); glVertex2f(x - 0.829 + (mp / maxmp)*0.3285, y + 0.781); glVertex2f(x - 0.829, y + 0.781); glEnd(); /*头像及血量显示完毕*/ /*显示血量数值以及魔法量数值*/ //显示血量 char buf[20]; glColor3f(1, 1, 1); sprintf(buf, "%.0lf/%.0lf", hp, maxhp); glRasterPos2f(x - 0.69, y + 0.877); drawString(buf); //显示魔法 glColor3f(1, 1, 1); sprintf(buf, "%.0lf/%.0lf", mp, maxmp); glRasterPos2f(x - 0.69, y + 0.805); drawString(buf); //显示等级 glColor3f(1, 1, 1); sprintf(buf, "lv:%d", lv); glRasterPos2f(x - 0.915, y + 0.68); drawString(buf); /*显示状态数值完毕*/ }
因为所有用户界面都是跟着镜头走的,所以只要在一开始计算出视角位置,剩下的只是画图的话就很简单。耗费时间的只是试出位置与大小。
至于mp和maxmp两项如何添加只能看最终版本,因为改动的地方实在是太多了。
当然今天还修复了一个bug,就是当用户杀怪后只在客户端涨了经验值,服务器并没有计算增加的经验值。这个没办法截图显示。下面是代码:
//查询杀死这个怪物的用户 list<client>::iterator it3; for (it3 = CL1.begin(); it3 != CL1.end(); it3++) { if (id == it3->p.id) { break; } } it3->p.exp += getexp; //加经验
这个是在服务端的Monster.cpp中实现的。服务端当怪物被杀的时候会重新生成一个新的怪物,就是在这个时候给杀死这个怪的玩家加上相应的经验。我们通过杀死这个怪物的玩家的id在玩家链表中查找出相对应的玩家,把他的经验加上。
此外关于人物下线时属性的记录(我们现在是将之写入txt),由于加入了一个mp属性,需要修改的地方略多,我还没有完全改完,所以在重新登陆时用户的mp会出现一些问题。明日会着重解决这个问题。
时间: 2024-10-11 01:17:38