--- type: slide --- # pygame ![image](https://hackmd.io/_uploads/SkDod5mk0.png =800x) --- ## 今日範例 [下載](https://github.com/Fudge0625/CRC-pygame/archive/refs/heads/main.zip) --- ## 安裝環境 ```bash pip install pygame pygbag ``` --- ## 執行 ```bash python main.py # 或是 wasm pygbag . ``` --- 讓我們一步一步地解釋它: `import pygame`:這將導入pygame模組,用於建立視窗和處理圖形輸出。 `import asyncio`:這將導入asyncio模組,用於處理非同步事件。 --- `async def main():`: 這定義了一個名為main的異步函數。 `BLACK, WHITE = (0, 0, 0), (255, 255, 255)`: 定義了黑色和白色的顏色。 `FPS = 240`:設置了每秒幀數。 --- `RES = W, H = 280, 280`:設置了視窗的寬度和高度。 `paint_board = (28, 28)`:定義了畫板的大小。 `pixel_w, pixel_h = W / paint_board[0], H / paint_board[1]`:計算了每個像素的寬度和高度。 --- `pygame.init()`:初始化pygame庫。 `clock = pygame.time.Clock()`:建立了一個時鐘對象,用於控制遊戲循環的速度。 `screen = pygame.display.set_mode((RES))`:建立了一個指定大小的視窗。 `screen.fill(WHITE)`:將視窗填充為白色。 --- `img = [[0] * paint_board[1] for _ in range(paint_board[0])]`:建立了一個二維列表img,用於存儲畫板上每個像素的顏色值。 `running = True`:設置了一個變數來表示遊戲是否正在運行。 `while running:`:進入了主循環。 `clock.tick(FPS)`:限制遊戲的幀數。 --- `pygame.display.set_caption("FPS: {:.2f}".format(clock.get_fps()))`:設置了視窗的標題,顯示當前幀數。 --- `mouse_pos = pygame.mouse.get_pos()`:獲取滑鼠的位置。 `mouse_pressed` = pygame.mouse.get_pressed():獲取滑鼠按鍵的狀態。 `if mouse_pressed[0]:`:如果滑鼠左鍵被按下: --- `x, y = int(mouse_pos[0] // pixel_w), int(mouse_pos[1] // pixel_h)`:計算當前滑鼠位置對應到畫板上的像素位置。 `img[x][y] = 255`:將對應的像素設置為黑色。 --- `paint = pygame.Rect((x * pixel_w, y * pixel_h), (pixel_w, pixel_h))`:建立一個矩形,表示要繪製的像素。 `pygame.draw.rect(screen, BLACK, paint)`:在視窗上繪製矩形,顏色為黑色。 --- `for event in pygame.event.get():`:遍歷所有pygame事件。 如果有鍵盤按下事件: 如果按下的是"d"鍵:清空畫板。 如果按下的是"s"鍵:將畫板保存為圖片。 如果有退出事件:將`running`設置為`False`,退出主循環。 --- `pygame.display.update()`:更新視窗。 `await asyncio.sleep(0)`:暫停異步運行以等待下一次迭代。 `pygame.quit()`:關閉pygame庫。 `if __name__ == "__main__":`:確保這段程式碼只有在直接運行時才執行。 `asyncio.run(main())`:運行main()函數作為異步任務。