Vẽ vòng tròn trong python

Trong bài hướng dẫn trước, mình đã giới thiệu khá nhiều thứ trong pygame. Trong bài hướng dẫn lần này, chúng ta sẽ tiếp tục tìm hiểu những cơ bản khác của pygame. Đây là những phần các bạn cần nắm để có thể làm một trò chơi hoàn chỉnh, bao gồm. cách thêm hình ảnh vào trò chơi, tạo chuyển động trong trò chơi, bắt sự kiện,. Bây giờ chúng ta cùng bắt đầu thôi

Một số hàm vẽ thông thường

Trong bài hướng dẫn trước chúng ta đã tìm hiểu kỹ cách vẽ một hình chữ nhật. Trong phần này mình sẽ giới thiệu nhanh qua các hàm vẽ thường dùng trong pygame. Thực tế, trong trò chơi, người ta ít sử dụng các hàm để vẽ những hình ảnh đó, mà người ta sẽ sử dụng những tệp ảnh đó để thêm vào trong trò chơi. Mình thì sử dụng các hàm vẽ này trong lúc kiểm tra hoạt động của trò chơi trước khi đặt các hình ảnh vào. Ví dụ, nếu mình muốn làm game Flappy Bird thì mình sẽ vẽ con chim là hình elip trước, sau khi mọi thứ hoạt động ổn định thì mình sẽ tìm hình con chim để thay thế. Cách thêm hình ảnh vào thì mình sẽ nói ở phần sau. Giờ các bạn hãy xem nhanh qua đoạn code này nhé

import pygame, sys
from pygame.locals import *

pygame.init()

DISPLAYSURF = pygame.display.set_mode((400, 300))
pygame.display.set_caption('Draw')

# Tạo sẵn các màu sắc
BLACK = (  0,   0,   0)
WHITE = (255, 255, 255)
RED   = (255,   0,   0)
GREEN = (  0, 255,   0)
BLUE  = (  0,   0, 255)

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    
    DISPLAYSURF.fill(WHITE)

    pygame.draw.rect(DISPLAYSURF, RED, (10, 10, 100, 50))# Hình chữ nhật
    pygame.draw.rect(DISPLAYSURF, GREEN, (150, 10, 100, 50), 2)# Hình chữ nhật rỗng
    pygame.draw.circle(DISPLAYSURF, RED, (50, 100), 20) # Hình tròn
    pygame.draw.circle(DISPLAYSURF, BLUE, (200, 100), 20, 1)# Hình tròn rỗng
    pygame.draw.ellipse(DISPLAYSURF, RED, (10, 150, 100, 50))# Hình elip
    pygame.draw.ellipse(DISPLAYSURF, GREEN, (150, 150, 100, 50), 3)# Hình elip rỗng
    pygame.draw.polygon(DISPLAYSURF, RED, ((10, 220), (150, 230), (100 ,290), (30, 270)))# Đa giác
    pygame.draw.polygon(DISPLAYSURF, BLUE, ((160, 220), (300, 230), (250 ,290), (180, 270)), 2)# Đa giác rỗng
    pygame.draw.line(DISPLAYSURF, BLACK, (300, 50), (350, 150), 4)# Đoạn thẳng

    pygame.display.update()

Đây là kết quả khi chạy đoạn mã trên

Vẽ vòng tròn trong python

Hàm vẽ chữ nhật đã được giới thiệu ở phần trước. Bây giờ chúng ta đang tìm hiểu các hàm vẽ khác

pygame. vẽ tranh. circle(bề mặt, màu sắc, tâm, bán kính, chiều rộng) Hàm này dùng để vẽ hình tròn

  • bề mặt là nơi để vẽ lên
  • color is color was drawing
  • center is a tuple (or list) can be current to the round of center
  • bán kính là bán kính hình tròn
  • chiều rộng là độ dày nét vẽ (tương tự như chữ nhật)

pygame. vẽ tranh. ellipse(surface, color, rect, width) Hàm này dùng để vẽ hình elip

  • bề mặt là nơi để vẽ lên
  • color is color for drawing
  • rect is a tuple (or list) bao gồm 4 phần tử là các thông số hình chữ nhật (như đã tìm hiểu ở phần trước). Hình elip được vẽ nội tiếp hình chữ nhật đó
  • chiều rộng là độ dày nét vẽ (tương tự hình chữ nhật)

pygame. vẽ tranh. đa giác(bề mặt, màu sắc, điểm, chiều rộng) Hàm này dùng để vẽ đa giác

  • bề mặt là nơi để vẽ lên
  • color is color was drawing
  • điểm là bộ (hoặc danh sách) có thể hiển thị các đỉnh của đa giác. Mỗi đỉnh là một bộ (hoặc danh sách) có thể hiển thị mức độ
  • chiều rộng là độ dày nét vẽ (tương tự như chữ nhật)

pygame. vẽ tranh. line(surface, color, start_pos, end_pos, width) Hàm này dùng để vẽ một đoạn thẳng

  • bề mặt là nơi để vẽ lên
  • color is color was drawing
  • start_pos is tuple (or list) could show the start of point of the lines
  • end_pos is tuple (or list) could show the end of the end of the phase
  • width is thước dày nét vẽ

Các bạn lưu ý là các giá trị về độ dài hay độ dài là các số nguyên, đơn vị là pixel

Tạo chuyển động trong trò chơi

Sau khi tìm hiểu qua một số hàm vẽ, chúng ta đã vẽ được vài thứ trên màn hình. Bây giờ, các bạn sẽ tìm hiểu cách làm cho các hình ảnh chuyển động. Các bạn chạy thử đoạn code này nhé, mình sẽ giải thích sau

import pygame, sys
from pygame.locals import *

WINDOWWIDTH = 400 # Chiều dài cửa sổ
WINDOWHEIGHT = 300 # Chiều cao cửa sổ

WHITE = (255, 255, 255)
RED   = (255,   0,   0)
GREEN = (  0, 255,   0)

pygame.init()

### Xác định FPS ###
FPS = 60
fpsClock = pygame.time.Clock()

DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set_caption('Animation')

### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)


while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    
    DISPLAYSURF.fill(WHITE)
    DISPLAYSURF.blit(carSurface, (car_x, 100))

    ### Thay đổi vị trí xe ###
    car_x += 2
    if car_x + 100 > WINDOWWIDTH:
        car_x = WINDOWWIDTH - 100

    pygame.display.update()
    fpsClock.tick(FPS)

This is results

Trước khi tìm hiểu các dòng code thì các bạn cần biết thêm 1 khái niệm là FPS (Frames Per Second). Hiểu theo nghĩa tiếng Việt thì FPS là lượng khung hình trong 1 giây. Ví dụ. nếu FPS là 60 thì trong 1 giây sẽ có 60 khung hình xuất hiện liên tiếp. Có thể ai cũng biết vòng lặp trong khi chạy rất nhanh, trong 1 giây sẽ lặp rất nhiều lần và tốc độ phụ thuộc vào nhiều yếu tố như mã trong vòng lặp, CPU. Vì thế để đảm bảo trò chơi hoạt động ổn định thì cần phải thiết lập FPS để vòng lặp trò chơi thực hiện với tốc độ định trước. Để thiết lập FPS, các bạn hãy chú ý những dòng code sau

  • Đặt 2 dòng này bên ngoài vòng lặp trò chơi, trường hợp này thì FPS là 60
FPS = 60
fpsClock = pygame.time.Clock()
  • Set this line on the end of the game
fpsClock.tick(FPS)

Các dòng mã trên hoạt động thế nào thì các bạn có thể tự tìm hiểu thêm nhé

Bây giờ chúng ta hãy tìm hiểu những dòng code khác

### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)

Những dòng mã trên được sử dụng để tạo một bề mặt chứa hình chiếc xe. Biến

import pygame, sys
from pygame.locals import *

WINDOWWIDTH = 400 # Chiều dài cửa sổ
WINDOWHEIGHT = 300 # Chiều cao cửa sổ

WHITE = (255, 255, 255)
RED   = (255,   0,   0)
GREEN = (  0, 255,   0)

pygame.init()

### Xác định FPS ###
FPS = 60
fpsClock = pygame.time.Clock()

DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set_caption('Animation')

### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)


while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    
    DISPLAYSURF.fill(WHITE)
    DISPLAYSURF.blit(carSurface, (car_x, 100))

    ### Thay đổi vị trí xe ###
    car_x += 2
    if car_x + 100 > WINDOWWIDTH:
        car_x = WINDOWWIDTH - 100

    pygame.display.update()
    fpsClock.tick(FPS)
7 là độ phóng đại của xe, dựa vào biến này để vẽ xe, vì muốn thay đổi vị trí của xe thì cần phải thay đổi biến này. Biến
import pygame, sys
from pygame.locals import *

WINDOWWIDTH = 400 # Chiều dài cửa sổ
WINDOWHEIGHT = 300 # Chiều cao cửa sổ

WHITE = (255, 255, 255)
RED   = (255,   0,   0)
GREEN = (  0, 255,   0)

pygame.init()

### Xác định FPS ###
FPS = 60
fpsClock = pygame.time.Clock()

DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set_caption('Animation')

### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)


while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    
    DISPLAYSURF.fill(WHITE)
    DISPLAYSURF.blit(carSurface, (car_x, 100))

    ### Thay đổi vị trí xe ###
    car_x += 2
    if car_x + 100 > WINDOWWIDTH:
        car_x = WINDOWWIDTH - 100

    pygame.display.update()
    fpsClock.tick(FPS)
8 đại diện cho bề mặt của xe, biến này được truyền vào các hàm vẽ bên dưới. Khi tạo bề mặt thì có một điểm khác với phần trước là có thêm tham số
import pygame, sys
from pygame.locals import *

WINDOWWIDTH = 400 # Chiều dài cửa sổ
WINDOWHEIGHT = 300 # Chiều cao cửa sổ

WHITE = (255, 255, 255)
RED   = (255,   0,   0)
GREEN = (  0, 255,   0)

pygame.init()

### Xác định FPS ###
FPS = 60
fpsClock = pygame.time.Clock()

DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set_caption('Animation')

### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)


while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    
    DISPLAYSURF.fill(WHITE)
    DISPLAYSURF.blit(carSurface, (car_x, 100))

    ### Thay đổi vị trí xe ###
    car_x += 2
    if car_x + 100 > WINDOWWIDTH:
        car_x = WINDOWWIDTH - 100

    pygame.display.update()
    fpsClock.tick(FPS)
9 được truyền vào.
import pygame, sys
from pygame.locals import *

WINDOWWIDTH = 400 # Chiều dài cửa sổ
WINDOWHEIGHT = 300 # Chiều cao cửa sổ

