软件工程迭代开发第三篇

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了软件工程迭代开发第三篇相关的知识,希望对你有一定的参考价值。

今天将之前的用户界面显示的内容集合到了一个函数中,并且增加了屏幕左上角的角色状态栏,并且加入了魔法这项状态。界面与下图所示:

技术分享

因为还没有技能,所以魔法还不能减。这也是为之后加入技能做出准备。图中灰色的框是头像框,灰色方块是默认的头像。

整合代码如下:

/*绘制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会出现一些问题。明日会着重解决这个问题。

以上是关于软件工程迭代开发第三篇的主要内容,如果未能解决你的问题,请参考以下文章

测开之数据类型进阶篇・第三篇《推导式》

ARM开发工具软件命令具体解释---嵌入式回归第三篇

Linux从青铜到王者第三篇:Linux开发工具编辑器vim

软件工程课设迭代开发第三天

第三篇:函数

区块链-智能合约工程师第三篇:Solidity进阶