Hướng dẫn python game code with pygame - mã trò chơi python với pygame
Xem bây giờ hướng dẫn này có một khóa học video liên quan được tạo bởi nhóm Python thực sự. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn về sự hiểu biết của bạn: Tạo một trò chơi cuộn bên 2D với pygame This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Make a 2D Side-Scroller Game With PyGame Show
Khi tôi bắt đầu học lập trình máy tính vào cuối thiên niên kỷ qua, nó được thúc đẩy bởi mong muốn của tôi để viết các trò chơi máy tính. Tôi đã cố gắng tìm ra cách viết các trò chơi bằng mọi ngôn ngữ và trên mọi nền tảng tôi đã học, bao gồm cả Python. Đó là cách mà tôi phát hiện ra 6 và học cách sử dụng nó để viết các trò chơi và các chương trình đồ họa khác. Vào thời điểm đó, tôi thực sự muốn có một mồi trên 6.Đến cuối bài viết này, bạn sẽ có thể:
Primer này giả định rằng bạn có một sự hiểu biết cơ bản về việc viết các chương trình Python, bao gồm các chức năng do người dùng xác định, nhập khẩu, vòng lặp và điều kiện. Bạn cũng nên quen thuộc với cách mở các tệp trên nền tảng của mình. Một sự hiểu biết cơ bản về Python hướng đối tượng cũng hữu ích. 6 hoạt động với hầu hết các phiên bản Python, nhưng Python 3.6 được khuyến nghị và sử dụng trong suốt bài viết này.Bạn có thể lấy tất cả các mã trong bài viết này để theo dõi: Nền và thiết lập 6 là một trình bao bọc Python cho thư viện SDL, viết tắt của lớp DirectMedia đơn giản. SDL cung cấp quyền truy cập đa nền tảng cho hệ thống của bạn, các thành phần phần cứng đa phương tiện cơ bản của bạn, chẳng hạn như âm thanh, video, chuột, bàn phím và cần điều khiển. 6 bắt đầu cuộc sống như một sự thay thế cho dự án PYSDL bị đình trệ. Bản chất đa nền tảng của cả SDL và 6 có nghĩa là bạn có thể viết các trò chơi và các chương trình Python đa phương tiện phong phú cho mọi nền tảng hỗ trợ chúng!Simple DirectMedia Layer. SDL provides cross-platform access to your system’s underlying multimedia hardware components, such as sound, video, mouse, keyboard, and joystick. 6 started life as a replacement for the stalled PySDL project. The cross-platform nature of both SDL and 6 means you can write games and rich multimedia Python programs for every platform that supports
them!Để cài đặt 6 trên nền tảng của bạn, hãy sử dụng lệnh 3 thích hợp:Bạn có thể xác minh cài đặt bằng cách tải một trong các ví dụ đi kèm với thư viện:
Nếu một cửa sổ trò chơi xuất hiện, thì 6 sẽ được cài đặt đúng cách! Nếu bạn gặp vấn đề, thì Hướng dẫn bắt đầu phác thảo một số vấn đề và cảnh báo cho tất cả các nền tảng.Chương trình pygame cơ bảnTrước khi xuống các chi tiết cụ thể, hãy để Lôi xem một chương trình 6 cơ bản. Chương trình này tạo ra một cửa sổ, lấp đầy nền bằng màu trắng và vẽ một vòng tròn màu xanh ở giữa nó:
Khi bạn chạy chương trình này, bạn sẽ thấy một cửa sổ trông như thế này: Hãy để chia nhỏ mã này, từng phần:
Đó là phiên bản 6 của Hello Hello, thế giới. Bây giờ, hãy để đào sâu hơn một chút vào các khái niệm đằng sau mã này.Khái niệm pygameVì 6 và thư viện SDL có thể mang tính di động trên các nền tảng và thiết bị khác nhau, cả hai đều cần xác định và làm việc với sự trừu tượng cho các thực tế phần cứng khác nhau. Hiểu những khái niệm và trừu tượng đó sẽ giúp bạn thiết kế và phát triển các trò chơi của riêng bạn.Khởi tạo và mô -đunThư viện 6 bao gồm một số cấu trúc Python, bao gồm một số mô -đun khác nhau. Các mô -đun này cung cấp quyền truy cập trừu tượng vào phần cứng cụ thể trên hệ thống của bạn, cũng như các phương thức thống nhất để làm việc với phần cứng đó. Ví dụ: 9 cho phép truy cập thống nhất vào màn hình video của bạn, trong khi 0 cho phép điều khiển trừu tượng vào cần điều khiển của bạn.modules. These modules provide abstract access to specific hardware on your system, as well as uniform methods to work with that hardware. For example,
9 allows uniform access to your video display, while 0 allows abstract control of your joystick.Sau khi nhập thư viện 6 trong ví dụ trên, điều đầu tiên bạn làm là khởi tạo pygame bằng 2. Hàm này gọi các hàm 3 riêng biệt của tất cả các mô -đun 6 được bao gồm. Vì các mô -đun này là trừu tượng cho phần cứng cụ thể, nên bước khởi tạo này được yêu cầu để bạn có thể làm việc với cùng một mã trên Linux, Windows và Mac.Hiển thị và bề mặtNgoài các mô-đun, 6 còn bao gồm một số lớp Python, gói gọn các khái niệm phụ thuộc không phải là phần mềm. Một trong số đó là 6, ở cơ bản nhất, định nghĩa một khu vực hình chữ nhật mà bạn có thể vẽ. Các đối tượng 6 được sử dụng trong nhiều bối cảnh trong 6. Sau đó, bạn sẽ thấy cách tải hình ảnh vào 6 và hiển thị nó trên màn hình.classes, which encapsulate non-hardware dependent concepts.
One of these is the 6 which, at its most basic, defines a rectangular area on which you can draw. 6 objects are used in many contexts in 6. Later you’ll see how to load an image into a 6 and display it on the screen.Trong 6, mọi thứ được xem trên một 9 do người dùng tạo, có thể là một cửa sổ hoặc toàn màn hình. Màn hình được tạo bằng 2, trả về 6 đại diện cho phần có thể nhìn thấy của cửa sổ. Đây là 6 mà bạn chuyển vào các chức năng vẽ như 5 và nội dung của 6 được đẩy đến màn hình khi bạn gọi 7.Hình ảnh và RECTChương trình 6 cơ bản của bạn đã vẽ một hình dạng trực tiếp lên màn hình 6, nhưng bạn cũng có thể làm việc với hình ảnh trên đĩa. Mô -đun 0 cho phép bạn tải và lưu hình ảnh theo nhiều định dạng phổ biến. Hình ảnh được tải vào các đối tượng 6, sau đó có thể được thao tác và hiển thị theo nhiều cách.Như đã đề cập ở trên, các đối tượng 6 được biểu diễn bằng hình chữ nhật, cũng như nhiều đối tượng khác trong 6, chẳng hạn như hình ảnh và cửa sổ. Hình chữ nhật được sử dụng rất nhiều đến nỗi có một lớp 4 đặc biệt chỉ để xử lý chúng. Bạn sẽ sử dụng các đối tượng và hình ảnh 4 trong trò chơi của mình để vẽ người chơi và kẻ thù và để quản lý sự va chạm giữa chúng.Được rồi, đó là lý thuyết đủ. Hãy để thiết kế và viết một trò chơi! Thiết kế trò chơi cơ bảnTrước khi bạn bắt đầu viết bất kỳ mã nào, nó luôn luôn là một ý tưởng tốt để có một số thiết kế. Vì đây là một trò chơi hướng dẫn, hãy để thiết kế một số trò chơi cơ bản cho nó:
Khi anh ấy mô tả các dự án phần mềm, một đồng nghiệp cũ của tôi đã từng nói, bạn không biết những gì bạn làm cho đến khi bạn biết những gì bạn không làm. Với ý nghĩ đó, đây là một số điều mà won đã được đề cập trong hướng dẫn này:
Bạn có thể tự do thử sức mình để thêm các tính năng này và các tính năng khác vào chương trình của riêng bạn. Bắt đầu nào! Nhập và khởi tạo pygameSau khi bạn nhập 6, bạn cũng sẽ cần phải khởi tạo nó. Điều này cho phép 6 kết nối các bản tóm tắt của nó với phần cứng cụ thể của bạn:
Thư viện 6 xác định nhiều thứ ngoài các mô -đun và lớp học. Nó cũng xác định một số hằng số cục bộ cho những thứ như phím kẽ, chuyển động của chuột và các thuộc tính hiển thị. Bạn tham chiếu các hằng số này bằng cách sử dụng cú pháp 9. Bằng cách nhập các hằng số cụ thể từ 0, bạn có thể sử dụng cú pháp 1 thay thế. Điều này sẽ giúp bạn tiết kiệm một số tổ hợp phím và cải thiện khả năng đọc tổng thể.Thiết lập màn hìnhBây giờ bạn cần một cái gì đó để vẽ! Tạo một màn hình để trở thành khung vẽ tổng thể:
Bạn tạo màn hình để sử dụng bằng cách gọi 2 và truyền một bản hoặc danh sách với chiều rộng và chiều cao mong muốn. Trong trường hợp này, cửa sổ là 800x600, theo định nghĩa của các hằng số 3 và 4 trên các dòng 20 và 21. Điều này trả về một 6 đại diện cho kích thước bên trong của cửa sổ. Đây là phần của cửa sổ bạn có thể điều khiển, trong khi HĐH điều khiển đường viền cửa sổ và thanh tiêu đề.Nếu bạn chạy chương trình này ngay bây giờ, thì bạn sẽ thấy một cửa sổ bật lên một cách ngắn gọn và sau đó ngay lập tức biến mất khi chương trình thoát ra. Don lồng chớp mắt hoặc bạn có thể bỏ lỡ nó! Trong phần tiếp theo, bạn sẽ tập trung vào vòng lặp trò chơi chính để đảm bảo rằng chương trình của bạn chỉ thoát ra khi được cung cấp đúng. Thiết lập vòng lặp trò chơiMỗi trò chơi từ Pong đến Fortnite đều sử dụng một vòng lặp trò chơi để kiểm soát lối chơi. Vòng lặp trò chơi thực hiện bốn điều rất quan trọng:
Mỗi chu kỳ của vòng lặp trò chơi được gọi là khung và bạn càng có thể thực hiện mọi thứ nhanh hơn mỗi chu kỳ, trò chơi của bạn sẽ chạy nhanh hơn. Các khung tiếp tục xảy ra cho đến khi một số điều kiện để thoát khỏi trò chơi được đáp ứng. Trong thiết kế của bạn, có hai điều kiện có thể kết thúc vòng lặp trò chơi:frame, and the quicker you can do things each cycle, the faster your game will run. Frames continue to occur until some condition to exit the game is met. In your design, there are two conditions that can end the game loop:
Điều đầu tiên mà vòng lặp trò chơi thực hiện là quá trình đầu vào của người dùng để cho phép người chơi di chuyển xung quanh màn hình. Do đó, bạn cần một số cách để nắm bắt và xử lý một loạt các đầu vào. Bạn làm điều này bằng cách sử dụng hệ thống sự kiện 6.Các sự kiện xử lýNhấn phím, chuyển động của chuột và thậm chí các chuyển động cần điều khiển là một số cách mà người dùng có thể cung cấp đầu vào. Tất cả các kết quả đầu vào của người dùng trong một sự kiện được tạo ra. Các sự kiện có thể xảy ra bất cứ lúc nào và thường xuyên (nhưng không phải luôn luôn) bắt nguồn bên ngoài chương trình. Tất cả các sự kiện trong 6 được đặt trong hàng đợi sự kiện, sau đó có thể được truy cập và thao tác. Đối phó với các sự kiện được gọi là xử lý chúng và mã để làm như vậy được gọi là người xử lý sự kiện.handling them, and the code to do so is called an event handler.Mỗi sự kiện trong 6 đều có một loại sự kiện được liên kết với nó. Đối với trò chơi của bạn, các loại sự kiện mà bạn tập trung vào là Keypresses và đóng cửa sổ. Các sự kiện Keypress có loại sự kiện 9 và sự kiện đóng cửa sổ có loại 00. Các loại sự kiện khác nhau cũng có thể có dữ liệu khác được liên kết với chúng. Ví dụ, loại sự kiện 9 cũng có một biến gọi là 02 để chỉ ra khóa nào được nhấn.type associated with
it. For your game, the event types you’ll focus on are keypresses and window closure. Keypress events have the event type 9, and the window closure event has the type 00. Different event types may also have other data associated with them. For example, the 9 event type also has a variable called 02 to indicate which key was pressed.Bạn truy cập danh sách tất cả các sự kiện hoạt động trong hàng đợi bằng cách gọi 03. Sau đó, bạn lặp qua danh sách này, kiểm tra từng loại sự kiện và trả lời phù hợp:
Hãy cùng xem xét kỹ hơn về vòng lặp trò chơi này:
Khi bạn thêm các dòng này vào mã trước đó và chạy nó, bạn sẽ thấy một cửa sổ có màn hình trống hoặc đen: Cửa sổ giành chiến thắng biến mất cho đến khi bạn nhấn phím ESC, hoặc nếu không thì kích hoạt sự kiện 00 bằng cách đóng cửa sổ.Esc key, or otherwise trigger a 00 event by closing the window.Vẽ trên màn hìnhTrong chương trình mẫu, bạn đã vẽ trên màn hình bằng hai lệnh:
Bây giờ bạn sẽ tìm hiểu về cách thứ ba để vẽ lên màn hình: sử dụng 6.Hãy nhớ lại rằng 6 là một đối tượng hình chữ nhật mà bạn có thể vẽ, giống như một tờ giấy trống. Đối tượng 1 là 6 và bạn có thể tạo các đối tượng 6 của riêng mình tách biệt với màn hình hiển thị. Hãy để xem cách thức hoạt động của nó:
Sau khi màn hình chứa đầy màu trắng trên dòng 45, một 6 mới được tạo trên dòng 48. 6 này rộng 50 pixel, cao 50 pixel và được gán cho 21. Tại thời điểm này, bạn đối xử với nó giống như 1. Vì vậy, trên đường, 51 bạn lấp đầy nó với màu đen. Bạn cũng có thể truy cập cơ bản 4 bằng 24. Điều này được lưu trữ dưới dạng 25 để sử dụng sau.Sử dụng 1# Simple pygame program 2 3# Import and initialize the pygame library 4import pygame 5pygame.init() 6 7# Set up the drawing window 8screen = pygame.display.set_mode([500, 500]) 9 10# Run until the user asks to quit 11running = True 12while running: 13 14 # Did the user click the window close button? 15 for event in pygame.event.get(): 16 if event.type == pygame.QUIT: 17 running = False 18 19 # Fill the background with white 20 screen.fill((255, 255, 255)) 21 22 # Draw a solid blue circle in the center 23 pygame.draw.circle(screen, (0, 0, 255), (250, 250), 75) 24 25 # Flip the display 26 pygame.display.flip() 27 28# Done! Time to quit. 29pygame.quit() 26 và 1# Simple pygame program 2 3# Import and initialize the pygame library 4import pygame 5pygame.init() 6 7# Set up the drawing window 8screen = pygame.display.set_mode([500, 500]) 9 10# Run until the user asks to quit 11running = True 12while running: 13 14 # Did the user click the window close button? 15 for event in pygame.event.get(): 16 if event.type == pygame.QUIT: 17 running = False 18 19 # Fill the background with white 20 screen.fill((255, 255, 255)) 21 22 # Draw a solid blue circle in the center 23 pygame.draw.circle(screen, (0, 0, 255), (250, 250), 75) 24 25 # Flip the display 26 pygame.display.flip() 27 28# Done! Time to quit. 29pygame.quit() 27Chỉ cần tạo một 6 mới là đủ để xem nó trên màn hình. Để làm điều đó, bạn cần phải blit 6 vào một 6 khác. Thuật ngữ 31 là viết tắt của chuyển khối và 26 là cách bạn sao chép nội dung của một 6 sang một nội dung khác. Bạn chỉ có thể 26 từ cái này sang cái khác, nhưng vì màn hình chỉ là một 6 khác, nên đó không phải là vấn đề. Tại đây, cách bạn vẽ 21 trên màn hình:Block Transfer, and 26 is how you copy the contents of one 6 to another. You can only 26 from one 6 to another, but since the screen is just another 6, that’s not a problem. Here’s how you draw 21 on the screen:
Cuộc gọi 26 trên dòng 55 có hai đối số:
Các tọa độ 41 bảo chương trình của bạn đặt 21 vào trung tâm chính xác của màn hình, nhưng nó không trông hoàn toàn như vậy:Lý do tại sao hình ảnh trông ngoài trung tâm là 26 đặt góc trên cùng bên trái của 21 tại vị trí được đưa ra. Nếu bạn muốn 21 được tập trung, thì bạn sẽ phải thực hiện một số toán học để chuyển nó lên và sang trái. Bạn có thể làm điều này bằng cách trừ đi chiều rộng và chiều cao của 21 từ chiều rộng và chiều cao của màn hình, chia mỗi cái cho 2 để xác định vị trí trung tâm, sau đó chuyển các số đó làm đối số đến 47:top-left corner of 21 at the location given. If you want 21 to be centered,
then you’ll have to do some math to shift it up and to the left. You can do this by subtracting the width and height of 21 from the width and height of the screen, dividing each by 2 to locate the center, and then passing those numbers as arguments to 47:
Lưu ý cuộc gọi đến 7 sau cuộc gọi đến 49. Điều này cập nhật toàn bộ màn hình với tất cả mọi thứ mà Lừa được vẽ kể từ lần lật cuối cùng. Không có cuộc gọi đến 27, không có gì được hiển thị.SpritesTrong thiết kế trò chơi của bạn, người chơi bắt đầu ở bên trái và các chướng ngại vật đến từ bên phải. Bạn có thể đại diện cho tất cả các trở ngại với các đối tượng 6 để làm cho việc vẽ mọi thứ dễ dàng hơn, nhưng làm thế nào để bạn biết nơi để vẽ chúng? Làm thế nào để bạn biết nếu một trở ngại đã va chạm với người chơi? Điều gì xảy ra khi chướng ngại vật bay khỏi màn hình? Điều gì sẽ xảy ra nếu bạn muốn vẽ hình ảnh nền cũng di chuyển? Điều gì sẽ xảy ra nếu bạn muốn hình ảnh của bạn được hoạt hình? Bạn có thể xử lý tất cả các tình huống này và nhiều hơn nữa với Sprites.Trong các thuật ngữ lập trình, một sprite là biểu diễn 2D của một cái gì đó trên màn hình. Về cơ bản, nó là một bức tranh. 6 cung cấp một lớp 53, được thiết kế để giữ một hoặc một số biểu diễn đồ họa của bất kỳ đối tượng trò chơi nào bạn muốn hiển thị trên màn hình. Để sử dụng nó, bạn tạo một lớp mới mở rộng 53. Điều này cho phép bạn sử dụng các phương pháp tích hợp của nó.sprite is a 2D representation of something on the screen. Essentially, it’s a picture. 6 provides a
53 class, which is designed to hold one or several graphical representations of any game object that you want to display on the screen. To use it, you create a new class that extends 53. This allows you to use its built-in methods.Người chơiTại đây, cách bạn sử dụng các đối tượng 53 với trò chơi hiện tại để xác định trình phát. Chèn mã này sau dòng 18:
Trước tiên, bạn xác định 56 bằng cách mở rộng 57 trên dòng 22. sau đó 58 sử dụng 59 để gọi phương thức 58 của 53. Để biết thêm thông tin về lý do tại sao điều này là cần thiết, bạn có thể đọc Supercharge các lớp của mình với Python Super ().Tiếp theo, bạn xác định và khởi tạo 62 để giữ hình ảnh để hiển thị, hiện là hộp trắng. Bạn cũng xác định và khởi tạo 63, mà bạn sẽ sử dụng để vẽ người chơi sau. Để sử dụng lớp mới này, bạn cũng cần tạo một đối tượng mới và cũng thay đổi mã bản vẽ. Mở rộng khối mã bên dưới để xem tất cả cùng nhau:
Chạy mã này. Bạn sẽ thấy một hình chữ nhật màu trắng ở khoảng giữa màn hình: Bạn nghĩ điều gì sẽ xảy ra nếu bạn thay đổi dòng 59 thành 64? Hãy thử nó và xem: 0Khi bạn chuyển 4 đến 26, nó sử dụng tọa độ của góc trên bên trái để vẽ bề mặt. Bạn sẽ sử dụng điều này sau để làm cho người chơi của bạn di chuyển!Đầu vào người dùngCho đến nay, bạn đã học được cách thiết lập 6 và vẽ các đối tượng trên màn hình. Bây giờ, niềm vui thực sự bắt đầu! Bạn sẽ làm cho người chơi có thể điều khiển bằng bàn phím.Trước đó, bạn đã thấy rằng 03 trả về một danh sách các sự kiện trong hàng đợi sự kiện mà bạn quét cho các loại sự kiện 9. Chà, đó không phải là cách duy nhất để đọc Keypresses. 6 cũng cung cấp 71, trả về một từ điển chứa tất cả các sự kiện 9 hiện tại trong hàng đợi.Đặt điều này trong vòng lặp trò chơi của bạn ngay sau khi vòng xử lý sự kiện. Điều này trả về một từ điển chứa các phím được nhấn ở đầu mỗi khung hình: 1Tiếp theo, bạn viết một phương thức trong 56 để chấp nhận từ điển đó. Điều này sẽ xác định hành vi của sprite dựa trên các khóa được nhấn. Ở đây, những gì có thể trông như thế nào:
2 74, 75, 76 và 77 tương ứng với các phím mũi tên trên bàn phím. Nếu mục từ điển cho khóa đó là 78, thì khóa đó đã giảm và bạn di chuyển trình phát 63 theo hướng thích hợp. Ở đây bạn sử dụng 80, là viết tắt của di chuyển tại chỗ, để di chuyển 4 hiện tại.move in place, to move the current 4.Sau đó, bạn có thể gọi 82 Mỗi khung hình để di chuyển Sprite của người chơi để đáp ứng với Keypresses. Thêm cuộc gọi này ngay sau cuộc gọi đến 83: 3Bây giờ bạn có thể di chuyển hình chữ nhật trình phát của mình xung quanh màn hình với các phím mũi tên: Bạn có thể nhận thấy hai vấn đề nhỏ:
Để giữ trình phát trên màn hình, bạn cần thêm một số logic để phát hiện nếu 25 sẽ di chuyển khỏi màn hình. Để làm điều đó, bạn kiểm tra xem các tọa độ 25 có di chuyển ra ngoài ranh giới màn hình hay không. Nếu vậy, sau đó bạn hướng dẫn chương trình di chuyển nó trở lại cạnh: 4Ở đây, thay vì sử dụng 86, bạn chỉ cần thay đổi tọa độ tương ứng của 87, 88, 89 hoặc 90 trực tiếp. Kiểm tra điều này và bạn sẽ tìm thấy hình chữ nhật trình phát không còn có thể di chuyển khỏi màn hình.Bây giờ hãy để thêm một số kẻ thù! Kẻ thùNhững gì một trò chơi không có kẻ thù? Bạn sẽ sử dụng các kỹ thuật mà bạn đã học để tạo ra một lớp kẻ thù cơ bản, sau đó tạo ra rất nhiều trong số chúng cho người chơi của bạn để tránh. Đầu tiên, nhập thư viện 91: 5Sau đó, tạo một lớp sprite mới được gọi là 92, theo cùng một mẫu bạn đã sử dụng cho 56: 6Có bốn sự khác biệt đáng chú ý giữa 92 và 56:
Vì vậy, 03 làm gì? Để tìm ra điều này, bạn phải biết về các nhóm Sprite.Sprite Groups.Nhóm spriteMột lớp siêu hữu ích khác mà 6 cung cấp là 06. Đây là một đối tượng chứa một nhóm các đối tượng 53. Vậy tại sao sử dụng nó? Thay vào đó, bạn có thể theo dõi các đối tượng 53 của mình trong danh sách không? Chà, bạn có thể, nhưng lợi thế của việc sử dụng 09 nằm trong các phương pháp mà nó phơi bày. Các phương pháp này giúp phát hiện xem bất kỳ 92 nào đã va chạm với 56, giúp cập nhật dễ dàng hơn nhiều.Hãy cùng xem cách tạo các nhóm sprite. Bạn sẽ tạo hai đối tượng 09 khác nhau:
Ở đây, những gì trông giống như trong mã: 7Khi bạn gọi 03, 53 sẽ bị xóa khỏi mỗi 09 mà nó thuộc về. Điều này cũng loại bỏ các tham chiếu đến 53, cho phép người thu gom rác Python, lấy lại bộ nhớ khi cần thiết.Bây giờ bạn có một nhóm 21, bạn có thể thay đổi cách vẽ các đối tượng. Thay vì gọi 26 chỉ vào 56, bạn có thể lặp lại mọi thứ trong 21: 8Bây giờ, bất cứ điều gì được đưa vào 21 sẽ được rút ra với mọi khung hình, cho dù đó là kẻ thù hay người chơi.Có một vấn đề chỉ có một vấn đề mà bạn không có kẻ thù! Bạn có thể tạo ra một loạt kẻ thù khi bắt đầu trò chơi, nhưng trò chơi sẽ nhanh chóng trở nên nhàm chán khi tất cả chúng rời khỏi màn hình vài giây sau đó. Thay vào đó, hãy để khám phá cách giữ nguồn cung kẻ thù ổn định khi trò chơi tiến triển. Sự kiện tùy chỉnhThiết kế kêu gọi kẻ thù xuất hiện đều đặn. Điều này có nghĩa là trong các khoảng thời gian đã thiết lập, bạn cần phải làm hai điều:
Bạn đã có mã xử lý các sự kiện ngẫu nhiên. Vòng lặp sự kiện được thiết kế để tìm kiếm các sự kiện ngẫu nhiên xảy ra mọi khung hình và đối phó với chúng một cách thích hợp. May mắn thay, 6 không giới hạn bạn chỉ sử dụng các loại sự kiện mà nó đã xác định. Bạn có thể xác định các sự kiện của riêng bạn để xử lý khi bạn thấy phù hợp.Hãy cùng xem cách tạo ra một sự kiện tùy chỉnh mà LỚN tạo ra cứ sau vài giây. Bạn có thể tạo một sự kiện tùy chỉnh bằng cách đặt tên cho nó: 9 6 định nghĩa các sự kiện trong nội bộ là số nguyên, vì vậy bạn cần xác định một sự kiện mới với một số nguyên duy nhất. Dự trữ sự kiện cuối cùng 6 được gọi là 32, do đó, xác định 33 trên dòng 83 đảm bảo nó độc đáo.Tiếp theo, bạn cần chèn sự kiện mới này vào hàng đợi sự kiện đều đặn trong suốt trò chơi. Đó là nơi mà mô -đun 34 xuất hiện. Dòng 84 đốt cháy sự kiện 35 mới cứ sau 250 mili giây, hoặc bốn lần mỗi giây. Bạn gọi 36 bên ngoài vòng lặp trò chơi vì bạn chỉ cần một bộ đếm thời gian, nhưng nó sẽ bắn trong toàn bộ trò chơi.Thêm mã để xử lý sự kiện mới của bạn: 0Bất cứ khi nào trình xử lý sự kiện nhìn thấy sự kiện 35 mới trên dòng 115, nó sẽ tạo ra một 92 và thêm nó vào 28 và 21. Vì 92 nằm trong 21, nó sẽ được vẽ mọi khung hình. Bạn cũng cần gọi 43 trên dòng 126, cập nhật mọi thứ trong 28, để đảm bảo chúng di chuyển đúng cách:
Tuy nhiên, đó không phải là lý do duy nhất có một nhóm chỉ với 28.Phát hiện va chạmThiết kế trò chơi của bạn kêu gọi trò chơi kết thúc bất cứ khi nào kẻ thù va chạm với người chơi. Kiểm tra va chạm là một kỹ thuật cơ bản của lập trình trò chơi và thường yêu cầu một số toán học không tầm thường để xác định xem hai sprites có trùng nhau hay không. Đây là nơi một khung như 6 có ích! Viết mã phát hiện va chạm là tẻ nhạt, nhưng 6 có rất nhiều phương pháp phát hiện va chạm có sẵn để bạn sử dụng.Đối với hướng dẫn này, bạn sẽ sử dụng một phương thức gọi là 48, được đọc là Sprite Sprite va chạm bất kỳ. Phương pháp này chấp nhận 53 và 09 làm tham số. Nó nhìn vào mọi đối tượng trong 09 và kiểm tra xem 63 của nó có giao nhau với 63 của 53 không. Nếu vậy, thì nó trả về 78. Nếu không, nó trả về 56. Điều này là hoàn hảo cho trò chơi này vì bạn cần kiểm tra xem 57 có va chạm với một trong số 09 của 28 không.Ở đây, những gì trông giống như trong mã: 1Dòng 135 kiểm tra xem 57 có va chạm với bất kỳ đối tượng nào trong 28 hay không. Nếu vậy, 62 được gọi để loại bỏ nó khỏi mọi nhóm mà nó thuộc về. Vì các đối tượng duy nhất được hiển thị là trong 21, 57 sẽ không còn được hiển thị nữa. Khi người chơi đã bị giết, bạn cũng cần thoát khỏi trò chơi, vì vậy bạn đã đặt 04 để thoát khỏi vòng lặp trò chơi trên dòng 138.Tại thời điểm này, bạn đã có các yếu tố cơ bản của một trò chơi tại chỗ: Bây giờ, hãy để Lôi ăn mặc nó một chút, làm cho nó dễ chơi hơn và thêm một số khả năng nâng cao để giúp nó nổi bật. Hình ảnh spriteĐược rồi, bạn có một trò chơi, nhưng hãy để thành thật mà nói, đó là loại xấu xí. Người chơi và kẻ thù chỉ là những khối trắng trên nền đen. Đó là hiện đại khi Pong mới, nhưng nó không cắt nó nữa. Hãy để thay thế tất cả những hình chữ nhật màu trắng nhàm chán bằng một số hình ảnh mát hơn sẽ làm cho trò chơi cảm thấy như một trò chơi thực tế. Trước đó, bạn đã học được rằng hình ảnh trên đĩa có thể được tải vào 6 với một số trợ giúp từ mô -đun 0. Đối với hướng dẫn này, chúng tôi đã tạo ra một máy bay phản lực nhỏ cho người chơi và một số tên lửa cho kẻ thù. Bạn có thể sử dụng nghệ thuật này, vẽ của riêng bạn hoặc tải xuống một số tài sản nghệ thuật trò chơi miễn phí để sử dụng. Bạn có thể nhấp vào liên kết bên dưới để tải xuống nghệ thuật được sử dụng trong hướng dẫn này:Thay đổi các hàm tạo đối tượngTrước khi bạn sử dụng hình ảnh để đại diện cho người chơi và kẻ thù, bạn cần thực hiện một số thay đổi cho các hàm tạo của chúng. Mã bên dưới thay thế mã được sử dụng trước đó: 2Hãy để dòng giải nén dòng 31 một chút. 68 tải một hình ảnh từ đĩa. Bạn chuyển nó một đường dẫn đến tệp. Nó trả về một 6 và cuộc gọi 70 tối ưu hóa 6, làm cho các cuộc gọi 26 trong tương lai nhanh hơn.Dòng 32 sử dụng 73 để chỉ màu 6 sẽ hiển thị trong suốt. Trong trường hợp này, bạn chọn màu trắng, bởi vì đó là màu nền của hình ảnh máy bay phản lực. Hằng số RLEAccel là một tham số tùy chọn giúp 6 hiển thị nhanh hơn trên các màn hình không tăng tốc. Điều này được thêm vào câu lệnh nhập 0 trên dòng 11.Không có gì khác cần phải thay đổi. Hình ảnh vẫn là một 6, ngoại trừ bây giờ nó có một hình ảnh được vẽ trên đó. Bạn vẫn sử dụng nó theo cùng một cách.Ở đây, những thay đổi tương tự như 92 trông giống như: 3Chạy chương trình bây giờ sẽ cho thấy đây là cùng một trò chơi bạn có trước đây, ngoại trừ bây giờ bạn đã thêm một số skin đồ họa đẹp với hình ảnh. Nhưng tại sao dừng lại chỉ làm cho người chơi và kẻ thù trông đẹp? Hãy để thêm một vài đám mây đi qua để tạo ấn tượng về một chiếc máy bay phản lực bay trên bầu trời.skins with images. But why stop at just making the player and enemy sprites look nice? Let’s add a few clouds going past to give the impression of a jet flying through the sky. Thêm hình ảnh nềnĐối với các đám mây nền, bạn sử dụng các nguyên tắc tương tự như bạn đã làm cho 56 và 92:
Ở đây, những gì 81 trông giống như: 4Tất cả sẽ trông rất quen thuộc. Nó rất giống với 92.Để có các đám mây xuất hiện trong các khoảng thời gian nhất định, bạn sẽ sử dụng mã tạo sự kiện tương tự như những gì bạn đã sử dụng để tạo kẻ thù mới. Đặt nó ngay bên dưới sự kiện sáng tạo của kẻ thù: 5Điều này nói rằng chờ 1000 mili giây, hoặc một giây, trước khi tạo ra 83 tiếp theo.Tiếp theo, hãy tạo một 09 mới để giữ mỗi 83 mới được tạo: 6Tiếp theo, thêm một trình xử lý cho sự kiện 94 mới trong trình xử lý sự kiện: 7Cuối cùng, hãy đảm bảo 87 được cập nhật mọi khung hình: 8Dòng 172 cập nhật 9 ban đầu để lấp đầy màn hình với màu xanh da trời dễ chịu. Bạn có thể thay đổi màu này thành một thứ khác. Có thể bạn muốn một thế giới ngoài hành tinh với bầu trời tím, một vùng đất hoang độc màu xanh neon hoặc bề mặt của sao Hỏa màu đỏ!Lưu ý rằng mỗi 81 và 92 mới được thêm vào 21 cũng như 87 và 28. Điều này được thực hiện bởi vì mỗi nhóm được sử dụng cho một mục đích riêng biệt:
Bạn tạo ra nhiều nhóm để bạn có thể thay đổi cách các Sprites di chuyển hoặc hành xử mà không ảnh hưởng đến chuyển động hoặc hành vi của các Sprites khác. Tốc độ trò chơiTrong khi thử nghiệm trò chơi, bạn có thể nhận thấy rằng kẻ thù di chuyển nhanh một chút. Nếu không, thì điều đó ổn, vì các máy khác nhau sẽ thấy kết quả khác nhau tại thời điểm này. Lý do cho điều này là các vòng lặp trò chơi xử lý các khung nhanh như bộ xử lý và môi trường sẽ cho phép. Vì tất cả các sprites di chuyển một lần mỗi khung hình, chúng có thể di chuyển hàng trăm lần mỗi giây. Số lượng khung được xử lý mỗi giây được gọi là tốc độ khung hình và việc có quyền này là sự khác biệt giữa một trò chơi có thể chơi được và một trò chơi đáng quên.frame rate, and getting this right is the difference between a playable game and a forgettable one. Thông thường, bạn muốn tốc độ khung hình cao nhất có thể, nhưng đối với trò chơi này, bạn cần làm chậm nó một chút để trò chơi có thể chơi được. May mắn thay, mô -đun 34 chứa 07 được thiết kế chính xác cho mục đích này.Sử dụng 07 để thiết lập tốc độ khung hình có thể chơi chỉ cần hai dòng mã. Lần đầu tiên tạo ra một 07 mới trước khi vòng lặp trò chơi bắt đầu: 9Cuộc gọi thứ hai 10 để thông báo cho 6 rằng chương trình đã kết thúc khung hình: 0Đối số được chuyển cho 10 thiết lập tốc độ khung hình mong muốn. Để làm điều này, 10 tính toán số lượng mili giây mà mỗi khung hình nên thực hiện, dựa trên tốc độ khung hình mong muốn. Sau đó, nó so sánh con số đó với số mili giây đã trôi qua kể từ lần cuối 10 được gọi. Nếu không đủ thời gian đã trôi qua, thì 10 chậm trễ xử lý để đảm bảo rằng nó không bao giờ vượt quá tốc độ khung hình được chỉ định.
Vượt qua tốc độ khung hình nhỏ hơn sẽ dẫn đến nhiều thời gian hơn trong mỗi khung để tính toán, trong khi tốc độ khung hình lớn hơn cung cấp lối chơi mượt mà hơn (và có thể nhanh hơn): Chơi xung quanh với con số này để xem những gì cảm thấy tốt nhất cho bạn! Hiệu ứng âm thanhCho đến nay, bạn đã tập trung vào lối chơi và các khía cạnh trực quan của trò chơi của bạn. Bây giờ, hãy để khám phá cho trò chơi của bạn một số hương vị thính giác là tốt. 6 cung cấp 17 để xử lý tất cả các hoạt động liên quan đến âm thanh. Bạn sẽ sử dụng các lớp và phương pháp mô -đun này để cung cấp các hiệu ứng âm nhạc và âm thanh nền cho các hành động khác nhau.Tên 17 đề cập đến thực tế là mô -đun trộn các âm thanh khác nhau thành một tổng thể gắn kết. Sử dụng mô hình phụ 19, bạn có thể truyền phát các tệp âm thanh riêng lẻ theo nhiều định dạng khác nhau, chẳng hạn như MP3, OGG và MOD. Bạn cũng có thể sử dụng 20 để giữ một hiệu ứng âm thanh duy nhất được phát, ở các định dạng WAV OGG hoặc không nén. Tất cả việc phát lại xảy ra trong nền, vì vậy khi bạn chơi 20, phương thức quay lại ngay lập tức khi âm thanh phát.Như với hầu hết mọi thứ 6, sử dụng 17 bắt đầu với bước khởi tạo. May mắn thay, điều này đã được xử lý bởi 2. Bạn chỉ cần gọi 25 nếu bạn muốn thay đổi mặc định: 1 25 chấp nhận một số đối số, nhưng mặc định hoạt động tốt trong hầu hết các trường hợp. Lưu ý rằng nếu bạn muốn thay đổi mặc định, bạn cần gọi 25 trước khi gọi 2. Nếu không, mặc định sẽ có hiệu lực bất kể thay đổi của bạn.Sau khi hệ thống được khởi tạo, bạn có thể thiết lập âm thanh và âm nhạc nền: 2Dòng 138 và 139 Tải một clip âm thanh nền và bắt đầu chơi nó. Bạn có thể nói với clip âm thanh để lặp và không bao giờ kết thúc bằng cách đặt tham số được đặt tên 29.Các dòng 143 đến 145 Tải ba âm thanh mà bạn sẽ sử dụng cho các hiệu ứng âm thanh khác nhau. Hai cái đầu tiên đang tăng và âm thanh, được chơi khi người chơi di chuyển lên hoặc xuống. Cuối cùng là âm thanh được sử dụng bất cứ khi nào có va chạm. Bạn cũng có thể thêm các âm thanh khác, chẳng hạn như âm thanh cho bất cứ khi nào 92 is created, or a final sound for when the game ends.Vì vậy, làm thế nào để bạn sử dụng các hiệu ứng âm thanh? Bạn muốn phát mỗi âm thanh khi một sự kiện nhất định xảy ra. Ví dụ: khi con tàu di chuyển lên, bạn muốn chơi 31. Do đó, bạn thêm một cuộc gọi đến 32 bất cứ khi nào bạn xử lý sự kiện đó. Trong thiết kế, điều đó có nghĩa là thêm các cuộc gọi sau vào 82 cho 56: 3Để va chạm giữa người chơi và kẻ thù, bạn phát âm thanh khi phát hiện va chạm: 4Ở đây, bạn dừng bất kỳ hiệu ứng âm thanh nào khác trước tiên, bởi vì trong một vụ va chạm, người chơi không còn di chuyển nữa. Sau đó, bạn chơi âm thanh va chạm và tiếp tục thực hiện từ đó. Cuối cùng, khi trò chơi kết thúc, tất cả các âm thanh sẽ dừng lại. Điều này đúng cho dù trò chơi kết thúc do va chạm hay người dùng thoát thủ công. Để làm điều này, hãy thêm các dòng sau ở cuối chương trình sau vòng lặp: 5Về mặt kỹ thuật, một vài dòng cuối cùng này không bắt buộc, vì chương trình kết thúc ngay sau đó. Tuy nhiên, nếu bạn quyết định sau này để thêm một màn hình giới thiệu hoặc màn hình thoát vào trò chơi của bạn, thì có thể có nhiều mã chạy hơn sau khi trò chơi kết thúc. Đó là nó! Kiểm tra lại và bạn sẽ thấy một cái gì đó như thế này: Một ghi chú về các nguồnBạn có thể nhận thấy nhận xét trên các dòng 136-137 khi nhạc nền được tải, liệt kê nguồn âm nhạc và liên kết đến giấy phép Creative Commons. Điều này đã được thực hiện bởi vì người tạo ra âm thanh đó yêu cầu nó. Các yêu cầu giấy phép cho rằng để sử dụng âm thanh, cả phân bổ thích hợp và liên kết đến giấy phép phải được cung cấp. Dưới đây là một số nguồn cho âm nhạc, âm thanh và nghệ thuật mà bạn có thể tìm kiếm nội dung hữu ích:
Khi bạn thực hiện các trò chơi của mình và sử dụng nội dung được tải xuống như nghệ thuật, âm nhạc hoặc mã từ các nguồn khác, vui lòng chắc chắn rằng bạn đang tuân thủ các điều khoản cấp phép của các nguồn đó. Sự kết luậnTrong suốt hướng dẫn này, bạn đã học được cách lập trình trò chơi với 6 khác với lập trình thủ tục tiêu chuẩn. Bạn cũng đã học được cách:
Để làm điều này, bạn đã sử dụng một tập hợp con của các mô -đun 6, bao gồm 9, 17 và 19, 34, 0, 42 và 02. Bạn cũng đã sử dụng một số lớp 6, bao gồm 4, 6, 20 và 53. Nhưng những thứ này chỉ làm trầy xước bề mặt của những gì 6 có thể làm! Kiểm tra tài liệu chính thức 6 để biết danh sách đầy đủ các mô -đun và lớp học có sẵn.Bạn có thể tìm thấy tất cả các tệp mã, đồ họa và âm thanh cho bài viết này bằng cách nhấp vào liên kết bên dưới: Hãy thoải mái để lại ý kiến dưới đây là tốt. Happy Pythoning! Xem bây giờ hướng dẫn này có một khóa học video liên quan được tạo bởi nhóm Python thực sự. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn về sự hiểu biết của bạn: Tạo một trò chơi cuộn bên 2D với pygame This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Make a 2D Side-Scroller Game With PyGame Làm thế nào để bạn tạo một trò chơi với Python Pygame?Bước 1 - Cài đặt pygame. .... Bước 2 - Thực hiện một nền tảng trong pygame. .... Bước 3 - Cuộn một nền trong pygame. .... Bước 4 - Thêm một sprite di chuyển trong pygame. .... Bước 5 - Chạy trò chơi bằng pygame .. Làm thế nào để bạn tạo mã trò chơi Python?Bước 1: Xin chào Bunny.. Nhập thư viện pygame..... Khởi tạo pygame và thiết lập cửa sổ hiển thị .. Tải hình ảnh mà bạn sẽ sử dụng cho chú thỏ .. Tiếp tục lặp qua mã thụt lề sau..... Đổ đầy màn hình với màu đen trước khi bạn vẽ bất cứ thứ gì .. Thêm hình ảnh thỏ mà bạn đã tải vào màn hình tại x = 100 và y = 100 .. Python có hỗ trợ pygame không?Bản chất đa nền tảng của cả SDL và pygame có nghĩa là bạn có thể viết các trò chơi và các chương trình Python đa phương tiện phong phú cho mọi nền tảng hỗ trợ chúng!Nếu một cửa sổ trò chơi xuất hiện, thì pygame được cài đặt đúng cách!you can write games and rich multimedia Python programs for every platform that supports them! If a game window appears, then pygame is installed properly!
Pygame có tốt để làm trò chơi không?Thư viện phổ biến nhất hỗ trợ các trò chơi đang phát triển ở Python là pygame.Động cơ này, có sẵn theo LGPL, cho phép bạn xây dựng các dự án thương mại đầy đủ.Hơn nữa, thư viện được thiết kế theo cách cho phép bạn dễ dàng sử dụng nhiều lõi xử lý.. This engine, available under the LGPL, allows you to build fully commercial projects. What's more, the library is designed in a way that lets you easily use multiple processor cores. |