WHITE = (255, 255, 255)
RED   = (255,   0,   0)
GREEN = (  0, 255,   0)

pygame.init()

### Xác định FPS ###
FPS = 60
fpsClock = pygame.time.Clock()

DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set_caption('Animation')

### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)


while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    
    DISPLAYSURF.fill(WHITE)
    DISPLAYSURF.blit(carSurface, (car_x, 100))

    ### Thay đổi vị trí xe ###
    car_x += 2
    if car_x + 100 > WINDOWWIDTH:
        car_x = WINDOWWIDTH - 100

    pygame.display.update()
    fpsClock.tick(FPS)
9 dùng để xác định đây là 1 bề mặt có đặc tính trong suốt, nếu không có tham số này thì bề mặt sẽ có 1 màu nền đen, các bạn có thể bỏ qua
import pygame, sys
from pygame.locals import *

WINDOWWIDTH = 400 # Chiều dài cửa sổ
WINDOWHEIGHT = 300 # Chiều cao cửa sổ

WHITE = (255, 255, 255)
RED   = (255,   0,   0)
GREEN = (  0, 255,   0)

pygame.init()

### Xác định FPS ###
FPS = 60
fpsClock = pygame.time.Clock()

DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set_caption('Animation')

### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)


while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    
    DISPLAYSURF.fill(WHITE)
    DISPLAYSURF.blit(carSurface, (car_x, 100))

    ### Thay đổi vị trí xe ###
    car_x += 2
    if car_x + 100 > WINDOWWIDTH:
        car_x = WINDOWWIDTH - 100

    pygame.display.update()
    fpsClock.tick(FPS)
9 và chạy lại để thấy sự khác biệt. Các hàm bên dưới dùng để vẽ các hình lên
import pygame, sys
from pygame.locals import *

WINDOWWIDTH = 400 # Chiều dài cửa sổ
WINDOWHEIGHT = 300 # Chiều cao cửa sổ

WHITE = (255, 255, 255)
RED   = (255,   0,   0)
GREEN = (  0, 255,   0)

pygame.init()

### Xác định FPS ###
FPS = 60
fpsClock = pygame.time.Clock()

DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set_caption('Animation')

### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)


while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    
    DISPLAYSURF.fill(WHITE)
    DISPLAYSURF.blit(carSurface, (car_x, 100))

    ### Thay đổi vị trí xe ###
    car_x += 2
    if car_x + 100 > WINDOWWIDTH:
        car_x = WINDOWWIDTH - 100

    pygame.display.update()
    fpsClock.tick(FPS)
8 để tạo thành xe. Qua đây có thể thấy rõ lợi ích của việc sử dụng bề mặt, bề mặt được tạo bên ngoài trò chơi vòng lặp và được vẽ sẵn lên đó, vì thế trong trò chơi vòng lặp chỉ cần thay đổi vị trí cả bề mặt mà không cần chỉnh sửa lại từng hình đã có

Bây giờ hãy nhìn vào bên trong trò chơi vòng lặp nhé

import pygame, sys
from pygame.locals import *

WINDOWWIDTH = 400 # Chiều dài cửa sổ
WINDOWHEIGHT = 300 # Chiều cao cửa sổ

WHITE = (255, 255, 255)
RED   = (255,   0,   0)
GREEN = (  0, 255,   0)

pygame.init()

### Xác định FPS ###
FPS = 60
fpsClock = pygame.time.Clock()

DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set_caption('Animation')

### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)


while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    
    DISPLAYSURF.fill(WHITE)
    DISPLAYSURF.blit(carSurface, (car_x, 100))

    ### Thay đổi vị trí xe ###
    car_x += 2
    if car_x + 100 > WINDOWWIDTH:
        car_x = WINDOWWIDTH - 100

    pygame.display.update()
    fpsClock.tick(FPS)
1

Dòng mã trên để vẽ xe (

import pygame, sys
from pygame.locals import *

WINDOWWIDTH = 400 # Chiều dài cửa sổ
WINDOWHEIGHT = 300 # Chiều cao cửa sổ

WHITE = (255, 255, 255)
RED   = (255,   0,   0)
GREEN = (  0, 255,   0)

pygame.init()

### Xác định FPS ###
FPS = 60
fpsClock = pygame.time.Clock()

DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set_caption('Animation')

### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)


while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    
    DISPLAYSURF.fill(WHITE)
    DISPLAYSURF.blit(carSurface, (car_x, 100))

    ### Thay đổi vị trí xe ###
    car_x += 2
    if car_x + 100 > WINDOWWIDTH:
        car_x = WINDOWWIDTH - 100

    pygame.display.update()
    fpsClock.tick(FPS)
8) lên cửa sổ (
FPS = 60
fpsClock = pygame.time.Clock()
4). Vị trí vẽ có độ phóng đại là
import pygame, sys
from pygame.locals import *

WINDOWWIDTH = 400 # Chiều dài cửa sổ
WINDOWHEIGHT = 300 # Chiều cao cửa sổ

WHITE = (255, 255, 255)
RED   = (255,   0,   0)
GREEN = (  0, 255,   0)

pygame.init()

### Xác định FPS ###
FPS = 60
fpsClock = pygame.time.Clock()

DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set_caption('Animation')

### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)


