⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 optionsmenu.cpp

📁 S.C.O.U.R.G.E.是一款类似Rogue的游戏
💻 CPP
字号:
/***************************************************************************                          optionsmenu.cpp  -  description                             -------------------    begin                : Tue Aug 12 2003    copyright            : (C) 2003 by Gabor Torok    email                : cctorok@yahoo.com ***************************************************************************//*************************************************************************** *                                                                         * *   This program is free software; you can redistribute it and/or modify  * *   it under the terms of the GNU General Public License as published by  * *   the Free Software Foundation; either version 2 of the License, or     * *   (at your option) any later version.                                   * *                                                                         * ***************************************************************************/#include "optionsmenu.h" OptionsMenu::OptionsMenu(Scourge *scourge){        int nbModes, i;    char ** modes;     this->scourge = scourge;    this->uc = scourge->getUserConfiguration();    controlsLoaded = false;    videoLoaded = false;    gameSettingsLoaded = false;    controlLines = NULL;    nbControlLines = 0;    waitingForNewKey = false;	ignoreKeyUp = false;         mainWin = new Window( scourge->getSDLHandler(),						100, 50, 525, 505, 						strdup("Options"), 						scourge->getShapePalette()->getGuiTexture() );	     gameSettingsButton = mainWin->createButton(105, 0, 210, 30, strdup("Game settings"), true);	videoButton = mainWin->createButton (210, 0, 315, 30, strdup("Video"), true); 	audioButton = mainWin->createButton (315, 0, 420, 30, strdup("Audio"), true);    controlsButton = mainWin->createButton (420, 0, 525, 30, strdup("Controls"), true);               saveButton = mainWin->createButton(205, 440, 310, 470, strdup("Save to file"), false);                                cards = new CardContainer(mainWin);        // Controls tab    keyBindingsLabel = cards->createLabel(220, 50, strdup("Key bindings"), CONTROLS, Constants::RED_COLOR);    controlBindingsList = new ScrollingList(30, 100, 450, 300);    cards->addWidget(controlBindingsList, CONTROLS);            changeControlButton = cards->createButton (65, 440, 170, 470, strdup("Change"), CONTROLS, false);    waitingLabel = cards->createLabel(35, 80, strdup(" "), CONTROLS, Constants::BLUE_COLOR);             // Game settings tab    gameSpeedML = new MultipleLabel(100, 80, 300, 100, "Game speed", 100);    gameSpeedML -> addText(strdup("Very slow"));    gameSpeedML -> addText(strdup("Slow"));    gameSpeedML -> addText(strdup("Normal"));    gameSpeedML -> addText(strdup("Fast"));    gameSpeedML -> addText(strdup("Fastest"));        cards->addWidget(gameSpeedML, GAME_SETTINGS);    alwaysCenterMapCheckbox = cards->createCheckbox(100, 120, 258, 140, "Always center map", GAME_SETTINGS);       // Video settings tabs            videoResolutionML = new MultipleLabel(100, 40, 300, 60, "Screen resolution", 100);    modes = scourge->getSDLHandler()->getVideoModes(nbModes);         for(i = 0; i < nbModes; i++){        videoResolutionML -> addText(modes[i]);            }        cards->addWidget(videoResolutionML, VIDEO);    fullscreenCheckbox = cards->createCheckbox(100, 75, 258, 95, "Fullscreen", VIDEO);        resizeableCheckbox = cards->createCheckbox(100, 110, 258, 130, "Window resizeable", VIDEO);    doublebufCheckbox  = cards->createCheckbox(100, 145, 258, 165, "Use double buffering", VIDEO);        stencilbufCheckbox = cards->createCheckbox(100, 180, 258, 200, "Use stencil buffer", VIDEO );        forceHwsurfCheckbox = cards->createCheckbox(100, 215, 258, 235, "Force hardware surfaces", VIDEO);    forceSwsurfCheckbox = cards->createCheckbox(100, 250, 258, 270, "Force software surfaces", VIDEO);    multitexturingCheckbox = cards->createCheckbox(100, 285, 258, 305, "Use multitexturing", VIDEO);        hwpalCheckbox   = cards->createCheckbox(100, 320, 258, 340, "Use hardware palette", VIDEO);    hwaccelCheckbox = cards->createCheckbox(100, 360, 258, 380, "Use hardware acceleration", VIDEO);     shadowsML = new MultipleLabel(100, 395, 300, 415, "Shadows", 100);    shadowsML -> addText("None");      shadowsML -> addText("Some");    shadowsML -> addText("All");           cards->addWidget(shadowsML, VIDEO);           changeTakeEffectLabel = cards->createLabel(113, 432, strdup(" "), VIDEO, Constants::BLUE_COLOR);        selectedMode = GAME_SETTINGS;    				}void OptionsMenu::loadGameSettings(){            gameSpeedML->setText(gameSpeedML->getNbText() - uc->getGameSpeedLevel() - 1);    alwaysCenterMapCheckbox->setCheck(uc->getAlwaysCenterMap());}// line i must correspond to engine action i if we want this scrolling list to workvoid OptionsMenu::loadControls(){    string line, s1, s2, s3;     int i;    char spaces[MAX_CONTROLS_LINE_SIZE];    for(i = 0; i < MAX_CONTROLS_LINE_SIZE ; i++){        spaces[i] = ' ';    }    spaces[i] = '\0';        if(controlLines) {          for(int i = 0; i < uc->getEngineActionCount() ; i++){            if( controlLines[i] ){                free(controlLines[i]);                controlLines[i] = NULL;            }        }        free(controlLines);        controlLines = NULL;    }        nbControlLines = uc -> getEngineActionCount();                controlLines = (char **) malloc (nbControlLines *sizeof(char *));        for (i = 0; i < nbControlLines; i++){        //line = spaces;        s1 = uc->getEngineActionDescription(i);        s2 = uc->getEngineActionKeyName(i);                      /*for(j=0 ; j < 50 - s1.length(); j++){            s1.insert(s1.length(), " ");                    } */                                       line = s1 + "           " + s2;                 /*line.replace(0, s1.length(), s1);        line.replace (70 - s2.length(), s2.length(), s2);*/        controlLines[i] = (char *)malloc(MAX_CONTROLS_LINE_SIZE * sizeof(char));                strcpy(controlLines[i], line.c_str());    }                    controlBindingsList->setLines(nbControlLines, (const char**) controlLines);                          }void OptionsMenu::loadVideo(){        char temp[50];    string line;    string s, s1, s2, s3, s4;    int i;    int end;        sprintf(temp, "%d x %d", uc -> getW(), uc-> getH());              s = temp;    s1 = Util::getNextWord(s, 0, end);    s2 = Util::getNextWord(s, end, end);  // ignores the ' x '      s2 = Util::getNextWord(s, end, end);           i = 0;          // don't know why the string::find() function does not work, so...    while (i < videoResolutionML -> getNbText()){        line = videoResolutionML -> getText(i);        s3 = Util::getNextWord(line, 0, end);                       if(s1 == s3){                                       s4 = Util::getNextWord(line, end, end);   // ignores the ' x '             s4 = Util::getNextWord(line, end, end);                          if(s2 == s4){                                break;                        }                    }        i++;            }    if(i < videoResolutionML -> getNbText()){        videoResolutionML -> setText(i);    }    else{        videoResolutionML -> setText(0);    }        shadowsML->setText(uc->getShadows());        // Checkboxes    fullscreenCheckbox->setCheck(uc -> getFullscreen());    doublebufCheckbox->setCheck(uc->getDoublebuf());    stencilbufCheckbox->setCheck(uc->getStencilbuf());    hwpalCheckbox->setCheck(uc->getHwpal());    resizeableCheckbox->setCheck(uc->getResizeable());    forceHwsurfCheckbox->setCheck(uc->getForce_hwsurf());    forceSwsurfCheckbox->setCheck(uc->getForce_swsurf());    multitexturingCheckbox->setCheck(uc->getMultitexturing());    hwaccelCheckbox->setCheck(uc->getHwaccel());            }void OptionsMenu::setSelectedMode(){    videoButton->setSelected(selectedMode == VIDEO);    audioButton->setSelected(selectedMode == AUDIO);    controlsButton->setSelected(selectedMode == CONTROLS);    gameSettingsButton->setSelected(selectedMode == GAME_SETTINGS);                switch(selectedMode){        case VIDEO :            if(!videoLoaded){                loadVideo();                videoLoaded = true;                            }             break;        case AUDIO :            break;        case CONTROLS :            if(!controlsLoaded){                                loadControls();                controlsLoaded = true;                            }                        break;        case GAME_SETTINGS :            if(!gameSettingsLoaded){                loadGameSettings();                gameSettingsLoaded = true;            }            break;        default :             break;           }        cards->setActiveCard(selectedMode);  }bool OptionsMenu::handleEvent(Widget *widget, SDL_Event *event) {        if(widget == mainWin->closeButton) mainWin->setVisible(false);    else if(widget == gameSettingsButton) {        selectedMode = GAME_SETTINGS;            }      else if(widget == videoButton) {        selectedMode = VIDEO;    }       else if(widget == audioButton) {        selectedMode = AUDIO;    }    else if(widget == controlsButton) {        selectedMode = CONTROLS;            }           else if(widget == changeControlButton) { // && selectedMode== Controls?               waitingLabel->setText(strdup("Waiting for new key ... Press ESCAPE to cancel"));                waitingForNewKey = true;                   }    else if(widget == gameSpeedML){        uc -> setGameSpeedLevel(gameSpeedML->getNbText() - gameSpeedML->getCurrentTextInd() - 1);    }    else if(widget == alwaysCenterMapCheckbox){        uc -> setAlwaysCenterMap(alwaysCenterMapCheckbox->isChecked());    }    else if(widget == videoResolutionML){        string line, s1, s2;        int end;        line = videoResolutionML->getCurrentText();        s1 = Util::getNextWord(line, 0, end);        s2 = Util::getNextWord(line, end, end);        s2 = Util::getNextWord(line, end, end);        uc-> setW(atoi(s1.c_str()));        uc-> setH(atoi(s2.c_str()));            }    else if(widget == fullscreenCheckbox){        // if fullscreen checked -> not resizeable        if(fullscreenCheckbox->isChecked()){            resizeableCheckbox->setCheck(false);            uc->setResizeable(false);                        }        uc->setFullscreen(fullscreenCheckbox->isChecked());            }     else if(widget == resizeableCheckbox){        uc->setResizeable(resizeableCheckbox->isChecked());    }    else if(widget == doublebufCheckbox){        uc->setDoublebuf(doublebufCheckbox->isChecked());    }    else if(widget == hwpalCheckbox){        uc->setHwpal(hwpalCheckbox->isChecked());    }    else if(widget == forceSwsurfCheckbox){        // Hardware or software surfaces but not both        if(forceSwsurfCheckbox->isChecked()){            forceHwsurfCheckbox->setCheck(false);            uc->setForce_hwsurf(false);         }        uc->setForce_swsurf(forceSwsurfCheckbox->isChecked());    }    else if(widget == forceHwsurfCheckbox){        // Hardware or software surfaces but not both        if(forceHwsurfCheckbox->isChecked()){            forceSwsurfCheckbox->setCheck(false);            uc->setForce_swsurf(false);         }        uc->setForce_hwsurf(forceHwsurfCheckbox->isChecked());    }    else if(widget == hwaccelCheckbox){        uc->setHwaccel(hwaccelCheckbox->isChecked());    }    else if(widget == stencilbufCheckbox){        uc->setStencilbuf(stencilbufCheckbox->isChecked());    }    else if(widget == multitexturingCheckbox){        uc->setMultitexturing(multitexturingCheckbox->isChecked());    }    else if(widget == shadowsML){        uc->setShadows(shadowsML->getCurrentTextInd());        }    else if(widget == saveButton){        uc->saveConfiguration();        if(selectedMode == VIDEO){            changeTakeEffectLabel -> setText("Some changes will only take effect upon restart");                    }           }        setSelectedMode();           return false;}bool OptionsMenu::handleEvent(SDL_Event *event) {  switch(event->type) {  case SDL_MOUSEBUTTONUP:    break;  case SDL_KEYUP:	switch(event->key.keysym.sym) {	case SDLK_ESCAPE:	  if(!ignoreKeyUp){		hide();		return true;	  } else ignoreKeyUp = false;	default:	  break;	}	break;  case SDL_KEYDOWN:        if(waitingForNewKey){        if(event->key.keysym.sym != SDLK_ESCAPE){            int ind;            ind = controlBindingsList->getSelectedLine();                                 string s1 = uc->getEngineActionDescription(ind);                                  string s2 = SDL_GetKeyName(event->key.keysym.sym);              for (unsigned int i = 0; i < s2.length(); i++){                if(s2[i] == ' '){                    s2[i] = '_';                }                        }            uc->setKeyForEngineAction(s2, ind); // update userConfig too            s1 = s1 + "           " + s2;                        strcpy(controlLines[ind], s1.c_str());            controlBindingsList->setLines(nbControlLines, (const char**) controlLines);            controlBindingsList->setSelectedLine(ind);                                                                  } else ignoreKeyUp = true;        waitingLabel->setText(strdup(" "));        waitingForNewKey = false;    }    else{        switch(event->key.keysym.sym) {        case SDLK_RETURN:            if(selectedMode == CONTROLS){                waitingLabel->setText(strdup("Waiting for new key ... Press ESCAPE to cancel"));                        waitingForNewKey = true;              }        /*case SDLK_DOWN:            if(selectedMode == CONTROLS){                int ind = controlBindingsList->getSelectedLine();                ind ++;                controlBindingsList->setSelectedLine(ind);                            }*/                	  return true;        default: break;        }      }  default: break;    }    return false;}OptionsMenu::~OptionsMenu(){           // Only delete ML, scrollingLists and cardContainers.     // Other widgets are deleted by window.cpp           if(gameSpeedML) delete gameSpeedML;    if(videoResolutionML) delete videoResolutionML;    if(controlBindingsList) delete controlBindingsList;    if(cards) delete cards;    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -