Thứ năm, 15/06/2017 | 00:00 GMT+7

Cách cài đặt pygame và tạo mẫu để phát triển trò chơi bằng Python 3

Thư viện pygame là một module open-souce dành cho ngôn ngữ lập trình Python nhằm mục đích đặc biệt giúp bạn tạo trò chơi và các ứng dụng đa phương tiện khác. Được xây dựng dựa trên thư viện phát triển SDL (Simple DirectMedia Layer) có tính di động cao, pygame có thể chạy trên nhiều nền tảng và hệ điều hành.

Bằng cách sử dụng module pygame, bạn có thể kiểm soát logic và đồ họa của trò chơi của bạn mà không cần lo lắng về những phức tạp backend cần thiết để làm việc với video và âm thanh.

Đầu tiên, hướng dẫn này sẽ hướng dẫn bạn cách cài đặt pygame vào môi trường lập trình Python của bạn, sau đó hướng dẫn bạn cách tạo mẫu để phát triển trò chơi với pygame và Python 3.

Yêu cầu

Để có thể sử dụng hướng dẫn này, hãy đảm bảo bạn đã cài đặt Python 3 và môi trường lập trình trên máy tính PC hoặc server của bạn .

Bạn cũng nên làm quen với các khái niệm lập trình Python sau:

Với môi trường lập trình được cài đặt và sự quen thuộc với lập trình Python, bạn đã sẵn sàng bắt đầu làm việc với pygame.

Cài đặt pygame

Hãy bắt đầu bằng cách kích hoạt môi trường lập trình Python 3 của ta :

  • . my_env/bin/activate

Khi kích hoạt này, bạn có thể cài đặt pygame bằng pip:

  • pip install pygame

Sau khi chạy lệnh này, bạn sẽ thấy kết quả trông giống như sau:

Output
Collecting pygame   Using cached pygame-1.9.3-cp35-cp35m-manylinux1_x86_64.whl Installing collected packages: pygame Successfully installed pygame-1.9.3 

Nếu bạn đã cài đặt pygame vào hệ thống có sẵn video và âm thanh, bạn có thể xác minh cài đặt của bạn bằng cách chạy lệnh sau, lệnh này sẽ chạy một trò chơi giả trình bày những gì pygame có thể làm với đồ họa và âm thanh:

  • python -m pygame.examples.aliens

Nếu bạn không muốn mở mẫu hoặc nếu bạn không có AV như một phần cài đặt của bạn , bạn cũng có thể nhập vào console tương tác Python đảm bảo rằng bạn có thể nhập module pygame. Đầu tiên, gõ lệnh python để khởi động console :

  • python

Sau đó, trong console , bạn có thể nhập module :

  • import pygame

Nếu bạn không gặp lỗi khi nhấn ENTER sau lệnh, bạn sẽ biết rằng pygame đã được cài đặt thành công. Bạn có thể thoát khỏi console tương tác Python bằng lệnh quit() .

Nếu bạn gặp sự cố khi cài đặt trên dòng lệnh, bạn có thể xem wiki Bắt đầu của pygame .

Trong các bước sau, ta sẽ giả sử việc sử dụng màn hình để hiển thị giao diện user đồ họa như một phần của hướng dẫn này để xác minh mã của ta .

Nhập pygame

Để làm quen với pygame, hãy tạo một file có tên our_game.py , ví dụ: ta có thể tạo file này bằng editor văn bản nano:

  • nano our_game.py

Khi bắt đầu một dự án trong pygame, bạn sẽ bắt đầu với câu lệnh import được sử dụng để nhập các module , bạn có thể thêm câu lệnh này vào đầu file của bạn :

our_game.py
import pygame 

Ta cũng có thể tùy chọn thêm một câu lệnh nhập khác bên dưới dòng đầu tiên để thêm một số hằng số và hàm của pygame vào không gian tên chung của file của bạn:

our_game.py
import pygame from pygame.locals import * 

Với pygame được nhập vào file chương trình của ta , ta đã sẵn sàng sử dụng nó để tạo mẫu trò chơi.

Khởi tạo pygame

Từ đây, ta sẽ khởi tạo các chức năng của pygame bằng hàm init() , viết tắt của “khởi tạo”.

our_game.py
import pygame from pygame.locals import *   pygame.init() 

Hàm init() sẽ tự động khởi động tất cả các module pygame mà bạn cần khởi tạo.

Bạn cũng có thể khởi tạo từng module của pygame riêng lẻ, như trong:

pygame.font.init() 

Hàm init() sẽ trả về một bộ giá trị cho bạn nếu bạn muốn. Tuple này sẽ hiển thị khởi tạo thành công và không thành công. Ta có thể thực hiện điều này cho cả lệnh gọi init() và khởi tạo các module cụ thể (sẽ cho ta biết liệu các module này có khả dụng hay không):