while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    
    DISPLAYSURF.fill(WHITE)
    DISPLAYSURF.blit(carSurface, (car_x, 100))

    ### Thay đổi vị trí xe ###
    car_x += 2
    if car_x + 100 > WINDOWWIDTH:
        car_x = WINDOWWIDTH - 100

    pygame.display.update()
    fpsClock.tick(FPS)
7, biến này sẽ được thay đổi để tạo chuyển động cho xe. Thay thế nào thì xem đoạn mã bên dưới nhé

import pygame, sys
from pygame.locals import *

WINDOWWIDTH = 400 # Chiều dài cửa sổ
WINDOWHEIGHT = 300 # Chiều cao cửa sổ

WHITE = (255, 255, 255)
RED   = (255,   0,   0)
GREEN = (  0, 255,   0)

pygame.init()

### Xác định FPS ###
FPS = 60
fpsClock = pygame.time.Clock()

DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set_caption('Animation')

### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)


while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    
    DISPLAYSURF.fill(WHITE)
    DISPLAYSURF.blit(carSurface, (car_x, 100))

    ### Thay đổi vị trí xe ###
    car_x += 2
    if car_x + 100 > WINDOWWIDTH:
        car_x = WINDOWWIDTH - 100

    pygame.display.update()
    fpsClock.tick(FPS)
5

Sau mỗi vòng lặp thì độ phóng đại của xe tăng lên 2 pixel. Điều kiện trong

FPS = 60
fpsClock = pygame.time.Clock()
6 để cho xe không chạy ra ngoài màn hình, khi phần đầu của xe ra khỏi màn hình thì vẽ xe ra phía sau bên phải. Do đó có thể tạo chuyển động cho xe rồi. Đơn giản quá đúng không nhỉ

Sẵn đây mình cũng sẽ giới thiệu cho các bạn cách dùng lớp cho đoạn mã xe. Việc sử dụng lớp sẽ giúp quản lý các đối tượng trong trò chơi dễ dàng hơn. Các bạn chạy thử đoạn mã này nhé. Kết quả chạy thì cũng như trên thôi.

import pygame, sys
from pygame.locals import *

WINDOWWIDTH = 400 # Chiều dài cửa sổ
WINDOWHEIGHT = 300 # Chiều cao cửa sổ

WHITE = (255, 255, 255)
RED   = (255,   0,   0)
GREEN = (  0, 255,   0)

pygame.init()

### Xác định FPS ###
FPS = 60
fpsClock = pygame.time.Clock()

DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set_caption('Animation')

### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)


while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    
    DISPLAYSURF.fill(WHITE)
    DISPLAYSURF.blit(carSurface, (car_x, 100))

    ### Thay đổi vị trí xe ###
    car_x += 2
    if car_x + 100 > WINDOWWIDTH:
        car_x = WINDOWWIDTH - 100

    pygame.display.update()
    fpsClock.tick(FPS)
7

Các bạn có thể dễ dàng nhận ra vị trí của xe (

FPS = 60
fpsClock = pygame.time.Clock()
7) và bề mặt của xe (
FPS = 60
fpsClock = pygame.time.Clock()
8) được tạo trong hàm khởi tạo
FPS = 60
fpsClock = pygame.time.Clock()
9. Có 2 hàm là
fpsClock.tick(FPS)
0 và
fpsClock.tick(FPS)
1 có tác dụng là vẽ và thay đổi vị trí của xe. Đây cũng là cấu trúc cơ bản của một đối tượng khi thiết lập trò chơi. Tất nhiên là những đối tượng khác nhau có thể có những cấu trúc khác nhau hơn, có những hàm đặc biệt hơn

vẽ chữ

Phần này cũng không quá phức tạp nên mình sẽ lướt nhanh nhé. Các bạn hãy chạy thử đoạn mã và xem kết quả

FPS = 60
fpsClock = pygame.time.Clock()
3

Trước tiên cần phải xác định phông chữ cần vẽ. Dòng dưới đây để tạo chữ chữ

FPS = 60
fpsClock = pygame.time.Clock()
4

Biến

fpsClock.tick(FPS)
2 dùng để đại diện cho chữ cái đó, phông chữ được dùng là consolas, cỡ chữ là 30

Tiếp theo là tạo một bề mặt và vẽ chữ lên đó. Dòng dưới đây có nhiệm vụ đó

import pygame, sys
from pygame.locals import *

WINDOWWIDTH = 400 # Chiều dài cửa sổ
WINDOWHEIGHT = 300 # Chiều cao cửa sổ

WHITE = (255, 255, 255)
RED   = (255,   0,   0)
GREEN = (  0, 255,   0)

pygame.init()

### Xác định FPS ###
FPS = 60
fpsClock = pygame.time.Clock()

DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set_caption('Animation')

### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)


while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    
    DISPLAYSURF.fill(WHITE)
    DISPLAYSURF.blit(carSurface, (car_x, 100))

    ### Thay đổi vị trí xe ###
    car_x += 2
    if car_x + 100 > WINDOWWIDTH:
        car_x = WINDOWWIDTH - 100

    pygame.display.update()
    fpsClock.tick(FPS)
0

Tham số

fpsClock.tick(FPS)
3
fpsClock.tick(FPS)
4 là chữ cần vẽ. Tham số thứ 2 là True, cái này gọi là antialias, nếu giải kỹ thì khá dài dòng, hiểu đơn giản là nó sẽ làm "mềm" nét vẽ, các bạn có thể thử đổi thành
fpsClock.tick(FPS)
5 rồi chạy lại, kết quả cũng được . Tham số thứ 3 là màu chữ, ở đây là màu xanh. Tham số cuối cùng là màu nền, ở đây là màu đỏ. Nếu không truyền vào tham số cuối cùng thì chữ sẽ không có màu nền, các bạn có thể thử bỏ nó rồi chạy lại thử

