|
2 | 2 |
|
3 | 3 | UIController::UIController(GameController* gc) : gameController(gc), showExitDialog(false) {
|
4 | 4 | aboutText = LoadTextFromResource(GetModuleHandle(NULL), IDR_ABOUT_TEXT);
|
| 5 | + gpuAutomaton = &gc->getGPUAutomaton(); |
5 | 6 | }
|
6 | 7 |
|
7 | 8 | void UIController::InitializeUI() {
|
@@ -36,8 +37,19 @@ void UIController::DrawUI() {
|
36 | 37 | ImGui::NewFrame();
|
37 | 38 | //DrawMenuBar();
|
38 | 39 | // ------------------------------------ главное меню игры --------------------------------
|
| 40 | + bool windowWasHovered = false; |
| 41 | + ImGui::SetNextWindowSize(ImVec2(0.0f, 650.0f), ImGuiCond_Always); |
39 | 42 | ImGui::Begin("Управление игрой", NULL, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoTitleBar);
|
40 |
| - ImGui::SetWindowPos(ImVec2(6, 6), ImGuiCond_Once); |
| 43 | + // Проверяем, был ли окно под курсором мыши в прошлый раз |
| 44 | + if (ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_RootWindow)) { |
| 45 | + windowWasHovered = true; |
| 46 | + } |
| 47 | + else if (windowWasHovered) { |
| 48 | + // Если мышь только что покинула область окна, снимаем фокус |
| 49 | + ImGui::SetWindowFocus(NULL); // NULL означает дефокусировку всех окон |
| 50 | + windowWasHovered = false; |
| 51 | + } |
| 52 | + ImGui::SetWindowPos(ImVec2(2, 2), ImGuiCond_Once); |
41 | 53 |
|
42 | 54 | // Находим максимальную ширину текста всех кнопок
|
43 | 55 | ImVec2 maxSize(0, 0);
|
@@ -110,6 +122,42 @@ void UIController::DrawUI() {
|
110 | 122 | }
|
111 | 123 | }
|
112 | 124 | ImGui::Separator();
|
| 125 | + // В UI |
| 126 | + if (gpuAutomaton) { |
| 127 | + ImGui::Text("Правила игры:"); |
| 128 | + ImGui::Separator(); |
| 129 | + ImGui::Text("Рождение"); |
| 130 | + { |
| 131 | + static const char* birthOptions[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8" }; |
| 132 | + ImGui::Combo("##birth", &gpuAutomaton->birth, birthOptions, IM_ARRAYSIZE(birthOptions)); |
| 133 | + } |
| 134 | + ImGui::Separator(); |
| 135 | + ImGui::Text("Выживание (мин)"); |
| 136 | + { |
| 137 | + static const char* survivalMinOptions[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8" }; |
| 138 | + ImGui::Combo("##survivalMin", &gpuAutomaton->survivalMin, survivalMinOptions, IM_ARRAYSIZE(survivalMinOptions)); |
| 139 | + } |
| 140 | + ImGui::Separator(); |
| 141 | + ImGui::Text("Выживание (макс)"); |
| 142 | + { |
| 143 | + static const char* survivalMaxOptions[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8" }; |
| 144 | + ImGui::Combo("##survivalMax", &gpuAutomaton->survivalMax, survivalMaxOptions, IM_ARRAYSIZE(survivalMaxOptions)); |
| 145 | + } |
| 146 | + ImGui::Separator(); |
| 147 | + ImGui::Text("Перенаселение"); |
| 148 | + { |
| 149 | + static int selectedOverPopulation = 3; |
| 150 | + static const char* overpopulationOptions[] = { "1", "2", "3", "4", "5", "6", "7", "8" }; |
| 151 | + if (ImGui::Combo( "##overpopulation", &selectedOverPopulation, overpopulationOptions, IM_ARRAYSIZE(overpopulationOptions)) ) { |
| 152 | + gpuAutomaton->overpopulation = selectedOverPopulation + 1; |
| 153 | + } |
| 154 | + |
| 155 | + } |
| 156 | + } |
| 157 | + else { |
| 158 | + ImGui::Text("GPUAutomaton не инициализирован!"); |
| 159 | + } |
| 160 | + ImGui::Separator(); |
113 | 161 | static char saveFilename[128] = "state.txt";
|
114 | 162 | ImGui::Text("Имя файла");
|
115 | 163 | // Поле ввода с фиксированной шириной
|
|
0 commit comments