标签:
今天增加了一些显示上的内容,使我们的游戏更加便于理解。比如,我们加入了血条的显示,而且用颜色区分开自己的角色、别人的角色和怪物。如下图所示。
屏幕下方那一条紫紫的东西就是经验条,长满之后会升级。
下面我将逐个解释每个模块的实现方法。
首先是血条:
自己的血条:
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的视角转换。我们做的是把史莱姆放在屏幕正中间。但是玩家走到接近地图边界的时候,按照正常的理解,是不能继续把史莱姆放在正中间的,因为如果这样屏幕就会出现一大片黑。这就需要判断是否到了边界附近。然后实际画经验条的过程就很容易了,只是体力上的劳动,一点一点试出最佳位置、大小以及颜色。最终效果图如第一张图所示。
今天做的这些内容也是为了之后的用户界面做准备。
标签:
原文地址:http://www.cnblogs.com/Dmmuistirci/p/5628227.html