Menu
CoddyTech

Cheat sheet pygame

Cập nhật lần cuối

Cài đặt và vòng lặp game

Mọi chương trình pygame đều mở một cửa sổ, rồi lặp lại một vòng lặp cho đến khi người chơi thoát.

Thao tácCode
Cài pygame-cepython3 -m pip install pygame-ce
Import và khởi động pygameimport pygame pygame.init()
Mở cửa sổscreen = pygame.display.set_mode((640, 480))
Đặt tiêu đề cửa sổpygame.display.set_caption("My Game")
Tạo đồng hồclock = pygame.time.Clock()
Vòng lặp gamerunning = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False screen.fill("black") pygame.display.flip() clock.tick(60)
Tắt pygame sau vòng lặppygame.quit()

Hiển thị

Màn hình là một Surface; không có gì hiện ra cho đến khi bạn flip nó.

Thao tácCode
Hiển thị khung hình đã vẽ xongpygame.display.flip()
Chỉ cập nhật một số vùngpygame.display.update([rect1, rect2])
Xóa màn hìnhscreen.fill((30, 30, 46))
Kích thước cửa sổscreen.get_size(), screen.get_width()
Màn hình dưới dạng Rectscreen.get_rect()
Cửa sổ đổi được kích thướcpygame.display.set_mode((640, 480), pygame.RESIZABLE)
Toàn màn hình theo kích thước desktoppygame.display.set_mode((0, 0), pygame.FULLSCREEN)

Màu sắc và vẽ hình

Các hàm pygame.draw nhận một surface, một màu và một vị trí. width=0 sẽ tô kín.

Thao tácCode
Màu dạng RGB(255, 140, 0)
Màu theo tên hoặc mã hex"tomato", "#ff8c00", pygame.Color("gold")
Hình chữ nhậtpygame.draw.rect(screen, "red", (x, y, w, h))
Viền và bo gócpygame.draw.rect(screen, "red", rect, width=2, border_radius=8)
Hình tròn (theo tâm)pygame.draw.circle(screen, "blue", (cx, cy), radius)
Đường thẳngpygame.draw.line(screen, "white", (x1, y1), (x2, y2), 3)
Đa giácpygame.draw.polygon(screen, "green", [(0, 0), (40, 0), (20, 30)])
Hình elip trong một khungpygame.draw.ellipse(screen, "purple", (x, y, w, h))

Rect

Rect lưu vị trí và kích thước dưới dạng số nguyên.

Thao tácCode
Tạo Rectplayer = pygame.Rect(x, y, width, height)
Đặt vị trí theo bất kỳ điểm nàoplayer.center = (320, 240), player.bottom = 400
Cạnh và gócleft, right, top, bottom, topleft, midbottom
Di chuyển tại chỗplayer.move_ip(dx, dy)
Bản sao đã di chuyểnmoved = player.move(dx, dy)
Giữ trong màn hìnhplayer.clamp_ip(screen.get_rect())
Phóng to quanh tâmbigger = player.inflate(20, 20)
Vị trí số thực (pygame-ce)pygame.FRect(10.5, 20.25, 40, 40)

Ảnh, Surface và blit

Nạp ảnh một lần trước vòng lặp, rồi blit chúng mỗi khung hình.

Thao tácCode
Nạp ảnh có nền trong suốtimg = pygame.image.load("player.png").convert_alpha()
Nạp ảnh không trong suốtbg = pygame.image.load("sky.png").convert()
Vẽ ảnhscreen.blit(img, (x, y))
Vẽ ở giữascreen.blit(img, img.get_rect(center=(320, 240)))
Tạo Surface trốngpanel = pygame.Surface((200, 100))
Surface trong suốtlayer = pygame.Surface((200, 100), pygame.SRCALPHA)
Làm mờ cả Surfaceimg.set_alpha(128)
Cắt một khung hình từ sprite sheetframe = sheet.subsurface((0, 0, 32, 32))
Lưu ảnh chụp màn hìnhpygame.image.save(screen, "shot.png")

Biến đổi

Mỗi hàm trả về một Surface mới; hãy biến đổi ảnh gốc, không phải kết quả lần trước.

