標籤:
今天將之前的使用者介面顯示的內容集合到了一個函數中,並且增加了螢幕左上方的角色狀態列,並且加入了魔法這項狀態。介面與所示:
因為還沒有技能,所以魔法還不能減。這也是為之後加入技能做出準備。圖中灰色的框是頭像框,灰色方塊是預設的頭像。
整合代碼如下:
/*繪製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會出現一些問題。明日會著重解決這個問題。
軟體工程反覆式開發法第三篇