i = pygame.init() print(i)  f = pygame.font.init() print(f) 

Nếu ta chạy đoạn mã trên, ta sẽ nhận được kết quả tương tự như sau:

Output
(6, 0) None 

Trong trường hợp này, biến i trả về bộ giá trị (6, 0) , cho thấy rằng có 6 lần khởi tạo pygame thành công và 0 lần thất bại. Biến f trả về None , cho biết rằng module không khả dụng trong môi trường cụ thể này.

Cài đặt bề mặt hiển thị

Từ đây, ta cần cài đặt bề mặt hiển thị trò chơi của bạn . Ta sẽ sử dụng pygame.display.set_mode() để khởi tạo một cửa sổ hoặc màn hình để hiển thị và chuyển nó vào một biến. Vào trong hàm, ta sẽ truyền một đối số cho độ phân giải màn hình là một cặp số biểu thị chiều rộng và chiều cao trong một bộ giá trị. Hãy thêm chức năng này vào chương trình của ta :

our_game.py
import pygame from pygame.locals import *   pygame.init()  game_display = pygame.display.set_mode((800, 600)) 

Ta đã chuyển tuple (800, 600) làm đối số cho hàm set_mode() , đại diện cho độ phân giải của chiều rộng (800 px) và chiều cao (600 px). Lưu ý tuple được chứa trong dấu ngoặc đơn của hàm, do đó, có dấu ngoặc kép trong hàm trên.

Bạn có thể sẽ thường xuyên sử dụng các số nguyên cho độ phân giải trò chơi của bạn , vì vậy có thể bạn cần gán các số đó cho các biến thay vì sử dụng các số lặp đi lặp lại. Điều này có thể giúp bạn dễ dàng hơn khi cần sửa đổi chương trình của bạn , vì bạn chỉ cần sửa đổi những gì được chuyển cho các biến.

Ta sẽ sử dụng biến display_width cho chiều rộng của màn hình trò chơi của ta và display_height cho chiều cao và chuyển các biến đó vào hàm set_mode() :

our_game.py
import pygame from pygame.locals import *   pygame.init()  display_width = 800 display_height = 600  game_display = pygame.display.set_mode((display_width, display_height)) 

Đến đây, bề mặt hiển thị trò chơi được cài đặt với độ phân giải cho chiều rộng và chiều cao của nó.

Cập nhật màn hình

Tiếp theo, ta cần sử dụng một trong hai chức năng có sẵn để cập nhật hiển thị bề mặt trò chơi.

Ảnh động thường là những thay đổi giữa các khung hình khác nhau theo thời gian. Bạn có thể nghĩ đến một cuốn sách lật khi nghĩ về hình ảnh động, vì chúng bao gồm một loạt các hình ảnh thay đổi dần dần từ trang này sang trang sau. Các trang này cung cấp mô phỏng chuyển động khi chúng được lật nhanh chóng, vì nội dung của trang dường như đang chuyển động. Trong trò chơi máy tính, khung được sử dụng thay vì trang.

Do khái niệm lật trang hoặc khung, một trong những hàm được dùng để cập nhật hiển thị bề mặt trò chơi được gọi là flip() và có thể được gọi trong file của ta ở trên như sau:

pygame.display.flip() 

Hàm flip() cập nhật toàn bộ bề mặt hiển thị lên màn hình.

Thường xuyên hơn, hàm update() được sử dụng thay vì hàm flip() vì nó sẽ chỉ cập nhật các phần của màn hình chứ không phải toàn bộ khu vực để tiết kiệm bộ nhớ.

Hãy thêm hàm update() vào cuối file our_game.py :

our_game.py
import pygame from pygame.locals import *   pygame.init()  display_width = 800 display_height = 600  game_display = pygame.display.set_mode((display_width, display_height))  pygame.display.update() 

Đến đây, bạn có thể chạy chương trình mà không gặp bất kỳ lỗi nào nhưng bề mặt hiển thị sẽ chỉ mở ra và nhanh chóng đóng lại.

Tạo vòng lặp trò chơi

Với pygame được nhập và khởi tạo, bộ hiển thị và bề mặt trò chơi đang được cập nhật, ta có thể bắt đầu làm việc với vòng lặp trò chơi chính của bạn .

Ta sẽ tạo mộtvòng lặp while sẽ chạy trò chơi. Vòng lặp sẽ gọi giá trị Boolean của True , nghĩa là vòng lặp sẽ lặp mãi mãi trừ khi nó bị gián đoạn.

