软件工程迭代开发第二篇

  今天增加了一些显示上的内容,使我们的游戏更加便于理解。比如,我们加入了血条的显示,而且用颜色区分开自己的角色、别人的角色和怪物。如下图所示。

屏幕下方那一条紫紫的东西就是经验条,长满之后会升级。

下面我将逐个解释每个模块的实现方法。

首先是血条:

自己的血条:

glColor3f(0.2, 1, 0.1);
glRectf(wx - 0.025, wy + 0.1, wx - 0.025 + (hp / maxhp)* 0.05, wy + 0.085);        //显示血条

其他玩家的血条:

glColor3f(0.2, 1, 0.2);
char buf[20];
sprintf(buf, "lv:%d", lv);
glRasterPos2f(wx - 0.02, wy + mapmax / 40.0 + 0.05);
drawString(buf);
sprintf(buf, "%.0lf/%.0lf", hp, maxhp);
glRasterPos2f(wx - 0.025, wy + mapmax / 40.0 + 0.01);
drawString(buf);
glRectf(wx - 0.025, wy + 0.1, wx - 0.025 + (hp / maxhp)* 0.05, wy + 0.085);        //显示血条

中间是等级以及名字的显示,是之前就有的。

怪物的血条:

glColor3f(1, 0.2, 0.2);
char buf[20];
sprintf(buf, "%.0lf/%.0lf", hp, maxhp);
glRasterPos2f(wx - 0.025, wy + mapmax / 40.0+0.01);
drawString(buf);
glRectf(wx - 0.025, wy + 0.1, wx - 0.025 + (hp / maxhp)* 0.05, wy + 0.085);        //显示血条

原理就是画一个长跟血量百分比有关的矩形。用OpenGL的glRectf()函数很好实现。

下面是较为复杂的经验条实现:

/*下面是显示经验条模块*/
//计算经验条的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);        //显示经验条
/*显示经验条模块到此为止*/

第一段是计算经验条的视角位置。这个是最难点,因为我们游戏是用户在一张大地图上移动,玩家之所以看到的是自己的视角而不是整张地图是因为用了OpenGL的视角转换。我们做的是把史莱姆放在屏幕正中间。但是玩家走到接近地图边界的时候,按照正常的理解,是不能继续把史莱姆放在正中间的,因为如果这样屏幕就会出现一大片黑。这就需要判断是否到了边界附近。然后实际画经验条的过程就很容易了,只是体力上的劳动,一点一点试出最佳位置、大小以及颜色。最终效果图如第一张图所示。

今天做的这些内容也是为了之后的用户界面做准备。

时间: 2024-08-07 00:17:32

软件工程迭代开发第二篇的相关文章

软件工程迭代开发第一篇