Add image

Trước giờ chúng ta chỉ tạo ra những bề mặt rồi vẽ hình lên đó. Tuy nhiên, có những hình phức tạp (một con mario giả định) thì không thể sử dụng các hàm để vẽ được, hoặc nếu vẽ được thì rất phức tạp. Vì thế, người ta phải sử dụng những tệp hình ảnh có sẵn để thêm vào trong trò chơi. Nào, bây giờ hãy tìm hiểu cách để thêm hình ảnh vào. Để cho đơn giản, mình sẽ sử dụng phần mã xe ở phần trước. Mình sẽ thêm hình ảnh xe vào để thay thế cho các hàm vẽ

Trước hết chúng ta sẽ tìm hình 1 chiếc xe trước. Hình này mình lụm ở đây và có chỉnh sửa lại cho phù hợp với kích thước

fpsClock.tick(FPS)
6. Chúng ta sẽ lưu tệp ảnh với tên xe. png and set the same directory with file code

Vẽ vòng tròn trong python

Nào, bây giờ chúng ta đến phần code. Các bạn hãy chạy thử đoạn code này nhé

import pygame, sys
from pygame.locals import *

WINDOWWIDTH = 400 # Chiều dài cửa sổ
WINDOWHEIGHT = 300 # Chiều cao cửa sổ

WHITE = (255, 255, 255)
RED   = (255,   0,   0)
GREEN = (  0, 255,   0)

pygame.init()

### Xác định FPS ###
FPS = 60
fpsClock = pygame.time.Clock()

DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set_caption('Animation')

### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)


while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    
    DISPLAYSURF.fill(WHITE)
    DISPLAYSURF.blit(carSurface, (car_x, 100))

    ### Thay đổi vị trí xe ###
    car_x += 2
    if car_x + 100 > WINDOWWIDTH:
        car_x = WINDOWWIDTH - 100

    pygame.display.update()
    fpsClock.tick(FPS)
1

Kết quả là chiếc xe cũ đã được thay thế thành 1 hình khác, nhìn thú vị hơn đúng không

Nếu để ý kỹ thì mã chỉ thay đổi một chút so với đoạn mã cũ. Các công cụ có thể trong hàm khởi tạo

FPS = 60
fpsClock = pygame.time.Clock()
9 của lớp
fpsClock.tick(FPS)
8, dòng tạo bề mặt và các hàm vẽ được thay thế bằng dòng

import pygame, sys
from pygame.locals import *

WINDOWWIDTH = 400 # Chiều dài cửa sổ
WINDOWHEIGHT = 300 # Chiều cao cửa sổ

WHITE = (255, 255, 255)
RED   = (255,   0,   0)
GREEN = (  0, 255,   0)

pygame.init()

### Xác định FPS ###
FPS = 60
fpsClock = pygame.time.Clock()

DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set_caption('Animation')

### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)


while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    
    DISPLAYSURF.fill(WHITE)
    DISPLAYSURF.blit(carSurface, (car_x, 100))

    ### Thay đổi vị trí xe ###
    car_x += 2
    if car_x + 100 > WINDOWWIDTH:
        car_x = WINDOWWIDTH - 100

    pygame.display.update()
    fpsClock.tick(FPS)
2

Đây là dòng để thêm hình ảnh vào. pygame. hình ảnh. load() có tham số truyền vào là đường dẫn đến hình ảnh, ở đây tập tin ảnh cùng thư mục hiện tại nên không cần đường dẫn đầy đủ. Hàm này có kết quả trả về là một bề mặt, vì thế có thể sử dụng biến

FPS = 60
fpsClock = pygame.time.Clock()
8 như một bề mặt bình thường

Event

Một trò chơi cần phải có sự tương tác với người chơi. Tất nhiên người chơi trò chơi thích điều khiển một chiếc xe hơn là xem nó tự chạy. Vì thế, chúng ta hãy tìm cách để có thể điều khiển được xe trong đoạn code trên nhé. Ý tưởng là thế này, khi nhấn giữ phím mũi tên trái thì xe chạy sang trái, khi nhấn giữ phím mũi tên phải thì xe chạy sang phải, đơn giản thế thôi

Đoạn mã sau đây sẽ thực hiện điều đó, các bạn hãy nhập vào và chạy thử nhé. À mà các bạn nhớ đặt xe file. png time into the same directory nhe

import pygame, sys
from pygame.locals import *

WINDOWWIDTH = 400 # Chiều dài cửa sổ
WINDOWHEIGHT = 300 # Chiều cao cửa sổ

WHITE = (255, 255, 255)
RED   = (255,   0,   0)
GREEN = (  0, 255,   0)

pygame.init()

### Xác định FPS ###
FPS = 60
fpsClock = pygame.time.Clock()

DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set_caption('Animation')

### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)


while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    
    DISPLAYSURF.fill(WHITE)
    DISPLAYSURF.blit(carSurface, (car_x, 100))

    ### Thay đổi vị trí xe ###
    car_x += 2
    if car_x + 100 > WINDOWWIDTH:
        car_x = WINDOWWIDTH - 100

    pygame.display.update()
    fpsClock.tick(FPS)
