根据上期预告,今天的主要工作是增加了初始界面和设置界面
初始界面
点击start按钮,若在设置中已成功连接服务器,则会进入账号登录界面,否则弹窗报错
void start() { //开始游戏按钮 if (connected == 0) { MessageBox(NULL,"未连接到服务器,请在设置中输入IP","错误" , MB_OK); } else { form = 1; //账号登录页面 } }
start按钮
代码中connected变量当设置页面中ip连接成功时置1,Form1表示账号登录界面(Form0为初始界面,Form为游戏操作界面,Form3为设置页面)
设置页面
IP输入框与连接按钮依旧利用了之前的函数,只是由于位置改变,初始化两个控件时的坐标改变了
其中所有的按钮和输入框都是利用原先写的Button和InputBox定义的
Button back_button(changex(0), changey(768 - 666), changex(124 - 0) + 1, changey(707 - 666) + 1, back);
Button connect_button(changex(806), changey(768 - 366), changex(921 - 806) + 1, changey(420 - 366) + 1, connecttoserver);
Button musicon_button(changex(428), changey(768 - 463), changex(664 - 428) + 1, changey(517- 463) + 1, musicon);
Button musicoff_button(changex(658), changey(768 - 463), changex(921 - 658) + 1, changey(517 - 463) + 1, musicoff);
Button fullscreen_button(changex(428), changey(768 - 556), changex(664 - 428) + 1, changey(610 - 556) + 1, fullscreen);
Button window_button(changex(685), changey(768 - 556), changex(921 - 685) + 1, changey(610 - 556) + 1, window);
InputBox ip_inputbox(changex(428), changey(768 - 366), changex(795 - 428) + 1, changey(420 - 366) + 1);
Button对象的最后一个参数是通过鼠标点击响应绑定的对应函数
class Button { public: double x; double y; double w; double h; ClickEvent clickevent; //按钮函数 Button(double x1, double y1, double w1, double h1,ClickEvent ck) { x = x1; y = y1; w = w1; h = h1; clickevent = ck; } void draw() { //绘制按钮 glColor3f(0, 0, 0); glBegin(GL_QUADS); glVertex2f(x+w, y); glVertex2f(x, y); glVertex2f(x, y-h); glVertex2f(x+w, y-h); glEnd(); } void click(double x1,double y1) { //点击响应函数 if (x1 >= x&&x1 <= x + w&&y1 >= y - h&&y1 <= y) { clickevent(); } } };
Button
具体每个按钮的点击响应函数实现如下:
void connecttoserver() { stringstream ss(ip_inputbox.s); int a, b, c, d; char c1, c2, c3; ss >> a >> c1 >> b >> c2 >> c >> c3 >> d; if (c1 == ‘.‘&&c2 == ‘.‘&&c3 == ‘.‘&&a <= 255 && a >= 0 && b <= 255 && b >= 0 && c <= 255 && c >= 0 && d <= 255 && d >= 0) { SERVIP = ip_inputbox.s.c_str(); int status = client(); if (status == 0) { MessageBox(NULL, "连接成功", "成功", MB_OK); //* connected = 1; //* } else if (status == 1) { MessageBox(NULL, "连接失败,请重试", "错误", MB_OK); } //form = 1; } else { ip_inputbox.s.clear(); MessageBox(NULL, "IP地址格式输入错误,请重新输入", "错误", MB_OK); } }
Connect
ip输入不符合规范时,会提示如下错误
连接成功时
连接失败时
void musicon() { //打开音乐按钮* PlaySound("res/abc.wav", NULL, SND_FILENAME | SND_ASYNC); }
Music on
void musicoff() { //关闭音乐按钮* PlaySound(NULL, NULL, NULL); }
Music off
void fullscreen(){ //全屏按钮* glutFullScreen(); }
fullscreen
void window() { //窗口化按钮* glutReshapeWindow(1366, 768); //改变窗口大小 int cx = glutGet(GLUT_SCREEN_WIDTH); //获取屏幕大小 int cy = glutGet(GLUT_SCREEN_HEIGHT); glutPositionWindow((cx - 1366) / 2, (cy - 768) / 2); //窗口居中 }
window
void back() { //返回按钮* form = 0; //返回初始界面 }
back
通过以上工作,我学习了如何使窗口最大化和恢复窗口化,参考了http://www.xuebuyuan.com/1559974.html
以及openGL设置窗口居中的方法,参考了http://www.linuxidc.com/Linux/2012-04/58982.htm
还有MessageBox的使用,参考了百度百科
Slimer软工课设日报-2016年6月30日