今天我自己的任务是针对用户提的“输入用户名和密码的时候没有光标闪烁,导致我们用户不知道是否选中”问题做的修改. 我给出的初步解决方案是一个十分简单的办法,当鼠标点击框体内部,会将cur变量置1,而在draw()函数中判断,如果cur==1则在框体中画一个小的图形,提示选中.效果图如下图所示: 而具体的实现代码则为: if (cur) { //draw enter line signal glColor3f(1, 1, 1); glBegin(GL_POLYGON); for (int i = 0

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

日期:2016年6月28日 迭代开发的第二天,今天主要针对的是之前用户对于我们游戏程序中提到过的BUG进行分析与解决.其中有一部分是代码问题,另外一部分是大家在团队开发过程中沟通不当而产生的代码冲突.同时每个人都从头到尾的又体验了一遍程序,把所有可能产生bug的位置都一一排除掉.今天所迭代的版本运行比初始版本顺畅很多,明天将继续进行“除虫工作”,并着手开发体验用户所提出的新功能.

微信开发第二篇:工具篇

自从写了第一篇后,最近一直在整理另一个项目的需求,没有继续研究下去,今天晚上终于开始了我的第二篇. 本次微信的项目是想基于H5做的,所以现在的想法还是先从前端入手. 要做一个移动端H5的网站有很多种方式: 1.使用Html5.css3.js自己从头开始做. 但如果这样,对于目前主要从事项目管理及后端开发工作的我,无疑是困难重重:另外自己也已经对前端的东西很久没碰过了.如果选择这种方式,肯定会本末倒置.最后说不定整个项目都没得戏(虽说这个项目完全是自己的个人爱好!!) 2.使用现在已有的移动端H5

软件工程迭代开发第五篇

今天开始同组员一起开发技能方面的内容,但还未出成果,所以内容较少. 修改了一个小小的bug,关于新建账号出生的人物经验不对的bug. 这是人物初始化函数(构造函数),exp代表经验,一开始写成了exp=maxexp,所以经验有问题. Player::Player() :tj(1.6,0.2, mapmax / 40.0, mapmax / 20.0){ wx = 1.6; wy = 0.2; movenum = 0; setlv(1); hp = maxhp; exp = 0; fightran

软件工程迭代开发第六篇

今天更新了整个玩耍界面,学会了如何通过二维纹理载入图片. 最终界面如下: 下面的十个框框,左边五个是技能栏,右边五个是道具.这俩要等到整合之后才能体现. 实现方法: 将一张由我们美工画好的界面图加载到程序中并用OpenGL画出. 通过OpenGL的二维纹理加载画出. 在init中加载图片: //加载用户界面 p1.load_UI(ATLLoadTexture("res/hp.png")); 这个load_UI()函数是这样的: void Player::load_UI(int i) {

软件工程迭代开发第三篇

今天将之前的用户界面显示的内容集合到了一个函数中,并且增加了屏幕左上角的角色状态栏,并且加入了魔法这项状态.界面与下图所示: 因为还没有技能,所以魔法还不能减.这也是为之后加入技能做出准备.图中灰色的框是头像框,灰色方块是默认的头像. 整合代码如下: /*绘制UI界面*/ void Player::paintUI() { //计算用户界面的x,y值 double x, y; x = wx; y = wy; if (x < 1) x = 1; else if (x > mapmax - 1) x

(C/C++)基于SharpUI控件库的插件式框架开发--第二篇可停靠管理

一个软件,不可能只有一个文档界面,会有多个甚至几十二,比如一些浏览器.文档查看等都是多个标签页的形式,在C#中开源的可停靠管理的常用的是Xceed.Wpf.AvalonDock:但是用C/C++开发的开源停靠管理库是没找到,没办法只能自己写一个了. 图1 可停靠管理项目名XPDock,其中所有控件的样式存放在“.bin\layout\Theme\Controls\XPDock.xml”:如图2: 图2 在XPDock控件中,DockingManager为控件主要控件,控件内定义添加视图方法Add

轻松pick移动开发第二篇,rem布局

一.为什么要使用rem布局 前面我写了flex布局的优点,分配伸缩盒容器中子盒子占的份数及排列方式,使其不受屏幕缩放的影响,使布局变得简单.然而,在有些时候,不可避免要给盒子设置高度的值,怎么让高度也随着屏幕大小变化等比例缩放呢?另外,怎么让页面文字大小也随着屏幕的大小变化而缩放呢?rem布局就可以轻松解决这个问题. 二.rem布局的原理 1.rem 首先要了解什么是rem,rem (root em)是一个相对单位,1rem的值是页面html中font-size的大小.在布局中,我们统一使用re

并行开发——第二篇 Task的使用

在我们了解Task之前,如果我们要使用多核的功能可能就会自己来开线程,然而这种线程模型在.net 4.0之后被一种称为基于"任务的编程模型"所冲击,因为task会比thread具有更小的性能开销,不过大家肯定会有疑惑,任务和线程到底有什么区别? 1:任务是架构在线程之上的,也就是说任务最终还是要抛给线程去执行. 2:任务跟线程不是一对一的关系,比如开10个任务并不是说会开10个线程,这一点任务有点类似线程池,但是任务相比线程池有很小的开销和精确的控制. 一:Task 最简单的使用 开启