3

Đây là kết quả, khi nhấn giữ phím mũi tên trái thì xe chạy sang trái, khi giữ phím mũi tên phải thì xe chạy sang phải

Phần này hơi phức tạp nên các bạn nhớ chú ý nhé

Bây giờ hãy nhìn vào hàm

fpsClock.tick(FPS)
1 của lớp
fpsClock.tick(FPS)
8

import pygame, sys
from pygame.locals import *

WINDOWWIDTH = 400 # Chiều dài cửa sổ
WINDOWHEIGHT = 300 # Chiều cao cửa sổ

WHITE = (255, 255, 255)
RED   = (255,   0,   0)
GREEN = (  0, 255,   0)

pygame.init()

### Xác định FPS ###
FPS = 60
fpsClock = pygame.time.Clock()

DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set_caption('Animation')

### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)


while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    
    DISPLAYSURF.fill(WHITE)
    DISPLAYSURF.blit(carSurface, (car_x, 100))

    ### Thay đổi vị trí xe ###
    car_x += 2
    if car_x + 100 > WINDOWWIDTH:
        car_x = WINDOWWIDTH - 100

    pygame.display.update()
    fpsClock.tick(FPS)
4

Có thêm 2 tham số đó là

### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)
2 và
### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)
3 dùng để kiểm tra xem xe chạy sang trái, sang phải hay đứng im. Các dòng
FPS = 60
fpsClock = pygame.time.Clock()
6 khá đơn giản nên mình không giải thích được nhiều về nó. Điều quan trọng ở đây là làm sao để điều chỉnh các tham số
### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)
2 và
### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)
3 ứng với công việc của phím mũi tên. Chúng ta hãy tìm hiểu các dòng mã khác

Có thêm 2 biến được tạo bên ngoài trò chơi vòng lặp

import pygame, sys
from pygame.locals import *

WINDOWWIDTH = 400 # Chiều dài cửa sổ
WINDOWHEIGHT = 300 # Chiều cao cửa sổ

WHITE = (255, 255, 255)
RED   = (255,   0,   0)
GREEN = (  0, 255,   0)

pygame.init()

### Xác định FPS ###
FPS = 60
fpsClock = pygame.time.Clock()

DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set_caption('Animation')

### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)


while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    
    DISPLAYSURF.fill(WHITE)
    DISPLAYSURF.blit(carSurface, (car_x, 100))

    ### Thay đổi vị trí xe ###
    car_x += 2
    if car_x + 100 > WINDOWWIDTH:
        car_x = WINDOWWIDTH - 100

    pygame.display.update()
    fpsClock.tick(FPS)
5

Đây là 2 biến tương ứng được truyền vào

### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)
7. Bây giờ, hãy chú ý đến phần bắt sự kiện bên trong vòng lặp
### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)
8

import pygame, sys
from pygame.locals import *

WINDOWWIDTH = 400 # Chiều dài cửa sổ
WINDOWHEIGHT = 300 # Chiều cao cửa sổ

WHITE = (255, 255, 255)
RED   = (255,   0,   0)
GREEN = (  0, 255,   0)

pygame.init()

### Xác định FPS ###
FPS = 60
fpsClock = pygame.time.Clock()

DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set_caption('Animation')

### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)


while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    
    DISPLAYSURF.fill(WHITE)
    DISPLAYSURF.blit(carSurface, (car_x, 100))

    ### Thay đổi vị trí xe ###
    car_x += 2
    if car_x + 100 > WINDOWWIDTH:
        car_x = WINDOWWIDTH - 100

    pygame.display.update()
    fpsClock.tick(FPS)
6

Dòng

### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)
9 để kiểm tra xem có xảy ra sự kiện
import pygame, sys
from pygame.locals import *

WINDOWWIDTH = 400 # Chiều dài cửa sổ
WINDOWHEIGHT = 300 # Chiều cao cửa sổ

WHITE = (255, 255, 255)
RED   = (255,   0,   0)
GREEN = (  0, 255,   0)

pygame.init()

### Xác định FPS ###
FPS = 60
fpsClock = pygame.time.Clock()

DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set_caption('Animation')

### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)


while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    
    DISPLAYSURF.fill(WHITE)
    DISPLAYSURF.blit(carSurface, (car_x, 100))

    ### Thay đổi vị trí xe ###
    car_x += 2
    if car_x + 100 > WINDOWWIDTH:
        car_x = WINDOWWIDTH - 100

    pygame.display.update()
    fpsClock.tick(FPS)
10 hay không.
import pygame, sys
from pygame.locals import *

WINDOWWIDTH = 400 # Chiều dài cửa sổ
WINDOWHEIGHT = 300 # Chiều cao cửa sổ

WHITE = (255, 255, 255)
RED   = (255,   0,   0)
GREEN = (  0, 255,   0)

pygame.init()

### Xác định FPS ###
FPS = 60
fpsClock = pygame.time.Clock()

DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set_caption('Animation')

### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)


while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    
    DISPLAYSURF.fill(WHITE)
    DISPLAYSURF.blit(carSurface, (car_x, 100))

    ### Thay đổi vị trí xe ###
    car_x += 2
    if car_x + 100 > WINDOWWIDTH:
        car_x = WINDOWWIDTH - 100

    pygame.display.update()
    fpsClock.tick(FPS)
