Slimer软工课设日报-2016年6月30日

根据上期预告,今天的主要工作是增加了初始界面和设置界面

初始界面

点击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的使用,参考了百度百科


原文地址:https://www.cnblogs.com/hesoyamlyf/p/5630667.html