Pygame象棋游戏侧边栏Surface无法显示问题求助
Hey there! Let's break down why your sidebar isn't appearing when you press the S key, and walk through the fixes step by step.
1. Your Sidebar Is Drawing Outside the Visible Screen
Right now, you're blitting the sidebar Surface to (HEIGHT, WIDTH) — which is (512, 512) for your window. Since your game window is exactly 512x512, this coordinate is outside the window entirely, so you can't see the blue square. You need to place it within the window's bounds. For example, to stick it on the right edge of the board:
# Draw at the right edge, full height of the window screen.blit(b, (WIDTH - SQ_SIZE, 0))
2. The Game Board Is Overwriting Your Sidebar
Your drawGameState function runs every frame, and it starts by redrawing the entire chess board (which fills the whole window). This means even if you drew the sidebar, it gets erased immediately in the next frame. You need to move the sidebar drawing logic after drawGameState so it renders on top of the board, or integrate it into your main drawing flow.
3. Hiding the Sidebar Doesn't Trigger a Redraw
When you press S to hide the sidebar, you only toggle the sidebar variable — you don't tell Pygame to refresh the screen. While the next frame's drawGameState will eventually overwrite it, it's cleaner to handle the state toggle properly.
Updated Working Code Snippets
Let's rewrite the relevant parts to fix these issues:
First, Update the Keyboard Event Handling
Simplify the S key logic to just toggle the sidebar state (no need for separate if/elif checks):
elif e.type == p.KEYDOWN: # Keep your existing Z/R key logic here... if e.key == p.K_s: sidebar = not sidebar print('show sidebar' if sidebar else 'hide sidebar')
Then, Add Sidebar Drawing to Your Main Render Loop
Move the sidebar drawing to after drawGameState so it renders on top of the board every frame (if enabled):
# Inside your main while loop, after calling drawGameState drawGameState(screen, gs, validMoves, sqSelected) # Draw sidebar if enabled if sidebar: # Create a full-height sidebar (adjust width as needed) sidebar_surf = p.Surface((SQ_SIZE, HEIGHT)) sidebar_surf.fill(p.Color('blue')) screen.blit(sidebar_surf, (WIDTH - SQ_SIZE, 0)) # Keep your game over text drawing logic here...
Bonus Optimization Tips
- For better performance, create the sidebar Surface once at the start of
main()instead of recreating it every frame. - To make it a proper menu, add text buttons using
pygame.font(e.g., "New Game", "Undo", "Quit") on the sidebar. - Adjust the sidebar width to something more noticeable, like
WIDTH // 4instead ofSQ_SIZE.
After these changes, pressing the S key should toggle your blue sidebar on and off correctly, without it being erased by the chess board.
内容的提问来源于stack exchange,提问作者AG-88301