Thao tácCode
Đổi kích thướcpygame.transform.scale(img, (64, 64))
Phóng theo hệ sốpygame.transform.scale_by(img, 2)
Đổi kích thước mượtpygame.transform.smoothscale(img, (64, 64))
Xoay (ngược chiều kim đồng hồ, theo độ)pygame.transform.rotate(img, 45)
Xoay quanh tâmrotated = pygame.transform.rotate(original, angle) rect = rotated.get_rect(center=rect.center)
Lật ngangpygame.transform.flip(img, True, False)

Sự kiện và bàn phím

Dùng sự kiện cho lần nhấn đơn và get_pressed() cho phím đang được giữ.

Thao tácCode
Đọc sự kiện của khung hình nàyfor event in pygame.event.get():
Cửa sổ bị đóngevent.type == pygame.QUIT
Một phím được nhấnevent.type == pygame.KEYDOWN and event.key == pygame.K_SPACE
Một phím được thảevent.type == pygame.KEYUP
Ký tự được gõevent.unicode
Các phím đang giữkeys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: x -= 5
Hướng đi từ hai phímdx = keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]
Phím vừa nhấn trong khung hình này (pygame-ce)pygame.key.get_just_pressed()[pygame.K_SPACE]
Hằng số phímK_a...K_z, K_0...K_9, K_UP, K_RETURN, K_ESCAPE, K_LSHIFT
Tên của phímpygame.key.name(event.key)
Sự kiện tùy chỉnhHIT = pygame.event.custom_type() pygame.event.post(pygame.event.Event(HIT))

Mouse

Nút: 1 trái, 2 giữa, 3 phải.

Thao tácCode
Một nút được nhấnevent.type == pygame.MOUSEBUTTONDOWN and event.button == 1
Vị trí được nhấnevent.pos
Vị trí con trỏ hiện tạix, y = pygame.mouse.get_pos()
Các nút đang giữleft, middle, right = pygame.mouse.get_pressed()
Chuột di chuyểnevent.type == pygame.MOUSEMOTION, event.rel
Con lăn được cuộnevent.type == pygame.MOUSEWHEEL, event.y
Nhấn vào trong một nút bấmbutton_rect.collidepoint(event.pos)
Ẩn con trỏpygame.mouse.set_visible(False)

Sprite và group

Một sprite giữ image và rect; một group cập nhật và vẽ nhiều sprite cùng lúc.

Thao tácCode
Lớp spriteclass Coin(pygame.sprite.Sprite): def __init__(self, pos): super().__init__() self.image = coin_img self.rect = self.image.get_rect(center=pos)
Tạo groupcoins = pygame.sprite.Group()
Thêm vào groupcoins.add(Coin((100, 50)))
Cập nhật mọi spritecoins.update()
Vẽ mọi spritecoins.draw(screen)
Gỡ sprite khỏi mọi groupcoin.kill()
Group chứa một spriteplayer = pygame.sprite.GroupSingle(Player())

Va chạm

Hai Rect va chạm khi chúng chồng lên nhau; chỉ chạm cạnh thì không tính.

Thao tácCode
Hai hình chữ nhậta.colliderect(b)
Điểm nằm bên trongrect.collidepoint(x, y)
Cái đầu tiên trong nhiều cáirect.collidelist(walls) # index or -1
Sprite với một grouphits = pygame.sprite.spritecollide(player, coins, True)
Có va chạm nào khôngpygame.sprite.spritecollideany(player, enemies)
Group với grouppygame.sprite.groupcollide(bullets, enemies, True, True)
Chính xác đến từng pixelpygame.sprite.spritecollide(a, group, False, pygame.sprite.collide_mask)
Hình trònpygame.Vector2(a).distance_to(b) < r1 + r2

Chữ và font

Render chữ thành một Surface, rồi blit nó.

Thao tácCode
Font mặc địnhfont = pygame.font.Font(None, 36)
Font hệ thốngfont = pygame.font.SysFont("arial", 24)
Tệp fontfont = pygame.font.Font("pixel.ttf", 32)
Render chữtext = font.render("Score: 10", True, "white")
Vẽ ở giữascreen.blit(text, text.get_rect(center=(320, 40)))
Xuống dòng chữ dài (pygame-ce)font.render(story, True, "white", None, 400)
Kích thước mà không cần renderfont.size("Hello")
Các font đã càipygame.font.get_fonts()

