From ea10e6ef1272cf35945bc45dbb5933ef3a35a88c Mon Sep 17 00:00:00 2001 From: Qi-huanye <2728290997@qq.com> Date: Sun, 26 Apr 2026 15:12:35 +0800 Subject: [PATCH] =?UTF-8?q?=E7=B2=92=E5=AD=90=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/source/Tetris.cpp | 2 +- src/source/TetrisLogic.cpp | 2 +- src/source/TetrisRender.cpp | 39 ++++++++++++++++++++++++++++++++----- 3 files changed, 36 insertions(+), 7 deletions(-) diff --git a/src/source/Tetris.cpp b/src/source/Tetris.cpp index 5906dca..cc2ad8a 100644 --- a/src/source/Tetris.cpp +++ b/src/source/Tetris.cpp @@ -7,7 +7,7 @@ #define GAME_TIMER_ID 1 #define EFFECT_TIMER_ID 2 #define GAME_TIMER_INTERVAL 500 -#define EFFECT_TIMER_INTERVAL 33 +#define EFFECT_TIMER_INTERVAL 16 HINSTANCE hInst; TCHAR szTitle[MAX_LOADSTRING]; diff --git a/src/source/TetrisLogic.cpp b/src/source/TetrisLogic.cpp index 50ff114..9cb1bcf 100644 --- a/src/source/TetrisLogic.cpp +++ b/src/source/TetrisLogic.cpp @@ -334,7 +334,7 @@ static void AddParticle(int boardX, int boardY, int velocityX, int velocityY, in static void AddBurstParticles(int boardX, int boardY, COLORREF baseColor, bool strongBurst) { - int burstCount = strongBurst ? 5 : 3; + int burstCount = strongBurst ? 4 : 2; for (int i = 0; i < burstCount; i++) { int angleSeed = rand() % 8; diff --git a/src/source/TetrisRender.cpp b/src/source/TetrisRender.cpp index 6d3bcee..631c1b4 100644 --- a/src/source/TetrisRender.cpp +++ b/src/source/TetrisRender.cpp @@ -8,6 +8,32 @@ using namespace Gdiplus; +static HBRUSH GetCachedParticleBrush(COLORREF color) +{ + static COLORREF cachedColors[16] = {}; + static HBRUSH cachedBrushes[16] = {}; + + for (int i = 0; i < 16; i++) + { + if (cachedBrushes[i] != nullptr && cachedColors[i] == color) + { + return cachedBrushes[i]; + } + } + + for (int i = 0; i < 16; i++) + { + if (cachedBrushes[i] == nullptr) + { + cachedColors[i] = color; + cachedBrushes[i] = CreateSolidBrush(color); + return cachedBrushes[i]; + } + } + + return CreateSolidBrush(color); +} + static std::wstring BuildAssetPath(const wchar_t* relativePath) { wchar_t modulePath[MAX_PATH] = {}; @@ -997,10 +1023,14 @@ void TDrawScreen(HDC hdc, HWND hWnd) int elapsed = particleEffects[i].totalTicks - particleEffects[i].ticks; int particleX = gameRect.left + particleEffects[i].boardX * grid / 100 + SS(particleEffects[i].velocityX * elapsed); int particleY = gameRect.top + particleEffects[i].boardY * grid / 100 + SS(particleEffects[i].velocityY * elapsed + elapsed * elapsed / 4); - int particleSize = SS(particleEffects[i].size * particleEffects[i].ticks / particleEffects[i].totalTicks); - if (particleSize < SS(2)) + int particleSize = particleEffects[i].size * particleEffects[i].ticks / particleEffects[i].totalTicks; + if (particleSize < 2) { - particleSize = SS(2); + particleSize = 2; + } + if (particleSize > 6) + { + particleSize = 6; } RECT particleRect = @@ -1011,9 +1041,8 @@ void TDrawScreen(HDC hdc, HWND hWnd) particleY + particleSize }; - HBRUSH particleBrush = CreateSolidBrush(particleEffects[i].color); + HBRUSH particleBrush = GetCachedParticleBrush(particleEffects[i].color); FillRect(hdc, &particleRect, particleBrush); - DeleteObject(particleBrush); } for (int i = 0; i < 8; i++)