From 18674efd8e240d89d0d8221730ba4ac71f616ae0 Mon Sep 17 00:00:00 2001 From: Vladislav Khorev Date: Tue, 10 Mar 2026 18:03:16 +0300 Subject: [PATCH] Working on minor bug fixing --- proj-web/space-game001plain.html | 24 ++++++++++++++++++---- resources/button_players_disabled.png | 3 +++ resources/config/connection_failed.json | 6 +++--- resources/config/connection_lost.json | 6 +++--- resources/config/ui.json | 2 +- resources/game_over/Variant6.png | 4 ++-- resources/game_over/reconnect1.png | 3 +++ resources/game_over/reconnect2.png | 3 +++ resources/game_over/reconnect3.png | 3 +++ resources/player_under.png | 3 +++ resources/players_list_title.png | 3 +++ src/MenuManager.cpp | 3 ++- src/Space.cpp | 27 +++++++++++++++++++++---- src/UiManager.cpp | 19 +++++++++++------ src/render/TextRenderer.cpp | 5 +++++ 15 files changed, 90 insertions(+), 24 deletions(-) create mode 100644 resources/button_players_disabled.png create mode 100644 resources/game_over/reconnect1.png create mode 100644 resources/game_over/reconnect2.png create mode 100644 resources/game_over/reconnect3.png create mode 100644 resources/player_under.png create mode 100644 resources/players_list_title.png diff --git a/proj-web/space-game001plain.html b/proj-web/space-game001plain.html index 8470238..78ab463 100644 --- a/proj-web/space-game001plain.html +++ b/proj-web/space-game001plain.html @@ -68,7 +68,7 @@ color: #fff; cursor: pointer; } - #nickSkip { margin-left: 8px; background: #666; } + @@ -165,6 +165,16 @@ loadGameScript(); } + document.getElementById('fs-button').addEventListener('click', function() { + if (!document.fullscreenElement) { + document.documentElement.requestFullscreen().catch(function(e) { + console.error('Fullscreen error: ' + e.message); + }); + } else { + document.exitFullscreen(); + } + }); + document.addEventListener('DOMContentLoaded', function() { // Готовим Module сразу — даже если откроется модалка, поле canvas будет доступно для скрипта (если он загружается позже) prepareModuleEnvironment(); @@ -183,14 +193,20 @@ // Show modal to request nickname before loading WASM showNickOverlay(); var submit = document.getElementById('nickSubmit'); - var skip = document.getElementById('nickSkip'); var input = document.getElementById('nickInput'); submit.addEventListener('click', function() { saveNickAndStart(input.value); }); - skip.addEventListener('click', function() { - saveNickAndStart('Player'); + + input.addEventListener('input', function() { + // Strip any character that is not a-z, A-Z, 0-9 or space + var pos = this.selectionStart; + var cleaned = this.value.replace(/[^a-zA-Z0-9 ]/g, ''); + if (cleaned !== this.value) { + this.value = cleaned; + this.setSelectionRange(pos - 1, pos - 1); + } }); input.addEventListener('keydown', function(e) { diff --git a/resources/button_players_disabled.png b/resources/button_players_disabled.png new file mode 100644 index 0000000..62d72a8 --- /dev/null +++ b/resources/button_players_disabled.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c79d1300cc5657abbf9f25b481093de1791aaa4ef36dd0c06c0be2cf7352a636 +size 14500 diff --git a/resources/config/connection_failed.json b/resources/config/connection_failed.json index 1ea3df9..9e581a8 100644 --- a/resources/config/connection_failed.json +++ b/resources/config/connection_failed.json @@ -27,9 +27,9 @@ "horizontal_gravity": "center", "vertical_gravity": "center", "textures": { - "normal": "resources/game_over/Filledbuttons.png", - "hover": "resources/game_over/Variant5.png", - "pressed": "resources/game_over/Variant6.png" + "normal": "resources/game_over/reconnect1.png", + "hover": "resources/game_over/reconnect2.png", + "pressed": "resources/game_over/reconnect3.png" } }, { diff --git a/resources/config/connection_lost.json b/resources/config/connection_lost.json index fd84d8a..5768a12 100644 --- a/resources/config/connection_lost.json +++ b/resources/config/connection_lost.json @@ -27,9 +27,9 @@ "horizontal_gravity": "center", "vertical_gravity": "center", "textures": { - "normal": "resources/game_over/Filledbuttons.png", - "hover": "resources/game_over/Variant5.png", - "pressed": "resources/game_over/Variant6.png" + "normal": "resources/game_over/reconnect1.png", + "hover": "resources/game_over/reconnect2.png", + "pressed": "resources/game_over/reconnect3.png" } }, { diff --git a/resources/config/ui.json b/resources/config/ui.json index cd93cb6..6fedd60 100644 --- a/resources/config/ui.json +++ b/resources/config/ui.json @@ -38,7 +38,7 @@ "normal": "resources/button_players.png", "hover": "resources/button_players.png", "pressed": "resources/button_players.png", - "disabled": "resources/button_players.png" + "disabled": "resources/button_players_disabled.png" } }, { diff --git a/resources/game_over/Variant6.png b/resources/game_over/Variant6.png index 58beb4f..d2425b2 100644 --- a/resources/game_over/Variant6.png +++ b/resources/game_over/Variant6.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c2d3e1fb2e45fe0a5641784a65606114a8a0343a3e45a11141f331a38e1bdd88 -size 9597 +oid sha256:5a804d4dea55d56b6e3b630f203a7b2ede97be74352095bb85d10632f575c440 +size 7936 diff --git a/resources/game_over/reconnect1.png b/resources/game_over/reconnect1.png new file mode 100644 index 0000000..9711462 --- /dev/null +++ b/resources/game_over/reconnect1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:29f7c0eadfe4b2e034850d40f46a6e7901a480f62da93dcccd547cbda5846a48 +size 5568 diff --git a/resources/game_over/reconnect2.png b/resources/game_over/reconnect2.png new file mode 100644 index 0000000..53c828b --- /dev/null +++ b/resources/game_over/reconnect2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3c76eaf6416be437e729729518e199cfe5101837c2c1ba2b9b69b392e767a86e +size 6260 diff --git a/resources/game_over/reconnect3.png b/resources/game_over/reconnect3.png new file mode 100644 index 0000000..ab3837d --- /dev/null +++ b/resources/game_over/reconnect3.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f2ba9cba6cb0933a53a576b43c20b30c02cbfe5bdb1b7abe0c20d7d28800e9b3 +size 5563 diff --git a/resources/player_under.png b/resources/player_under.png new file mode 100644 index 0000000..1c94a6f --- /dev/null +++ b/resources/player_under.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4523bafed5903a24e169499199a7db253a795a242e252477bfb5eeeb2a37f98b +size 477 diff --git a/resources/players_list_title.png b/resources/players_list_title.png new file mode 100644 index 0000000..33aa19b --- /dev/null +++ b/resources/players_list_title.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d132a16eda09819f0bef71a333e1249be8350283c8c829dca3b70ad165c52e3f +size 2039 diff --git a/src/MenuManager.cpp b/src/MenuManager.cpp index d5ffda1..8f5d646 100644 --- a/src/MenuManager.cpp +++ b/src/MenuManager.cpp @@ -289,7 +289,8 @@ namespace ZL { uiManager.replaceRoot(connectionLostRoot); uiManager.setButtonCallback("reconnectButton", [this](const std::string&) { - // TODO: reconnect logic + enterConnecting(); + if (onMultiplayerPressed) onMultiplayerPressed(pendingMultiNick, pendingMultiShipType); }); uiManager.setButtonCallback("exitServerButton", [this](const std::string&) { enterMainMenu(); diff --git a/src/Space.cpp b/src/Space.cpp index a3222a1..cebd4b1 100644 --- a/src/Space.cpp +++ b/src/Space.cpp @@ -1796,7 +1796,9 @@ namespace ZL shipAlive = false; gameOver = true; + Environment::shipState.selectedVelocity = 0; Environment::shipState.velocity = 0.0f; + newShipVelocity = 0; showExplosion = true; explosionEmitter.setUseWorldSpace(true); @@ -2160,8 +2162,8 @@ namespace ZL std::shared_ptr Space::buildPlayerListRoot() { - const float btnW = 400; - const float btnH = 50.0f; + const float btnW = 250; + const float btnH = 40.0f; // Collect alive remote players std::vector> players; @@ -2178,7 +2180,7 @@ namespace ZL root->height = -1.0f; // List container: LinearLayout vertical, centered - float listH = btnH * (float)players.size(); + float listH = btnH * (float)(players.size()+1); auto listNode = std::make_shared(); listNode->name = "playerList"; listNode->layoutType = LayoutType::Linear; @@ -2188,6 +2190,20 @@ namespace ZL listNode->layoutSettings.hGravity = HorizontalGravity::Center; listNode->layoutSettings.vGravity = VerticalGravity::Center; + auto titleNode = std::make_shared(); + titleNode->name = "player_list_title"; + titleNode->layoutType = LayoutType::Frame; + titleNode->width = btnW; + titleNode->height = btnH; + auto titleImage = std::make_shared(); + titleImage->name = "player_list_title"; + titleImage->texNormal = std::make_unique(CreateTextureDataFromPng("resources/players_list_title.png", "")); + titleImage->texPressed = titleImage->texNormal; + titleImage->texHover = titleImage->texNormal; + titleNode->button = titleImage; + + listNode->children.push_back(titleNode); + for (auto& [pid, nick] : players) { auto btnNode = std::make_shared(); btnNode->name = "playerBtn_" + std::to_string(pid); @@ -2206,7 +2222,7 @@ namespace ZL if (!tb->textRenderer->init(renderer, tb->fontPath, tb->fontSize, CONST_ZIP_FILE)) { std::cerr << "Failed to init TextRenderer for TextField: " << tb->name << std::endl; } - //tb->texNormal = std::make_unique(CreateTextureDataFromPng("resources/black.png", "")); + tb->texNormal = std::make_unique(CreateTextureDataFromPng("resources/player_under.png", CONST_ZIP_FILE)); btnNode->textButton = tb; /*auto button = std::make_shared(); @@ -2266,6 +2282,9 @@ namespace ZL menuManager.uiManager.setTextButtonCallback("playerListBackdrop", [this](const std::string&) { closePlayerList(); }); + menuManager.uiManager.setTextButtonCallback("player_list_title", [this](const std::string&) { + closePlayerList(); + }); } void Space::closePlayerList() diff --git a/src/UiManager.cpp b/src/UiManager.cpp index 734ddd6..81b2b9f 100644 --- a/src/UiManager.cpp +++ b/src/UiManager.cpp @@ -103,10 +103,7 @@ namespace ZL { } void UiTextButton::draw(Renderer& renderer) const { - renderer.PushMatrix(); - renderer.TranslateMatrix({ animOffsetX, animOffsetY, 0.0f }); - renderer.ScaleMatrix({ animScaleX, animScaleY, 1.0f }); - + // Draw background texture (optional) const std::shared_ptr* tex = nullptr; switch (state) { @@ -115,20 +112,30 @@ namespace ZL { case ButtonState::Pressed: tex = texPressed ? &texPressed : (texNormal ? &texNormal : nullptr); break; case ButtonState::Disabled: tex = texDisabled ? &texDisabled : (texNormal ? &texNormal : nullptr); break; } + glDisable(GL_DEPTH_TEST); if (tex && *tex) { + renderer.shaderManager.PushShader(defaultShaderName); + + renderer.PushMatrix(); + renderer.TranslateMatrix({ animOffsetX, animOffsetY, 0.0f }); + renderer.ScaleMatrix({ animScaleX, animScaleY, 1.0f }); + renderer.RenderUniform1i(textureUniformName, 0); glBindTexture(GL_TEXTURE_2D, (*tex)->getTexID()); renderer.DrawVertexRenderStruct(mesh); + renderer.PopMatrix(); + renderer.shaderManager.PopShader(); + } - renderer.PopMatrix(); - + // Draw text on top (uses absolute coords, add anim offset manually) if (textRenderer && !text.empty()) { float cx = rect.x + rect.w / 2.0f + animOffsetX; float cy = rect.y + rect.h / 2.0f + animOffsetY; textRenderer->drawText(text, cx, cy, 1.0f, textCentered, color); } + glEnable(GL_DEPTH_TEST); } void UiSlider::buildTrackMesh() { diff --git a/src/render/TextRenderer.cpp b/src/render/TextRenderer.cpp index 6e1c0ea..534e866 100644 --- a/src/render/TextRenderer.cpp +++ b/src/render/TextRenderer.cpp @@ -361,6 +361,8 @@ void TextRenderer::drawText(const std::string& text, float x, float y, float sca // 4. Рендеринг r->shaderManager.PushShader(shaderName); + //r->PushMatrix(); + //r->LoadIdentity(); // Матрица проекции — используем виртуальные проекционные размеры, // чтобы координаты текста были независимы от физического разрешения экрана. @@ -373,6 +375,8 @@ void TextRenderer::drawText(const std::string& text, float x, float y, float sca proj(0, 3) = -1.0f + 2.0f * (tx) / W; proj(1, 3) = -1.0f + 2.0f * (ty) / H; + //cached.mesh.RefreshVBO(); + r->RenderUniformMatrix4fv("uProjection", false, proj.data()); r->RenderUniform1i("uText", 0); r->RenderUniform4fv("uColor", color.data()); @@ -397,6 +401,7 @@ void TextRenderer::drawText(const std::string& text, float x, float y, float sca // glDrawArrays(GL_TRIANGLES, 0, 6); //} r->DrawVertexRenderStruct(cached.mesh); + //r->PopMatrix(); r->shaderManager.PopShader(); // Сброс бинда текстуры не обязателен, но можно для чистоты