Âm thanh và nhạc

Nạp âm thanh một lần. Nhạc phát trực tiếp một bài từ tệp của nó.

Thao tácCode
Nạp âm thanhjump = pygame.mixer.Sound("jump.ogg")
Phát âm thanhjump.play()
Âm lượngjump.set_volume(0.5)
Nạp nhạcpygame.mixer.music.load("theme.ogg")
Lặp nhạc mãi mãipygame.mixer.music.play(-1)
Tạm dừng và tiếp tụcpygame.mixer.music.pause(), pygame.mixer.music.unpause()
Dừng nhạcpygame.mixer.music.stop()

Thời gian và timer

Tick tính bằng mili giây.

Thao tácCode
Giới hạn tốc độ khung hìnhclock.tick(60)
Delta time tính bằng giâydt = clock.tick(60) / 1000
Tốc độ khung hình hiện tạiclock.get_fps()
Số mili giây từ lúc initpygame.time.get_ticks()
Sự kiện timer lặp lạiSPAWN = pygame.event.custom_type() pygame.time.set_timer(SPAWN, 1000)
Timer chạy một lầnpygame.time.set_timer(SPAWN, 2000, loops=1)
Dừng timerpygame.time.set_timer(SPAWN, 0)

Vector2

Số thực cho vị trí và vận tốc.

Thao tácCode
Tạo vectorpos = pygame.Vector2(100, 200)
Di chuyển theo vận tốcpos += velocity * dt
Độ dàivelocity.length()
Cùng tốc độ khi đi chéoif direction.length() > 0: direction = direction.normalize()
Khoảng cách giữa hai điểmpos.distance_to(target)
Xoayvelocity.rotate(90)
Bước về phía một điểm (pygame-ce)pos.move_towards_ip(target, 5)

Những đoạn code pygame bạn cần khi làm game 2D bằng Python, xếp theo việc cần làm: vòng lặp game, cửa sổ hiển thị, màu sắc và vẽ hình, Rect, ảnh và blit, phóng to và xoay, nhập liệu từ bàn phím và chuột, sprite và group, va chạm, chữ, âm thanh, timer và Vector2. Mỗi hàng là một đoạn code ngắn để dán vào, cạnh dòng mô tả nó làm gì.

Mọi thứ ở đây viết cho pygame-ce 2.5, bản cộng đồng của pygame, vẫn import bằng import pygame. Các hàng ghi pygame-ce dùng tính năng bổ sung của bản này; mọi hàng khác cũng chạy trên pygame gốc. Bạn có thể thử bất kỳ đoạn code nào trong pygame playground, nơi chạy pygame ngay trên trình duyệt mà không cần cài đặt gì. Mới làm quen với Python? Hãy bắt đầu với cheat sheet Python.

Câu hỏi thường gặp về cheat sheet pygame

Cheat sheet pygame này có miễn phí không?

Có. Trang này miễn phí, không cần đăng ký. Bạn có thể lưu dấu trang hoặc in ra PDF từ trình duyệt, rồi quay lại bất cứ khi nào cần đúng lệnh cho sprite group, âm thanh hay kiểm tra va chạm.

Cheat sheet này có dùng được cho cả pygame và pygame-ce không?
Có. Cả hai đều import bằng import pygame và dùng chung gần như toàn bộ API. Các hàng ghi pygame-ce (FRect, scale_by, get_just_pressed, xuống dòng chữ và move_towards_ip) cần pygame-ce, còn mọi thứ khác chạy được trên cả hai.
Vì sao cửa sổ pygame không phản hồi?
Vòng lặp game không đọc sự kiện. Hãy gọi pygame.event.get() một lần mỗi khung hình, kể cả khi bạn bỏ qua các sự kiện, và kết thúc mỗi khung hình bằng pygame.display.flip() và clock.tick(60).
Nên dùng sự kiện hay key.get_pressed() để nhận đầu vào?
Dùng sự kiện KEYDOWN cho hành động xảy ra một lần mỗi lần nhấn, như nhảy hay mở menu. Dùng pygame.key.get_pressed() cho hành động kéo dài khi phím còn được giữ, như đi bộ.
Hình minh họa các ngôn ngữ lập trình của Coddy

Học Pygame cùng Coddy

Bắt đầu