10 là sự kiện xảy ra khi có 1 phím được nhấn xuống. Các bạn lưu ý rằng sự kiện này chỉ xảy ra khi các phím tắt được nhấn xuống, khi các phím đang được giữ thì sự kiện này không xảy ra nữa (ngoại trừ khi có các phím khác được nhấn). Nghe có vẻ khó hiểu đúng không, các bạn cố gắng nhé, hãy tìm hiểu thêm nhiều nguồn khác nhau để hiểu rõ hơn. Trong đoạn
FPS = 60
fpsClock = pygame.time.Clock()
6 đó thì còn 2 dòng
FPS = 60
fpsClock = pygame.time.Clock()
6 nữa để kiểm tra phím được ấn là phím nào, dòng
import pygame, sys
from pygame.locals import *

WINDOWWIDTH = 400 # Chiều dài cửa sổ
WINDOWHEIGHT = 300 # Chiều cao cửa sổ

WHITE = (255, 255, 255)
RED   = (255,   0,   0)
GREEN = (  0, 255,   0)

pygame.init()

### Xác định FPS ###
FPS = 60
fpsClock = pygame.time.Clock()

DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set_caption('Animation')

### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)


while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    
    DISPLAYSURF.fill(WHITE)
    DISPLAYSURF.blit(carSurface, (car_x, 100))

    ### Thay đổi vị trí xe ###
    car_x += 2
    if car_x + 100 > WINDOWWIDTH:
        car_x = WINDOWWIDTH - 100

    pygame.display.update()
    fpsClock.tick(FPS)
14 để xem phím được ấn có phải là phím mũi tên trái hay không, nếu đúng thì gán cho
import pygame, sys
from pygame.locals import *

WINDOWWIDTH = 400 # Chiều dài cửa sổ
WINDOWHEIGHT = 300 # Chiều cao cửa sổ

WHITE = (255, 255, 255)
RED   = (255,   0,   0)
GREEN = (  0, 255,   0)

pygame.init()

### Xác định FPS ###
FPS = 60
fpsClock = pygame.time.Clock()

DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set_caption('Animation')

### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)


while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    
    DISPLAYSURF.fill(WHITE)
    DISPLAYSURF.blit(carSurface, (car_x, 100))

    ### Thay đổi vị trí xe ###
    car_x += 2
    if car_x + 100 > WINDOWWIDTH:
        car_x = WINDOWWIDTH - 100

    pygame.display.update()
    fpsClock.tick(FPS)
15 để xe chạy sang trái, tương

Dòng 

import pygame, sys
from pygame.locals import *

WINDOWWIDTH = 400 # Chiều dài cửa sổ
WINDOWHEIGHT = 300 # Chiều cao cửa sổ

WHITE = (255, 255, 255)
RED   = (255,   0,   0)
GREEN = (  0, 255,   0)

pygame.init()

### Xác định FPS ###
FPS = 60
fpsClock = pygame.time.Clock()

DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set_caption('Animation')

### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)


while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    
    DISPLAYSURF.fill(WHITE)
    DISPLAYSURF.blit(carSurface, (car_x, 100))

    ### Thay đổi vị trí xe ###
    car_x += 2
    if car_x + 100 > WINDOWWIDTH:
        car_x = WINDOWWIDTH - 100

    pygame.display.update()
    fpsClock.tick(FPS)
16 to check xem có xảy ra sự kiện
import pygame, sys
from pygame.locals import *

WINDOWWIDTH = 400 # Chiều dài cửa sổ
WINDOWHEIGHT = 300 # Chiều cao cửa sổ

WHITE = (255, 255, 255)
RED   = (255,   0,   0)
GREEN = (  0, 255,   0)

pygame.init()

### Xác định FPS ###
FPS = 60
fpsClock = pygame.time.Clock()

DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set_caption('Animation')

### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)


while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    
    DISPLAYSURF.fill(WHITE)
    DISPLAYSURF.blit(carSurface, (car_x, 100))

    ### Thay đổi vị trí xe ###
    car_x += 2
    if car_x + 100 > WINDOWWIDTH:
        car_x = WINDOWWIDTH - 100

    pygame.display.update()
    fpsClock.tick(FPS)
17 hay không.
import pygame, sys
from pygame.locals import *

WINDOWWIDTH = 400 # Chiều dài cửa sổ
WINDOWHEIGHT = 300 # Chiều cao cửa sổ

WHITE = (255, 255, 255)
RED   = (255,   0,   0)
GREEN = (  0, 255,   0)

pygame.init()

### Xác định FPS ###
FPS = 60
fpsClock = pygame.time.Clock()

DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set_caption('Animation')

### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)


while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    
    DISPLAYSURF.fill(WHITE)
    DISPLAYSURF.blit(carSurface, (car_x, 100))

    ### Thay đổi vị trí xe ###
    car_x += 2
    if car_x + 100 > WINDOWWIDTH:
        car_x = WINDOWWIDTH - 100

    pygame.display.update()
    fpsClock.tick(FPS)
17 là sự kiện xảy ra khi có 1 phím được giải phóng. Cũng tương tự như
import pygame, sys
from pygame.locals import *

WINDOWWIDTH = 400 # Chiều dài cửa sổ
WINDOWHEIGHT = 300 # Chiều cao cửa sổ

WHITE = (255, 255, 255)
RED   = (255,   0,   0)
GREEN = (  0, 255,   0)

pygame.init()

### Xác định FPS ###
FPS = 60
fpsClock = pygame.time.Clock()

DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set_caption('Animation')

### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)


while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    
    DISPLAYSURF.fill(WHITE)
    DISPLAYSURF.blit(carSurface, (car_x, 100))

    ### Thay đổi vị trí xe ###
    car_x += 2
    if car_x + 100 > WINDOWWIDTH:
        car_x = WINDOWWIDTH - 100

    pygame.display.update()
    fpsClock.tick(FPS)
10, sự kiện
import pygame, sys
from pygame.locals import *

WINDOWWIDTH = 400 # Chiều dài cửa sổ
WINDOWHEIGHT = 300 # Chiều cao cửa sổ

WHITE = (255, 255, 255)
RED   = (255,   0,   0)
GREEN = (  0, 255,   0)

pygame.init()

### Xác định FPS ###
FPS = 60
fpsClock = pygame.time.Clock()

DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set_caption('Animation')

### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)


while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    
    DISPLAYSURF.fill(WHITE)
    DISPLAYSURF.blit(carSurface, (car_x, 100))

    ### Thay đổi vị trí xe ###
    car_x += 2
    if car_x + 100 > WINDOWWIDTH:
        car_x = WINDOWWIDTH - 100

    pygame.display.update()
    fpsClock.tick(FPS)
17 chỉ xảy ra khi giải quyết các phím được thả ra. Các đoạn
FPS = 60
fpsClock = pygame.time.Clock()
6 bên trong cũng tương tự như các phần trên. Khi phím mũi tên bên trái được thả ra thì
import pygame, sys
from pygame.locals import *

WINDOWWIDTH = 400 # Chiều dài cửa sổ
WINDOWHEIGHT = 300 # Chiều cao cửa sổ

WHITE = (255, 255, 255)
RED   = (255,   0,   0)
GREEN = (  0, 255,   0)

pygame.init()

### Xác định FPS ###
FPS = 60
fpsClock = pygame.time.Clock()

DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set_caption('Animation')

### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)


while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    
    DISPLAYSURF.fill(WHITE)
    DISPLAYSURF.blit(carSurface, (car_x, 100))

    ### Thay đổi vị trí xe ###
    car_x += 2
    if car_x + 100 > WINDOWWIDTH:
        car_x = WINDOWWIDTH - 100

    pygame.display.update()
    fpsClock.tick(FPS)
52 (xe không chạy sang trái nữa), tương tự đối với trường hợp phím mũi tên phải

Ngoài hai sự kiện

import pygame, sys
from pygame.locals import *

WINDOWWIDTH = 400 # Chiều dài cửa sổ
WINDOWHEIGHT = 300 # Chiều cao cửa sổ

WHITE = (255, 255, 255)
RED   = (255,   0,   0)
GREEN = (  0, 255,   0)

pygame.init()

### Xác định FPS ###
FPS = 60
fpsClock = pygame.time.Clock()

DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set_caption('Animation')

### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)


while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    
    DISPLAYSURF.fill(WHITE)
    DISPLAYSURF.blit(carSurface, (car_x, 100))

    ### Thay đổi vị trí xe ###
    car_x += 2
    if car_x + 100 > WINDOWWIDTH:
        car_x = WINDOWWIDTH - 100

    pygame.display.update()
    fpsClock.tick(FPS)
10 và
import pygame, sys
from pygame.locals import *

WINDOWWIDTH = 400 # Chiều dài cửa sổ
WINDOWHEIGHT = 300 # Chiều cao cửa sổ

WHITE = (255, 255, 255)
RED   = (255,   0,   0)
GREEN = (  0, 255,   0)

pygame.init()

### Xác định FPS ###
FPS = 60
fpsClock = pygame.time.Clock()

DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set_caption('Animation')

### Tạo surface và vẽ hình chiếc xe ###
car_x = 0 # Hoành độ của xe
carSurface = pygame.Surface((100, 50), SRCALPHA)
pygame.draw.polygon(carSurface, RED, ((15, 0), (65, 0), (85, 15), (100, 15), (100, 40), (0, 40), (0, 15)))
pygame.draw.circle(carSurface, GREEN, (15, 40), 10)
pygame.draw.circle(carSurface, GREEN, (85, 40), 10)


while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    
    DISPLAYSURF.fill(WHITE)
    DISPLAYSURF.blit(carSurface, (car_x, 100))

    ### Thay đổi vị trí xe ###
    car_x += 2
    if car_x + 100 > WINDOWWIDTH:
        car_x = WINDOWWIDTH - 100

    pygame.display.update()
    fpsClock.tick(FPS)
17 thì trong pygame còn rất nhiều sự kiện khác. Mình dùng hai sự kiện này để làm ví dụ về cách bắt sự kiện trong pygame, các sự kiện khác thì các bạn có thể tự tìm hiểu thêm hoặc mình sẽ giới thiệu trong từng bài hướng dẫn khác

Kết quả

Qua hai bài hướng dẫn, mình đã giới thiệu cho các bạn những phần cơ bản của pygame và lập trình trò chơi. Như mình đã nói từ trước, mình không thể hướng dẫn cho các bạn mọi thứ trong pygame. Điều quan trọng vẫn là khả năng tự tìm hiểu của các bạn. Trong bài hướng dẫn tiếp theo, mình sẽ cùng các bạn làm ra 1 game hoàn chỉnh. Tạm biệt và hẹn gặp lại ở những bài hướng dẫn tiếp theo