Trong vòng lặp trò chơi chính này của chương trình của ta , ta sẽ xây dựng một vòng lặp for để lặp qua các sự kiện user trong hàng đợi sự kiện, sẽ được gọi bởi hàm pygame.event.get() .

Đến đây, ta không có gì trong vòng lặp for , nhưng ta có thể thêm một câu print() để cho thấy rằng mã đang hoạt động như ta mong đợi. Ta sẽ chuyển các sự kiện trong vòng lặp vào câu lệnh dưới dạng print(event) .

Hãy thêm hai vòng lặp này và câu print() vào file chương trình của ta :

our_game.py
import pygame from pygame.locals import *   pygame.init()  display_width = 800 display_height = 600  game_display = pygame.display.set_mode((display_width, display_height))  pygame.display.update()  while True:     for event in pygame.event.get():         print(event) 

Để đảm bảo mã của ta đang hoạt động, hãy chạy chương trình:

  • python our_game.py

Khi ta chạy file , một cửa sổ 800x600 sẽ bật lên. Để kiểm tra các sự kiện, bạn có thể di chuột qua cửa sổ, nhấp vào bên trong cửa sổ và nhấn các phím trên bàn phím. Các sự kiện này sẽ in ra cửa sổ console của bạn.

Đầu ra bạn nhận được sẽ giống như sau:

Output
<Event(4-MouseMotion {'rel': (616, 355), 'buttons': (0, 0, 0), 'pos': (616, 355)})> <Event(5-MouseButtonDown {'button': 1, 'pos': (616, 355)})> <Event(6-MouseButtonUp {'button': 1, 'pos': (616, 355)})> <Event(2-KeyDown {'scancode': 3, 'key': 102, 'unicode': 'f', 'mod': 0})> <Event(3-KeyUp {'scancode': 3, 'key': 102, 'mod': 0})> ... 

Đầu ra này hiển thị các sự kiện user đang diễn ra. Những sự kiện này sẽ kiểm soát trò chơi khi chúng được tạo ra bởi user . Khi nào bạn chạy hàm pygame.event.get() , mã của bạn sẽ tham gia các sự kiện này.

Dừng chương trình chạy bằng cách nhấn CTRL + C trong cửa sổ terminal .

Đến đây, bạn có thể xóa hoặc comment câu print() vì ta sẽ không cần phải có tất cả kết quả terminal này.

Từ đây, ta có thể hoàn thiện mẫu của bạn bằng cách học cách thoát khỏi trò chơi.

Bỏ cuộc

Để thoát khỏi chương trình pygame, trước tiên ta có thể hủy khởi tạo các module liên quan, sau đó thoát Python như bình thường.

Hàm pygame.quit() sẽ hủy khởi tạo tất cả các module pygame và hàm quit() Python quit() sẽ thoát khỏi chương trình.

Vì user có quyền kiểm soát các chức năng và sự kiện của trò chơi, ta cũng nên biết rằng pygame.QUIT được gửi đến hàng đợi sự kiện khi user yêu cầu tắt chương trình bằng cách nhấp vào dấu “X” ở góc trên của cửa sổ trò chơi.

Hãy để ta bắt đầu kiểm soát stream chương trình bằng câu lệnh if điều kiện trong vòng lặp for xử lý sự kiện:

our_game.py
import pygame from pygame.locals import *   pygame.init()  display_width = 800 display_height = 600  game_display = pygame.display.set_mode((display_width, display_height))  pygame.display.update()  while True:     for event in pygame.event.get():         if event.type == QUIT:             pygame.quit()             quit() 

Trong đoạn mã trên, ta nói rằng nếu user đã yêu cầu chương trình tắt, chương trình nên hủy khởi tạo các module pygame.quit() bằng pygame.quit() và thoát khỏi chương trình bằng lệnh quit() .

Vì ta đã nhập pygame.locals ta có thể gợi lên event.typeQUIT như hiện tại (thay vì với pygame. Ở trước chúng).

Mặc dù user có thể biết cách nhấp vào “X” ở góc trên của cửa sổ trò chơi, ta có thể cần một số sự kiện user khác kích hoạt yêu cầu thoát khỏi chương trình. Ta có thể thực hiện việc này với loại sự kiện KEYDOWN và một hoặc nhiều khóa.

Sự kiện KEYDOWN nghĩa là user đang nhấn một phím trên bàn phím của họ xuống. Đối với mục đích của ta , giả sử rằng phím Q (như trong "thoát") hoặc ESC có thể thoát khỏi chương trình. Hãy thêm mã biểu thị điều này trong vòng lặp for của ta :

our_game.py
import pygame from pygame.locals import *   pygame.init()  display_width = 800 display_height = 600  game_display = pygame.display.set_mode((display_width, display_height))  pygame.display.update()  while True:     for event in pygame.event.get():         if event.type == QUIT or (              event.type == KEYDOWN and (               event.key == K_ESCAPE or               event.key == K_q              )):             pygame.quit()             quit() 

Ta đã thêm các toán tử logic Boolean để chương trình có thể thoát nếu user nhấp vào "X" ở góc trên của cửa sổ trò chơi hoặc nếu user nhấn một phím xuống là phím thoát hoặc phím Q ( lưu ý điều này không phân biệt chữ hoa chữ thường).

Đến đây, nếu bạn chạy chương trình bằng lệnh python our_game.py , bạn có thể kiểm tra chức năng của trò chơi đang chạy và sau đó thoát bằng cách thoát khỏi cửa sổ với biểu tượng "X" hoặc bằng cách nhấn vào Phím Q hoặc ESC .

Cải tiến mã và các bước tiếp theo

Mặc dù chương trình ở trên có đầy đủ chức năng, nhưng ta có thể làm một số điều để cải thiện mã.

Để bắt đầu, ta có thể đặt mã while vòng lặp while vào một định nghĩa hàm thay thế:

def event_handler():     for event in pygame.event.get():         if event.type == QUIT or (              event.type == KEYDOWN and (               event.key == K_ESCAPE or               event.key == K_q              )):             pygame.quit()             quit() 

Điều này sẽ làm while vòng một neater bit và ngưng tụ, đặc biệt là khi ta thêm nhiều chức năng hơn để trò chơi của ta .

Ngoài ra, để bắt đầu làm cho trò chơi bóng bẩy hơn, ta có thể thêm chú thích vào thanh tiêu đề của cửa sổ (hiện đang đọc pygame window ). Điều này ta có thể làm với dòng sau:

pygame.display.set_caption('Our Game') 

Ta có thể đặt chuỗi 'Our Game' ở trên thành bất kỳ thứ gì ta muốn gọi là trò chơi.

Ngoài ra, ta có thể di chuyển hàm pygame.display.update() vào vòng lặp trò chơi chính.

Bây giờ, mã đầy đủ của ta trông như thế này:

our_game.py
import pygame from pygame.locals import *   pygame.init()  display_width = 800 display_height = 600  game_display = pygame.display.set_mode((display_width, display_height)) pygame.display.set_caption('Our Game')   def event_handler():     for event in pygame.event.get():         if event.type == QUIT or (              event.type == KEYDOWN and (               event.key == K_ESCAPE or               event.key == K_q              )):             pygame.quit()             quit()  while True:     event_handler()      pygame.display.update()  

Bạn cũng có thể xem xét các cách khác nhau để tiếp cận mã ở trên, bao gồm sử dụng câu lệnh break để thoát ra khỏi vòng lặp trước khi chuyển sang thoát trò chơi.

Từ đây, bạn cần tiếp tục tìm hiểu về cách hiển thị hình ảnh thông qua vẽ và viết, tạo hình ảnh động và kiểm soát tốc độ khung hình, v.v. Bạn có thể tiếp tục tìm hiểu về sự phát triển trò chơi pygame bằng cách đọc tài liệu chính thức của pygame .

Kết luận

Hướng dẫn này đã hướng dẫn bạn cách cài đặt pygame module nguồn mở vào môi trường lập trình Python 3 của bạn và cách bắt đầu tiếp cận phát triển trò chơi thông qua cài đặt mẫu mà bạn có thể sử dụng để điều khiển vòng lặp chính của trò chơi Python.

Để thực hiện các dự án lập trình khác sử dụng module Python, bạn có thể tìm hiểu “ Cách tạo Twitterbot bằng Thư viện Tweepy ” hoặc “ Cách vẽ sơ đồ dữ liệu bằng matplotlib .”


Tags:

Các tin liên quan

Cách chuyển mã Python 2 sang Python 3
2017-05-17
Cách chuyển mã Python 2 sang Python 3
2017-05-17
Cách sử dụng tính năng ghi log trong Python 3
2017-05-02
Cách gỡ lỗi Python bằng control panel tương tác
2017-04-27
Cách sử dụng trình gỡ lỗi Python
2017-04-25
Cách cài đặt Python 3 và thiết lập môi trường lập trình cục bộ trên CentOS 7
2017-04-20
Cách cài đặt Python 3 và thiết lập môi trường lập trình cục bộ trên Debian 8
2017-04-20
Cách cài đặt Python 3 và thiết lập môi trường lập trình cục bộ trên CentOS 7
2017-04-20
Cách áp dụng tính đa hình cho các lớp trong Python 3
2017-04-13
Hướng dẫn dự báo chuỗi thời gian với prophet bằng Python 3
2017-04-04