Hướng dẫn python code for shooting game - code python cho game bắn súng

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 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: Sử dụng pygame để xây dựng một trò chơi tiểu hành tinh ở Python This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Using Pygame to Build an Asteroids Game in Python

Bạn có muốn tạo ra các trò chơi máy tính của riêng mình nhưng giống như Python quá nhiều để từ bỏ nó cho sự nghiệp như một nhà phát triển trò chơi? Có một giải pháp cho điều đó! Với mô -đun pygame, bạn có thể sử dụng các kỹ năng Python tuyệt vời của mình để tạo ra các trò chơi, từ cơ bản đến rất phức tạp. Dưới đây, bạn sẽ học cách sử dụng pygame bằng cách tạo một bản sao của trò chơi Asteroids!

Trong hướng dẫn này, bạn sẽ học cách xây dựng một trò chơi hoàn chỉnh, bao gồm:

  • Tải hình ảnh và hiển thị chúng trên màn hìnhimages and displaying them on the screen
  • Xử lý đầu vào của người dùng để kiểm soát trò chơiuser input in order to control the game
  • Di chuyển các đối tượng theo logic trò chơi according to the game logic
  • Phát hiện va chạm giữa các đối tượngcollisions between objects
  • Hiển thị văn bản trên màn hìnhtext on the screen
  • Chơi âm thanhsounds

Nhấp vào liên kết bên dưới để tải xuống mã cho dự án này và theo dõi khi bạn xây dựng trò chơi của mình:

Bắt đầu nào!

Demo: Trò chơi tiểu hành tinh ở Python

Trò chơi mà bạn sẽ tạo ra là một bản sao của các tiểu hành tinh trò chơi arcade cổ điển. Trong đó, bạn điều khiển một tàu vũ trụ và bắn các tiểu hành tinh. Nếu tàu vũ trụ của bạn va chạm với một tiểu hành tinh, bạn sẽ thua. Nếu bạn bắn xuống tất cả các tiểu hành tinh, bạn sẽ thắng!

Tổng quan dự án

Trò chơi tiểu hành tinh của bạn trong Python sẽ có một tàu vũ trụ duy nhất. Tàu vũ trụ có thể xoay trái và phải cũng như tăng tốc về phía trước. Khi nó không tăng tốc, nó sẽ tiếp tục di chuyển với vận tốc mà nó có. Tàu vũ trụ cũng có thể bắn đạn.

Trò chơi sẽ sử dụng các ánh xạ chính sau:

Chìa khóaHoạt động
Đúng Xoay tàu vũ trụ bên phải
Bên trái Xoay tàu vũ trụ bên trái
Lên Tăng tốc tàu vũ trụ về phía trước
Không gian Bắn
Thoát ra Thoát khỏi trò chơi

Cũng sẽ có sáu tiểu hành tinh lớn trong trò chơi. Khi một viên đạn chạm vào một tiểu hành tinh lớn, nó sẽ chia thành hai cái trung bình. Khi một viên đạn chạm vào một tiểu hành tinh trung bình, nó sẽ chia thành hai con nhỏ. Một tiểu hành tinh nhỏ đã giành được sự chia rẽ nhưng sẽ bị phá hủy bởi một viên đạn.

Khi một tiểu hành tinh va chạm với tàu vũ trụ, tàu vũ trụ sẽ bị phá hủy và trò chơi sẽ kết thúc trong một thất bại. Khi tất cả các tiểu hành tinh đã biến mất, trò chơi sẽ kết thúc trong một chiến thắng!

Dự án sẽ được chia thành mười bước:

  1. Thiết lập pygame cho một dự án Python
  2. Bàn giao đầu vào trong trò chơi
  3. Tải hình ảnh và hiển thị chúng trên màn hình
  4. Tạo các đối tượng trò chơi với một hình ảnh, một vị trí và một số logic
  5. Di chuyển tàu vũ trụ
  6. Di chuyển các tiểu hành tinh và phát hiện va chạm với tàu vũ trụ
  7. Bắn đạn và phá hủy các tiểu hành tinh
  8. Tách các tiểu hành tinh thành những tiểu hành tinh nhỏ hơn
  9. Chơi âm thanh
  10. Nhấp vào liên kết bên dưới để tải xuống mã cho dự án này và theo dõi khi bạn xây dựng trò chơi của mình:

Bắt đầu nào!

Demo: Trò chơi tiểu hành tinh ở Python

Trò chơi mà bạn sẽ tạo ra là một bản sao của các tiểu hành tinh trò chơi arcade cổ điển. Trong đó, bạn điều khiển một tàu vũ trụ và bắn các tiểu hành tinh. Nếu tàu vũ trụ của bạn va chạm với một tiểu hành tinh, bạn sẽ thua. Nếu bạn bắn xuống tất cả các tiểu hành tinh, bạn sẽ thắng!

Tổng quan dự ánvectors to represent positions and directions, as well as some vector operations to move the elements on the screen. Pygame will take care of most of the math, and all the necessary concepts will be explained in this tutorial. However, if you want to know more, then you can check out Vector Addition.

Trò chơi tiểu hành tinh của bạn trong Python sẽ có một tàu vũ trụ duy nhất. Tàu vũ trụ có thể xoay trái và phải cũng như tăng tốc về phía trước. Khi nó không tăng tốc, nó sẽ tiếp tục di chuyển với vận tốc mà nó có. Tàu vũ trụ cũng có thể bắn đạn.

Trò chơi sẽ sử dụng các ánh xạ chính sau:

Chìa khóa

Hoạt động

Đúng

$ mkdir awesome_pygame_project
$ cd awesome_pygame_project

Xoay tàu vũ trụ bên phải

Bên trái

Xoay tàu vũ trụ bên trái

(venv) $ python -m pip install -r requirements.txt

Lên

(venv) $ python -m pygame.examples.aliens

Tăng tốc tàu vũ trụ về phía trước

Không gian

Bắn

 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()

Dòng 3 bắt đầu một vòng lặp, được gọi là vòng lặp trò chơi. Mỗi lần lặp của vòng lặp này tạo ra một khung của trò chơi và thường thực hiện các hoạt động sau:game loop. Each iteration of this loop generates a single frame of the game and usually performs the following operations:

  1. Xử lý đầu vào: Đầu vào như các nút nhấn, chuyển động chuột và vị trí bộ điều khiển VR được thu thập và sau đó được xử lý. Tùy thuộc vào trò chơi, nó có thể khiến các đối tượng thay đổi vị trí của chúng, tạo các đối tượng mới, yêu cầu kết thúc trò chơi, v.v. Input like pressed buttons, mouse motion, and VR controllers position is gathered and then handled. Depending on the game, it can cause objects to change their position, create new objects, request the end of the game, and so on.

  2. Trò chơi Logic: Đây là nơi mà hầu hết các cơ chế trò chơi được thực hiện. Ở đây, các quy tắc vật lý được áp dụng, va chạm được phát hiện và xử lý, trí tuệ nhân tạo thực hiện công việc của nó, v.v. Phần này cũng chịu trách nhiệm kiểm tra xem người chơi đã thắng hay thua trò chơi. This is where most of the game mechanics are implemented. Here, the rules of physics are applied, collisions are detected and handled, artificial intelligence does its job, and so on. This part is also responsible for checking if the player has won or lost the game.

  3. Vẽ: Nếu trò chơi đã kết thúc, thì đây là nơi khung sẽ được vẽ trên màn hình. Nó sẽ bao gồm tất cả các mục hiện đang có trong trò chơi và có thể nhìn thấy người chơi. If the game hasn’t ended yet, then this is where the frame will be drawn on screen. It will include all the items that are currently in the game and are visible to the player.

Cấu trúc chung của một chương trình pygame không phức tạp, và có lẽ bạn có thể thoát khỏi việc đặt nó vào một vòng lặp cơ bản. Tuy nhiên, xem xét rằng bạn có thể mở rộng trò chơi tiểu hành tinh của mình trong tương lai, đó là một ý tưởng tốt để gói gọn tất cả các hoạt động này trong một lớp Python.

Tạo một lớp có nghĩa là bạn cần chọn một tên cho trò chơi của mình, nhưng các tiểu hành tinh đã được thực hiện. Làm thế nào về đá không gian đá?

Tạo một thư mục

def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
4 và bên trong nó tạo một tệp có tên
def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
5. Đây là nơi bạn sẽ đặt lớp chính của trò chơi tiểu hành tinh của bạn:
def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
6. Tệp sẽ trông như thế này:

 1import pygame
 2
 3class SpaceRocks:
 4    def __init__(self):
 5        self._init_pygame()
 6        self.screen = pygame.display.set_mode((800, 600))
 7
 8    def main_loop(self):
 9        while True:
10            self._handle_input()
11            self._process_game_logic()
12            self._draw()
13
14    def _init_pygame(self):
15        pygame.init()
16        pygame.display.set_caption("Space Rocks")
17
18    def _handle_input(self):
19        pass
20
21    def _process_game_logic(self):
22        pass
23
24    def _draw(self):
25        self.screen.fill((0, 0, 255))
26        pygame.display.flip()

Ở đây, những gì mà xảy ra trong mã, từng bước:

  • Dòng 1 nhập mô -đun pygame để có quyền truy cập vào tất cả các tính năng tuyệt vời của nó. imports the Pygame module to get access to all its amazing features.

  • Dòng 3 tạo ra lớp

    def _handle_input(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                quit()
    
    6. creates the
    def _handle_input(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                quit()
    
    6 class.

  • Dòng 4 là hàm tạo của lớp

    def _handle_input(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                quit()
    
    6 và nó là một nơi hoàn hảo để đặt bất kỳ phương pháp nào cần thiết để khởi tạo pygame. Việc khởi tạo pygame thực tế xảy ra trong
    def _handle_input(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                quit()
    
    9. Bạn sẽ tìm hiểu thêm về phương pháp này trong một khoảnh khắc.
    is the constructor of the
    def _handle_input(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                quit()
    
    6 class, and it’s a perfect place to put any methods required to initialize Pygame. The actual Pygame initialization happens in
    def _handle_input(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                quit()
    
    9. You’ll learn more about this method in a moment.

  • Dòng 6 tạo ra một bề mặt hiển thị. Hình ảnh trong pygame được thể hiện bằng các bề mặt. Dưới đây là một vài điều cần biết về chúng: creates a display surface. Images in Pygame are represented by surfaces. Here are a few things to know about them:

    • Bề mặt có thể được vẽ trên nhau, cho phép bạn tạo ra những cảnh phức tạp từ các hình ảnh đơn giản.

    • Có một bề mặt đặc biệt trong mỗi dự án pygame. Bề mặt đó đại diện cho màn hình và là hình ảnh cuối cùng sẽ được hiển thị cho người chơi. Tất cả các bề mặt khác phải được vẽ trên này tại một số điểm. Nếu không, họ đã thắng được hiển thị.

    • Để tạo bề mặt hiển thị, chương trình của bạn sử dụng

      def _handle_input(self):
          for event in pygame.event.get():
              if event.type == pygame.QUIT or (
                  event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE
              ):
                  quit()
      
      0. Đối số duy nhất bạn chuyển sang phương pháp này là kích thước của màn hình, được biểu thị bằng một bộ ba giá trị: chiều rộng và chiều cao. Trong trường hợp này, pygame sẽ tạo một màn hình có chiều rộng
      def _handle_input(self):
          for event in pygame.event.get():
              if event.type == pygame.QUIT or (
                  event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE
              ):
                  quit()
      
      1 pixel và chiều cao
      def _handle_input(self):
          for event in pygame.event.get():
              if event.type == pygame.QUIT or (
                  event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE
              ):
                  quit()
      
      2 pixel.

  • Dòng 8 là vòng lặp trò chơi được thảo luận ở trên. Nó chứa ba bước giống nhau cho mỗi khung hình: is the game loop discussed above. It contains the same three steps for each frame:

    1. Dòng 10 chứa xử lý đầu vào. contains input handling.

    2. Dòng 11 chứa logic trò chơi. contains game logic.

    3. Dòng 12 chứa bản vẽ. contains drawing.

  • Dòng 14 xác định một phương thức gọi là

    def _handle_input(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                quit()
    
    9. Đây là nơi khởi tạo một lần của pygame xảy ra. Phương pháp làm hai điều: defines a method called
    def _handle_input(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                quit()
    
    9. This is where a one-time initialization of Pygame happens. The method does two things:

    1. Dòng 15 gọi

      def _handle_input(self):
          for event in pygame.event.get():
              if event.type == pygame.QUIT or (
                  event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE
              ):
                  quit()
      
      4. Dòng mã duy nhất này chịu trách nhiệm thiết lập các tính năng tuyệt vời của pygame. Mỗi khi bạn làm việc với pygame, bạn nên gọi
      def _handle_input(self):
          for event in pygame.event.get():
              if event.type == pygame.QUIT or (
                  event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE
              ):
                  quit()
      
      4 khi bắt đầu chương trình để đảm bảo rằng khung sẽ hoạt động chính xác.
      calls
      def _handle_input(self):
          for event in pygame.event.get():
              if event.type == pygame.QUIT or (
                  event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE
              ):
                  quit()
      
      4. This single line of code is responsible for setting up the amazing features of Pygame. Every time you work with Pygame, you should call
      def _handle_input(self):
          for event in pygame.event.get():
              if event.type == pygame.QUIT or (
                  event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE
              ):
                  quit()
      
      4 at the beginning of your program to make sure that the framework will work correctly.

    2. Dòng 16 Đặt chú thích của chương trình pygame của bạn bằng

      def _handle_input(self):
          for event in pygame.event.get():
              if event.type == pygame.QUIT or (
                  event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE
              ):
                  quit()
      
      6. Trong trường hợp này, chú thích sẽ là tên của trò chơi của bạn:
      def _handle_input(self):
          for event in pygame.event.get():
              if event.type == pygame.QUIT or (
                  event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE
              ):
                  quit()
      
      7.
      sets the caption of your Pygame program using
      def _handle_input(self):
          for event in pygame.event.get():
              if event.type == pygame.QUIT or (
                  event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE
              ):
                  quit()
      
      6. In this case, the caption will be the name of your game:
      def _handle_input(self):
          for event in pygame.event.get():
              if event.type == pygame.QUIT or (
                  event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE
              ):
                  quit()
      
      7.

  • Dòng 18 và 21 xác định

    def _handle_input(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT or (
                event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE
            ):
                quit()
    
    8 và
    def _handle_input(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT or (
                event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE
            ):
                quit()
    
    9. Bây giờ chúng trống rỗng, nhưng trong các phần sau, bạn sẽ thêm một số mã để làm cho trò chơi của bạn thú vị hơn.
    define
    def _handle_input(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT or (
                event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE
            ):
                quit()
    
    8 and
    def _handle_input(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT or (
                event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE
            ):
                quit()
    
    9. They’re empty for now, but in the following sections you’ll add some code to make your game more interesting.

  • Dòng 24 Xác định

    (venv) $ python -m pip install -r requirements.txt
    
    00. Sẽ rất có ý nghĩa khi tạo một mẫu cho trò chơi của bạn mà không hiển thị bất cứ thứ gì trên màn hình, vì vậy phương thức này đã có một số mã. Nó đã gọi mọi khung hình để vẽ nội dung của màn hình và nó thực hiện điều đó trong hai bước: defines
    (venv) $ python -m pip install -r requirements.txt
    
    00. It wouldn’t make much sense to create a template for your game without displaying anything on the screen, so this method already has some code. It’s called every frame to draw the content of the screen, and it does that in two steps:

    1. Dòng 25 lấp đầy màn hình bằng một màu bằng

      (venv) $ python -m pip install -r requirements.txt
      
      01. Phương pháp có một bộ xử lý với ba giá trị, đại diện cho ba màu cơ bản: đỏ, xanh lá cây và xanh dương. Mỗi giá trị màu nằm trong khoảng từ
      (venv) $ python -m pip install -r requirements.txt
      
      02 và
      (venv) $ python -m pip install -r requirements.txt
      
      03, biểu thị cường độ của nó. Trong ví dụ này, một tuple là (0, 0, 255) có nghĩa là màu sẽ chỉ bao gồm màu xanh lam, không có dấu vết màu đỏ hoặc màu xanh lá cây.
      fills the screen with a color using
      (venv) $ python -m pip install -r requirements.txt
      
      01. The method takes a tuple with three values, representing three base colors: red, green, and blue. Each color value ranges between
      (venv) $ python -m pip install -r requirements.txt
      
      02 and
      (venv) $ python -m pip install -r requirements.txt
      
      03, representing its intensity. In this example, a tuple of (0, 0, 255) means that the color will consist only of blue, with no traces of red or green.

    2. Dòng 26 Cập nhật nội dung của màn hình bằng

      (venv) $ python -m pip install -r requirements.txt
      
      04. Vì trò chơi của bạn cuối cùng sẽ hiển thị các đối tượng di chuyển, bạn sẽ gọi phương thức này mỗi khung hình để cập nhật màn hình. Do đó, bạn cần lấp đầy màn hình của mình bằng màu sắc mỗi khung hình, vì phương thức sẽ xóa các nội dung được tạo trong khung trước. updates the content of the screen using
      (venv) $ python -m pip install -r requirements.txt
      
      04. Because your game will eventually display moving objects, you’ll call this method every frame to update the display. Because of this, you need to fill your screen with color every frame, as the method will clear the contents generated during the previous frame.

Điều này có vẻ như rất nhiều bước bổ sung, nhưng bây giờ mã của bạn được cấu trúc độc đáo và có các phương pháp với tên mô tả. Lần tới khi bạn cần thay đổi một cái gì đó liên quan đến bản vẽ, bạn sẽ biết sử dụng

(venv) $ python -m pip install -r requirements.txt
00. Để thêm xử lý đầu vào, bạn sẽ sửa đổi
def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT or (
            event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE
        ):
            quit()
8, v.v.

Tiếp theo, tạo tệp

(venv) $ python -m pip install -r requirements.txt
07 trong thư mục
def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
4 của bạn. Tệp này sẽ quan tâm đến việc tạo một thể hiện mới của trò chơi của bạn và bắt đầu nó bằng cách chạy
(venv) $ python -m pip install -r requirements.txt
09. Nó sẽ giống như thế này:

from game import SpaceRocks

if __name__ == "__main__":
    space_rocks = SpaceRocks()
    space_rocks.main_loop()

Cấu trúc của dự án của bạn bây giờ trông như thế này:

awesome_pygame_project/
|
├── space_rocks/
|   ├── __main__.py
|   └── game.py
|
└── requirements.txt

Đi trước và chạy trò chơi:

(venv) $ python space_rocks

Bạn sẽ thấy một cửa sổ có nền màu xanh:

Hướng dẫn python code for shooting game - code python cho game bắn súng

Xin chúc mừng, bạn vừa tạo ra một dự án pygame! Tuy nhiên, không có điều kiện thoát nào tại thời điểm này, vì vậy bạn vẫn phải sử dụng Ctrl+C trong dòng lệnh để thoát khỏi nó. Đó là lý do tại sao bạn sẽ tìm hiểu về xử lý đầu vào tiếp theo.Ctrl+C in the command line to quit it. That’s why you’ll learn about input handling next.

Bước 2: Xử lý đầu vào

Tại thời điểm này, bạn có vòng lặp chính của trò chơi, sẵn sàng để được lấp đầy bằng logic. Vào cuối bước này, bạn cũng sẽ có một giàn giáo tại chỗ để bắt đầu cắm vào điều khiển người dùng.

Hầu hết việc xử lý đầu vào trong pygame xảy ra trong một vòng lặp sự kiện. Trong mỗi khung, chương trình của bạn có thể có được một tập hợp các sự kiện đã xảy ra kể từ khung trước. Điều đó bao gồm chuyển động của chuột, chìa khóa, v.v. Sau đó, từng người một, những sự kiện này có thể được xử lý. Trong pygame, phương pháp để có được bộ sưu tập đó là

(venv) $ python -m pip install -r requirements.txt
10.event loop. In each frame, your program can get a collection of events that happened since the previous frame. That includes mouse movement, keypresses, and so on. Then, one by one, these events can be handled. In Pygame, the method for obtaining that collection is
(venv) $ python -m pip install -r requirements.txt
10.

Sự kiện bạn cần ngay bây giờ là

(venv) $ python -m pip install -r requirements.txt
11. Nó xảy ra khi ai đó yêu cầu chương trình kết thúc, bằng cách nhấp vào Đóng hoặc bằng cách nhấn Alt+F4 trên Windows và Linux hoặc CMD+W trên macOS. Sửa đổi
(venv) $ python -m pip install -r requirements.txt
12 bằng cách viết lại
(venv) $ python -m pip install -r requirements.txt
13 như vậy:Alt+F4 on Windows and Linux or Cmd+W on macOS. Modify
(venv) $ python -m pip install -r requirements.txt
12 by rewriting
(venv) $ python -m pip install -r requirements.txt
13 like so:

def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()

Đi trước và kiểm tra nó. Chạy trò chơi và nhấp vào Little X trong góc hoặc sử dụng phím tắt thích hợp. Cửa sổ sẽ được đóng lại, giống như bạn mong đợi.

Nhưng bạn có thể tiến thêm một bước. Cuối cùng, trò chơi của bạn sẽ được điều khiển chỉ với bàn phím, không phải chuột. Làm thế nào về việc đóng cửa sổ bằng cách nhấn một khóa tùy chỉnh?

Có các loại sự kiện khác trong pygame và một trong số đó là một sự kiện Keypress. Nó được đại diện bởi một hằng số

(venv) $ python -m pip install -r requirements.txt
14. Mỗi sự kiện như vậy có thông tin về khóa được nhấn trong thuộc tính
(venv) $ python -m pip install -r requirements.txt
15. Bạn có thể kiểm tra các hằng số cho các khóa khác nhau trong tài liệu pygame. Trong ví dụ này, để đóng trò chơi bằng cách nhấn ESC, bạn sẽ sử dụng
(venv) $ python -m pip install -r requirements.txt
16.Esc, you’ll use
(venv) $ python -m pip install -r requirements.txt
16.

Sửa đổi phương thức

def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT or (
            event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE
        ):
            quit()
8 một lần nữa:

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

Bây giờ trò chơi của bạn cũng đóng khi bạn nhấn ESC.Esc.

Bạn đã quản lý để hiển thị một cửa sổ và đóng nó đúng cách. Nhưng cửa sổ vẫn chứa đầy một màu duy nhất. Tiếp theo, bạn sẽ học cách tải một hình ảnh và hiển thị nó trên màn hình.

Bước 3: Hình ảnh

Tại thời điểm này, bạn có một cửa sổ trò chơi mà bạn có thể đóng bằng cách nhấn phím. Ở cuối bước này, bạn sẽ hiển thị một hình ảnh trong cửa sổ đó.

Mặc dù bạn có thể tạo một trò chơi máy tính chỉ có hình chữ nhật màu và các hình dạng đơn giản khác, việc sử dụng hình ảnh sẽ làm cho nó hấp dẫn hơn nhiều. Trong phát triển trò chơi máy tính, hình ảnh thường được gọi là sprites. Tất nhiên, các trò chơi sử dụng nhiều loại tài nguyên hơn, như âm thanh, phông chữ, hình ảnh động, v.v. Cùng nhau, các tài nguyên này được gọi là tài sản.sprites. Of course, games use many more types of resources, like sounds, fonts, animations, and so on. Together, these resources are called assets.

Khi trò chơi của bạn phát triển, nó rất quan trọng để giữ một cấu trúc thích hợp. Vì vậy, hãy bắt đầu bằng cách tạo một thư mục gọi là

(venv) $ python -m pip install -r requirements.txt
18 và, bên trong nó, một thư mục khác được gọi là
(venv) $ python -m pip install -r requirements.txt
19. Đó là nơi mà bạn sẽ đặt tất cả các sprites được sử dụng bởi trò chơi của bạn.

Tiếp theo, tải xuống hình ảnh của nền không gian và đặt nó vào thư mục

(venv) $ python -m pip install -r requirements.txt
20. Bạn có thể tải xuống mã nguồn bằng cách nhấp vào liên kết bên dưới:

Ngoài ra, vì hình ảnh sẽ được tải nhiều lần trong chương trình của bạn, nên bạn nên trích xuất chức năng này vào một phương thức riêng biệt trong một tệp riêng biệt. Tạo một tệp được gọi là

(venv) $ python -m pip install -r requirements.txt
21 sẽ giữ tất cả các phương thức có thể tái sử dụng. Sau đó thực hiện tải hình ảnh:

(venv) $ python -m pip install -r requirements.txt
0

Đây là những gì xảy ra:

  • Dòng 1 nhập một phương thức gọi là

    (venv) $ python -m pip install -r requirements.txt
    
    22 sẽ cần thiết để đọc hình ảnh sau. imports a method called
    (venv) $ python -m pip install -r requirements.txt
    
    22 that will be necessary for reading images later.

  • Dòng 4 tạo ra một đường dẫn đến một hình ảnh, giả sử rằng nó được lưu trữ trong thư mục

    (venv) $ python -m pip install -r requirements.txt
    
    20 và nó là một tệp PNG. Bằng cách đó, bạn sẽ chỉ cần cung cấp tên của sprite sau. creates a path to an image, assuming that it’s stored in the
    (venv) $ python -m pip install -r requirements.txt
    
    20 directory and that it’s a PNG file. That way, you’ll only need to provide the name of the sprite later.

  • Dòng 5 tải hình ảnh bằng

    (venv) $ python -m pip install -r requirements.txt
    
    22. Phương pháp này trả về một bề mặt, là một đối tượng được sử dụng bởi pygame để thể hiện hình ảnh. Sau này bạn có thể vẽ nó trên màn hình (hoặc trên một bề mặt khác, nếu bạn muốn). loads the image using
    (venv) $ python -m pip install -r requirements.txt
    
    22. This method returns a surface, which is an object used by Pygame to represent images. You can later draw it on the screen (or on another surface, if you want).

  • Các dòng 8 và 10 chuyển đổi hình ảnh thành một định dạng phù hợp hơn với màn hình để tăng tốc quá trình vẽ. Điều này được thực hiện với

    (venv) $ python -m pip install -r requirements.txt
    
    25 hoặc
    (venv) $ python -m pip install -r requirements.txt
    
    26, tùy thuộc vào việc bạn muốn sử dụng tính minh bạch.
    convert the image to a format that better fits the screen to speed up the drawing process. This is done with either
    (venv) $ python -m pip install -r requirements.txt
    
    25 or
    (venv) $ python -m pip install -r requirements.txt
    
    26, depending on whether you want to use transparency.

Cấu trúc của dự án của bạn bây giờ trông như thế này:

(venv) $ python -m pip install -r requirements.txt
1

Bây giờ chương trình của bạn có thể tải hình ảnh, đó là thời gian để thay đổi nền màu xanh thành một thứ thú vị hơn. Chỉnh sửa tệp

(venv) $ python -m pip install -r requirements.txt
12:

(venv) $ python -m pip install -r requirements.txt
2

Để hiển thị một bề mặt trên một bề mặt khác trong pygame, bạn cần gọi

(venv) $ python -m pip install -r requirements.txt
28 trên bề mặt bạn muốn vẽ. Phương pháp này có hai đối số:

  1. Bề mặt mà bạn muốn vẽ
  2. Điểm mà bạn muốn vẽ nó

Nó rất tốt để ghi nhớ rằng trong pygame, hệ tọa độ bắt đầu ở góc trên cùng bên trái. Trục X đi từ trái sang phải và trục y đi từ trên xuống dưới:

Hướng dẫn python code for shooting game - code python cho game bắn súng

Như bạn có thể thấy, vectơ

(venv) $ python -m pip install -r requirements.txt
29, hướng lên trên, sẽ có một tọa độ y âm.

Các tọa độ được truyền đến

(venv) $ python -m pip install -r requirements.txt
28 được đưa ra dưới dạng hai giá trị:
(venv) $ python -m pip install -r requirements.txt
31 và
(venv) $ python -m pip install -r requirements.txt
32. Chúng đại diện cho điểm có góc trên cùng bên trái của bề mặt sẽ được đặt sau khi hoạt động:

Hướng dẫn python code for shooting game - code python cho game bắn súng

Như bạn có thể thấy, góc trên cùng bên trái được di chuyển bởi các tọa độ blit để tính toán vị trí chính xác.

Trong trường hợp của bạn, nền mới có cùng kích thước với màn hình (

def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT or (
            event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE
        ):
            quit()
1 ×
def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT or (
            event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE
        ):
            quit()
2 pixel), do đó, tọa độ sẽ là
(venv) $ python -m pip install -r requirements.txt
35, đại diện cho góc trên cùng bên trái của màn hình. Bằng cách đó, hình ảnh nền sẽ bao gồm toàn bộ màn hình.

Chạy chương trình của bạn ngay bây giờ và bạn sẽ thấy một màn hình có hình nền:

Hướng dẫn python code for shooting game - code python cho game bắn súng

Trò chơi của bạn bây giờ có một hình ảnh nền rất đẹp, nhưng chưa có gì xảy ra ở đó. Hãy để thay đổi điều này bằng cách thêm một số đối tượng.

Bước 4: Kiểm soát các đối tượng trò chơi

Tại thời điểm này, chương trình của bạn hiển thị hình ảnh nền của một mảnh vũ trụ nhỏ nơi trò chơi tiểu hành tinh của bạn sẽ diễn ra. Nó có một chút trống rỗng ngay bây giờ, vì vậy trong phần này, bạn sẽ lấp đầy nó. Bạn sẽ tạo ra một lớp đại diện cho các đối tượng trò chơi có thể vẽ khác và sử dụng nó để hiển thị tàu vũ trụ và tiểu hành tinh.

Hành vi nâng cao

Bạn đã sử dụng các bề mặt, nhưng Pygame cũng cung cấp một lớp khác,

(venv) $ python -m pip install -r requirements.txt
36, mà dự định là một lớp cơ sở cho các đối tượng có thể nhìn thấy. Nó chứa một số phương pháp hữu ích, nhưng bạn cũng có thể gặp phải một vài hạn chế.

Một hạn chế là một đối tượng trò chơi không chỉ là một sprite. Nó chứa dữ liệu bổ sung, như hướng và vận tốc của nó. Nó cũng cần các hành vi tiên tiến hơn, như bắn đạn hoặc phát âm thanh. Hầu hết các thông tin và hành vi bổ sung này được cung cấp bởi lớp

(venv) $ python -m pip install -r requirements.txt
36, vì vậy bạn sẽ cần phải tự mình thêm nó.

Một vấn đề khác là pygame rút ra các sprites bắt đầu từ góc trên bên trái. Trong trò chơi của bạn, có thể dễ dàng hơn để lưu trữ vị trí trung tâm của một đối tượng cho mục đích di chuyển và xoay nó. Trong trường hợp đó, bạn sẽ phải thực hiện một cách để biến vị trí đó thành một góc trên cùng theo yêu cầu của Pygame.

Cuối cùng, mặc dù pygame đã có các phương thức phát hiện sự chồng chéo giữa các hình ảnh, nhưng chúng có thể không tốt để phát hiện các va chạm giữa các đối tượng. Một tàu vũ trụ có thể xoay hoặc một tiểu hành tinh có thể đã giành được toàn bộ hình ảnh, nhưng thay vào đó là khu vực tròn trong đó. Trong trường hợp đó, vụ va chạm chỉ nên tính đến khu vực tròn đó, không phải toàn bộ bề mặt của sprite. Nếu không, bạn có thể nhận được kết quả không chính xác:

Hướng dẫn python code for shooting game - code python cho game bắn súng

Trong ví dụ này, các Sprites va chạm, nhưng các đối tượng trò chơi don lồng.

Đây thực sự là nơi lớp

(venv) $ python -m pip install -r requirements.txt
36 có thể giúp đỡ, vì bạn có thể sử dụng nó với
(venv) $ python -m pip install -r requirements.txt
39. Phương pháp này phát hiện sự va chạm giữa hai sprites bằng cách sử dụng các vòng tròn tập trung trên bề mặt của chúng. Tuy nhiên, việc phát hiện một vụ va chạm của các vòng tròn không phải là một quá trình rất phức tạp và bạn có thể tự mình thực hiện nó.

Với những vấn đề này, nó nhanh chóng trở nên rõ ràng rằng lớp Pygame

(venv) $ python -m pip install -r requirements.txt
36 được xây dựng có nghĩa là được tăng cường, không chỉ đơn giản là được sử dụng. Trong trường hợp trò chơi của bạn, Pygame Sprites cung cấp một vài tính năng hữu ích. Thay vào đó, nó có thể là một ý tưởng tốt để thực hiện một lớp tùy chỉnh cho các đối tượng trò chơi. Điều đó sẽ cung cấp cho bạn nhiều quyền kiểm soát hơn và giúp bạn hiểu một số khái niệm vì bạn sẽ tự mình thực hiện chúng.

Lớp GameObject

Trong phần này, bạn sẽ giới thiệu lớp

(venv) $ python -m pip install -r requirements.txt
41. Nó sẽ gói gọn một số hành vi và dữ liệu chung cho tất cả các đối tượng trò chơi khác. Các lớp đại diện cho các đối tượng cụ thể (như tàu vũ trụ) sẽ kế thừa từ nó và mở rộng nó bằng hành vi và dữ liệu của chính họ. Nếu bạn muốn làm mới kiến ​​thức của mình về các lớp học và kế thừa, thì hãy kiểm tra lập trình hướng đối tượng (OOP) trong Python 3.

Lớp

(venv) $ python -m pip install -r requirements.txt
41 sẽ lưu trữ các dữ liệu sau:

  • (venv) $ python -m pip install -r requirements.txt
    
    43: Một điểm ở giữa đối tượng trên màn hình 2D
    A point in the center of the object on the 2D screen
  • (venv) $ python -m pip install -r requirements.txt
    
    44: Một hình ảnh được sử dụng để hiển thị đối tượng
    An image used to display the object
  • (venv) $ python -m pip install -r requirements.txt
    
    45: Một giá trị đại diện cho vùng va chạm xung quanh vị trí đối tượng
    A value representing the collision zone around the object’s position
  • (venv) $ python -m pip install -r requirements.txt
    
    46: Một giá trị được sử dụng cho chuyển động
    A value used for movement

Ở đây, một đại diện đồ họa của đối tượng trò chơi:

Hướng dẫn python code for shooting game - code python cho game bắn súng

(venv) $ python -m pip install -r requirements.txt
44 sẽ là một bề mặt được tải với
(venv) $ python -m pip install -r requirements.txt
48 từ các ví dụ trước.
(venv) $ python -m pip install -r requirements.txt
45 là một số nguyên cho biết số lượng pixel từ tâm đối tượng đến cạnh của vùng va chạm. Tuy nhiên, chính
(venv) $ python -m pip install -r requirements.txt
43 và
(venv) $ python -m pip install -r requirements.txt
46 sẽ cần một loại mới: một vectơ.vector.

Các vectơ tương tự như bộ dữ liệu. Trong một thế giới 2D (giống như thế giới trong trò chơi của bạn), các vectơ được thể hiện bằng hai giá trị biểu thị tọa độ x và y. Các tọa độ này có thể chỉ ra một vị trí, nhưng chúng cũng có thể đại diện cho chuyển động hoặc gia tốc theo một hướng nhất định. Các vectơ có thể được thêm, trừ hoặc thậm chí nhân để nhanh chóng cập nhật vị trí của một sprite. Bạn có thể đọc thêm về các vectơ trong các vectơ trong không gian 2 chiều.

Do các vectơ hữu ích như thế nào trong các trò chơi, pygame đã có một lớp cho chúng:

(venv) $ python -m pip install -r requirements.txt
52 trong mô -đun
(venv) $ python -m pip install -r requirements.txt
53. Nó cung cấp một số chức năng bổ sung, như tính toán khoảng cách giữa các vectơ và thêm hoặc trừ các vectơ. Những tính năng đó sẽ làm cho logic trò chơi của bạn dễ thực hiện hơn nhiều.

Trong thư mục

def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
4, tạo một tệp mới có tên
(venv) $ python -m pip install -r requirements.txt
55. Hiện tại, nó sẽ lưu trữ lớp
(venv) $ python -m pip install -r requirements.txt
41, nhưng sau đó bạn sẽ thêm các lớp cho các tiểu hành tinh, đạn và tàu vũ trụ. Tệp sẽ trông như thế này:

(venv) $ python -m pip install -r requirements.txt
3

Ở đây, một sự cố:

  • Dòng 1 nhập lớp

    (venv) $ python -m pip install -r requirements.txt
    
    52 được đề cập trước đó. imports the
    (venv) $ python -m pip install -r requirements.txt
    
    52 class mentioned earlier.

  • Dòng 3 tạo ra lớp

    (venv) $ python -m pip install -r requirements.txt
    
    41, mà bạn sẽ sử dụng để đại diện cho tất cả các đối tượng trò chơi trong Space Rocks. creates the
    (venv) $ python -m pip install -r requirements.txt
    
    41 class, which you’ll use to represent all game objects in Space Rocks.

  • Dòng 4 là hàm tạo của lớp

    (venv) $ python -m pip install -r requirements.txt
    
    41. Nó cần ba đối số: is the constructor of the
    (venv) $ python -m pip install -r requirements.txt
    
    41 class. It needs three arguments:

    1. (venv) $ python -m pip install -r requirements.txt
      
      43: trung tâm của đối tượng The center of the object

    2. (venv) $ python -m pip install -r requirements.txt
      
      44: Hình ảnh được sử dụng để vẽ đối tượng này The image used to draw this object

    3. (venv) $ python -m pip install -r requirements.txt
      
      46: Cập nhật
      (venv) $ python -m pip install -r requirements.txt
      
      43 của đối tượng mỗi khung hình
      Updates the
      (venv) $ python -m pip install -r requirements.txt
      
      43 of the object each frame

  • Các dòng 5 và 8 đảm bảo rằng

    (venv) $ python -m pip install -r requirements.txt
    
    43 và
    (venv) $ python -m pip install -r requirements.txt
    
    46 sẽ luôn được biểu diễn dưới dạng vectơ cho các tính toán trong tương lai, ngay cả khi các bộ đếm được truyền cho hàm tạo. Bạn làm điều đó bằng cách gọi hàm xây dựng
    (venv) $ python -m pip install -r requirements.txt
    
    66. Nếu nó đưa ra một tuple, thì nó sẽ tạo ra một vectơ mới từ nó. Nếu nó cung cấp một vectơ, thì nó sẽ tạo ra một bản sao của vectơ đó.
    ensure that the
    (venv) $ python -m pip install -r requirements.txt
    
    43 and the
    (venv) $ python -m pip install -r requirements.txt
    
    46 will always be represented as vectors for future calculations, even if tuples are passed to the constructor. You do that by calling the
    (venv) $ python -m pip install -r requirements.txt
    
    66 constructor. If it’s given a tuple, then it will create a new vector out of it. If it’s given a vector, then it will create a copy of that vector.

  • Dòng 7 tính toán

    (venv) $ python -m pip install -r requirements.txt
    
    45 là một nửa chiều rộng của hình ảnh
    (venv) $ python -m pip install -r requirements.txt
    
    44. Trong chương trình này, trò chơi đối tượng Sprites sẽ luôn là hình vuông với nền tảng trong suốt. Bạn cũng có thể sử dụng chiều cao của hình ảnh, nó sẽ không có gì khác biệt.
    calculates the
    (venv) $ python -m pip install -r requirements.txt
    
    45 as half the width of the
    (venv) $ python -m pip install -r requirements.txt
    
    44 image. In this program, game object sprites will always be squares with transparent backgrounds. You could also use the height of the image—it would make no difference.

  • Dòng 10 Xác định

    (venv) $ python -m pip install -r requirements.txt
    
    69, sẽ vẽ đối tượng trên
    (venv) $ python -m pip install -r requirements.txt
    
    44 trên bề mặt được truyền như một đối số.
    defines
    (venv) $ python -m pip install -r requirements.txt
    
    69, which will draw the object’s
    (venv) $ python -m pip install -r requirements.txt
    
    44 on the surface passed as an argument.

  • Dòng 11 tính toán vị trí chính xác để làm mờ hình ảnh. Quá trình được mô tả chi tiết hơn dưới đây. Lưu ý rằng hàm tạo

    (venv) $ python -m pip install -r requirements.txt
    
    66 nhận được một số duy nhất thay vì một tuple. Trong trường hợp đó, nó sẽ sử dụng số đó cho cả hai giá trị. Vì vậy,
    (venv) $ python -m pip install -r requirements.txt
    
    72 là tương đương với
    (venv) $ python -m pip install -r requirements.txt
    
    73.
    calculates the correct position for blitting the image. The process is described in more detail below. Notice that the
    (venv) $ python -m pip install -r requirements.txt
    
    66 constructor receives a single number instead of a tuple. In that case, it will use that number for both values. So
    (venv) $ python -m pip install -r requirements.txt
    
    72 is the equivalent of
    (venv) $ python -m pip install -r requirements.txt
    
    73.

  • Dòng 12 sử dụng vị trí blit mới được tính toán để đặt đối tượng của bạn Sprite vào một vị trí chính xác trên bề mặt đã cho. uses the newly calculated blit position to put your object’s sprite in a correct place on the given surface.

  • Dòng 14 xác định

    (venv) $ python -m pip install -r requirements.txt
    
    74. Nó sẽ cập nhật vị trí của đối tượng trò chơi. defines
    (venv) $ python -m pip install -r requirements.txt
    
    74. It will update the position of the game object.

  • Dòng 15 thêm vận tốc vào vị trí và kết quả là nhận được một vectơ vị trí được cập nhật. Pygame làm cho các vectơ thao túng đơn giản, cho phép bạn thêm chúng như số. adds the velocity to the position and gets an updated position vector as a result. Pygame makes manipulating vectors straightforward, allowing you to add them like numbers.

  • Dòng 17 Xác định phương pháp

    (venv) $ python -m pip install -r requirements.txt
    
    75, sẽ được sử dụng để phát hiện các va chạm. defines the
    (venv) $ python -m pip install -r requirements.txt
    
    75 method, that will be used to detect collisions.

  • Dòng 18 tính toán khoảng cách giữa hai đối tượng bằng cách sử dụng

    (venv) $ python -m pip install -r requirements.txt
    
    76. calculates the distance between two objects by using
    (venv) $ python -m pip install -r requirements.txt
    
    76.

  • Dòng 19 kiểm tra xem khoảng cách đó có nhỏ hơn tổng của các đối tượng bán kính không. Nếu vậy, các đối tượng va chạm. checks if that distance is smaller than the sum of the objects’ radiuses. If so, the objects collide.

Xin lưu ý rằng các đối tượng trò chơi của bạn có vị trí trung tâm, nhưng

(venv) $ python -m pip install -r requirements.txt
28 yêu cầu một góc trên cùng bên trái. Vì vậy, vị trí blit phải được tính bằng cách di chuyển vị trí thực tế của đối tượng bằng một vectơ:

Hướng dẫn python code for shooting game - code python cho game bắn súng

Quá trình đó xảy ra trong

(venv) $ python -m pip install -r requirements.txt
69.

Bạn có thể kiểm tra điều này bằng cách thêm một tàu vũ trụ và một tiểu hành tinh duy nhất. Đầu tiên, sao chép hình ảnh tàu vũ trụ và tiểu hành tinh thành

(venv) $ python -m pip install -r requirements.txt
20. Bạn có thể tải xuống mã nguồn bằng cách nhấp vào liên kết bên dưới:

Cấu trúc của dự án của bạn sẽ trông như thế này:

(venv) $ python -m pip install -r requirements.txt
4

Bây giờ sửa đổi tệp

(venv) $ python -m pip install -r requirements.txt
12:

(venv) $ python -m pip install -r requirements.txt
5

Cả hai đối tượng được đặt ở giữa màn hình, sử dụng tọa độ

(venv) $ python -m pip install -r requirements.txt
81. Cả hai đối tượng Vị trí của bạn sẽ được cập nhật từng khung hình bằng cách sử dụng
def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT or (
            event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE
        ):
            quit()
9 và chúng sẽ được vẽ bằng cách sử dụng
(venv) $ python -m pip install -r requirements.txt
00.

Chạy chương trình này và bạn sẽ thấy một tiểu hành tinh di chuyển sang phải và một con tàu vũ trụ đứng yên ở giữa màn hình:

Hướng dẫn python code for shooting game - code python cho game bắn súng

Bạn cũng có thể kiểm tra

(venv) $ python -m pip install -r requirements.txt
75 bằng cách tạm thời thêm một dòng vào cuối
(venv) $ python -m pip install -r requirements.txt
00:

(venv) $ python -m pip install -r requirements.txt
6

Trong dòng lệnh, bạn sẽ nhận thấy cách phương thức ban đầu in

(venv) $ python -m pip install -r requirements.txt
86 kể từ khi tiểu hành tinh bao phủ tàu vũ trụ. Sau đó, khi tiểu hành tinh di chuyển xa hơn sang phải, nó bắt đầu in
(venv) $ python -m pip install -r requirements.txt
87.

Kiểm soát tốc độ

Bây giờ bạn có các đối tượng di chuyển trên màn hình, đó là thời gian để suy nghĩ về cách trò chơi của bạn sẽ hoạt động trên các máy khác nhau với các bộ xử lý khác nhau. Đôi khi, nó sẽ chạy nhanh hơn, và đôi khi nó sẽ chạy chậm hơn.

Do đó, các tiểu hành tinh (và các viên đạn sớm) sẽ di chuyển với tốc độ khác nhau, làm cho trò chơi đôi khi dễ dàng hơn và đôi khi khó hơn. Đó không phải là thứ mà bạn muốn. Những gì bạn muốn là trò chơi của bạn chạy với số lượng khung cố định mỗi giây (FPS).frames per second (FPS).

May mắn thay, pygame có thể chăm sóc điều đó. Nó cung cấp một lớp

(venv) $ python -m pip install -r requirements.txt
88 với phương thức
(venv) $ python -m pip install -r requirements.txt
89. Phương pháp này sẽ chờ đủ lâu để phù hợp với giá trị FPS mong muốn, được truyền như một đối số.

Đi trước và cập nhật

(venv) $ python -m pip install -r requirements.txt
12:

(venv) $ python -m pip install -r requirements.txt
7

Nếu bạn chạy trò chơi của mình ngay bây giờ, thì tiểu hành tinh có thể di chuyển với tốc độ khác so với ban đầu. Tuy nhiên, bây giờ bạn có thể chắc chắn rằng tốc độ này sẽ vẫn giữ nguyên, ngay cả trên các máy tính có bộ xử lý siêu nhanh. Đó là vì trò chơi của bạn sẽ luôn chạy ở tốc độ 60 khung hình / giây. Bạn cũng có thể thử nghiệm với các giá trị khác nhau được truyền đến

(venv) $ python -m pip install -r requirements.txt
89 để thấy sự khác biệt.

Bạn chỉ học cách hiển thị và di chuyển các đối tượng trên màn hình. Bây giờ bạn có thể thêm một số logic nâng cao hơn vào trò chơi của bạn.

Bước 5: Tàu vũ trụ

Tại thời điểm này, bạn nên có một lớp học cho các đối tượng trò chơi có thể rút ra và di chuyển chung. Vào cuối bước này, bạn sẽ sử dụng nó để tạo ra một tàu vũ trụ có thể điều khiển được.

Lớp bạn đã tạo trong bước trước,

(venv) $ python -m pip install -r requirements.txt
41, giữ một số logic chung có thể được sử dụng lại bởi các đối tượng trò chơi khác nhau. Tuy nhiên, mỗi đối tượng trò chơi cũng sẽ thực hiện logic của riêng mình. Tàu vũ trụ, ví dụ, dự kiến ​​sẽ quay và tăng tốc. Nó cũng sẽ bắn đạn, nhưng điều đó đến sau.

Tạo một lớp học

Hình ảnh của tàu vũ trụ đã có trong thư mục

(venv) $ python -m pip install -r requirements.txt
93 mà bạn đã thêm vào bước 4. Tuy nhiên, trước đó nó đã được sử dụng trong tệp trò chơi chính và bây giờ bạn cần tải nó vào một trong các mô hình. Để có thể thực hiện việc này, hãy cập nhật phần nhập khẩu trong tệp
(venv) $ python -m pip install -r requirements.txt
94:

(venv) $ python -m pip install -r requirements.txt
8

Bây giờ bạn có thể tạo, trong cùng một tệp, lớp

(venv) $ python -m pip install -r requirements.txt
95 kế thừa từ
(venv) $ python -m pip install -r requirements.txt
41:

(venv) $ python -m pip install -r requirements.txt
9

Nó không làm rất nhiều điều tại thời điểm này, nó chỉ gọi hàm tạo

(venv) $ python -m pip install -r requirements.txt
41 với một hình ảnh cụ thể và vận tốc bằng không. Tuy nhiên, bạn sẽ sớm thêm nhiều chức năng hơn.

Để sử dụng lớp mới này, trước tiên bạn cần nhập nó. Cập nhật nhập khẩu trong tệp

(venv) $ python -m pip install -r requirements.txt
12 như thế này:

(venv) $ python -m pygame.examples.aliens
0

Bạn có thể nhận thấy rằng nhập khẩu ban đầu của lớp

(venv) $ python -m pip install -r requirements.txt
41 đã biến mất. Điều đó bởi vì
(venv) $ python -m pip install -r requirements.txt
41 được sử dụng làm lớp cơ sở để được các lớp khác kế thừa. Bạn không nên sử dụng nó trực tiếp, nhưng thay vào đó nhập các lớp đại diện cho các đối tượng trò chơi thực tế.

Điều này có nghĩa là tiểu hành tinh từ bước trước sẽ ngừng hoạt động, nhưng đó không phải là vấn đề lớn. Bạn sẽ sớm thêm một lớp thích hợp đại diện cho các tiểu hành tinh. Cho đến lúc đó, bạn nên tập trung vào tàu vũ trụ.

Đi trước và chỉnh sửa lớp

def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
6 để trông như thế này:

(venv) $ python -m pygame.examples.aliens
1

Hai điều đã xảy ra:

  1. Trong dòng 7, bạn đã thay thế lớp cơ sở

    (venv) $ python -m pip install -r requirements.txt
    
    41 bằng lớp
    (venv) $ python -m pip install -r requirements.txt
    
    95 chuyên dụng.

  2. Bạn đã xóa tất cả các tài liệu tham khảo

    (venv) $ python -m pygame.examples.aliens
    
    04 từ
    (venv) $ python -m pygame.examples.aliens
    
    05,
    def _handle_input(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT or (
                event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE
            ):
                quit()
    
    9 và
    (venv) $ python -m pip install -r requirements.txt
    
    00.

Nếu bạn chạy trò chơi của mình ngay bây giờ, thì bạn sẽ thấy một con tàu vũ trụ ở giữa màn hình:

Hướng dẫn python code for shooting game - code python cho game bắn súng

Những thay đổi đã không thêm bất kỳ hành vi mới nào, nhưng bây giờ bạn có một lớp mà bạn có thể mở rộng.

Xoay tàu vũ trụ

Theo mặc định, tàu vũ trụ đang hướng lên, hướng về phía trên màn hình. Người chơi của bạn sẽ có thể xoay nó trái và phải. May mắn thay, pygame có các phương pháp tích hợp để xoay sprites, nhưng có một vấn đề nhỏ.

Nói chung, xoay hình ảnh là một quá trình phức tạp đòi hỏi các pixel tính toán lại trong hình ảnh mới. Trong quá trình tính toán lại đó, thông tin về các pixel ban đầu bị mất và hình ảnh bị biến dạng một chút. Với mỗi vòng quay, biến dạng ngày càng trở nên rõ ràng hơn.

Do đó, có thể là một ý tưởng tốt hơn để lưu trữ sprite ban đầu trong lớp

(venv) $ python -m pip install -r requirements.txt
95 và có một sprite khác, sẽ được cập nhật mỗi khi tàu vũ trụ quay.

Đối với cách tiếp cận đó để làm việc, bạn sẽ cần phải biết góc mà tàu vũ trụ được xoay. Điều này có thể được thực hiện theo hai cách:

  1. Giữ góc như một giá trị điểm nổi và cập nhật nó trong quá trình xoay.
  2. Giữ vectơ biểu thị hướng mà tàu vũ trụ đang đối mặt và tính toán góc bằng vectơ đó.

Cả hai cách đều tốt, nhưng bạn cần chọn một trước khi tiến hành. Vì vị trí và vận tốc của tàu vũ trụ đã là vectơ, nên sử dụng một vectơ khác để thể hiện hướng. Điều đó sẽ làm cho nó đơn giản hơn khi thêm các vectơ và cập nhật vị trí sau. May mắn thay, lớp

(venv) $ python -m pip install -r requirements.txt
52 có thể được xoay rất dễ dàng, và kết quả đã giành được biến dạng.

Đầu tiên, tạo một vectơ không đổi gọi là

(venv) $ python -m pip install -r requirements.txt
29 trong tệp
(venv) $ python -m pip install -r requirements.txt
94. Bạn sẽ sử dụng nó làm tài liệu tham khảo sau:

Hãy nhớ rằng trục y Pygame từ trên từ trên xuống dưới, do đó, một giá trị âm thực sự chỉ lên trên:

Hướng dẫn python code for shooting game - code python cho game bắn súng

Tiếp theo, sửa đổi lớp

(venv) $ python -m pip install -r requirements.txt
95:

(venv) $ python -m pygame.examples.aliens
2

Giá trị

(venv) $ python -m pygame.examples.aliens
13 xác định mức độ nhanh chóng của tàu vũ trụ của bạn có thể xoay. Bạn đã học được trước đó rằng các vectơ trong pygame có thể được xoay và giá trị này đại diện cho một góc theo độ mà hướng tàu vũ trụ của bạn có thể xoay từng khung hình. Sử dụng một số lượng lớn hơn sẽ xoay tàu vũ trụ nhanh hơn, trong khi một số lượng nhỏ hơn sẽ cho phép điều khiển chi tiết hơn đối với vòng quay.

Tiếp theo, thêm một hướng vào lớp

(venv) $ python -m pip install -r requirements.txt
95 bằng cách sửa đổi hàm tạo:

(venv) $ python -m pygame.examples.aliens
3

Vectơ hướng ban đầu sẽ giống như vectơ

(venv) $ python -m pip install -r requirements.txt
29. Tuy nhiên, nó sẽ được sửa đổi sau, vì vậy bạn cần tạo một bản sao của nó.

Tiếp theo, bạn cần tạo một phương thức mới trong lớp

(venv) $ python -m pip install -r requirements.txt
95 được gọi là
(venv) $ python -m pygame.examples.aliens
17:

(venv) $ python -m pygame.examples.aliens
4

Phương pháp này sẽ thay đổi hướng bằng cách xoay nó theo chiều kim đồng hồ hoặc ngược chiều kim đồng hồ. Phương pháp

(venv) $ python -m pygame.examples.aliens
18 của lớp
(venv) $ python -m pip install -r requirements.txt
52 xoay nó vào vị trí theo một góc nhất định tính theo độ. Độ dài của vectơ không thay đổi trong quá trình hoạt động này. Bạn có thể tìm hiểu thêm một chút về phép toán nâng cao đằng sau xoay vectơ 2D từ các điểm quay bằng ma trận xoay.

Tất cả những gì còn lại là để cập nhật bản vẽ của

(venv) $ python -m pip install -r requirements.txt
95. Để làm điều này, trước tiên bạn cần nhập
(venv) $ python -m pygame.examples.aliens
21, chịu trách nhiệm cho việc mở rộng và xoay hình ảnh:

(venv) $ python -m pygame.examples.aliens
5

Sau đó, bạn có thể ghi đè phương thức

(venv) $ python -m pip install -r requirements.txt
69 trong lớp
(venv) $ python -m pip install -r requirements.txt
95:

(venv) $ python -m pygame.examples.aliens
6

Ở đây, một sự cố từng bước:

  • Dòng 2 sử dụng phương pháp

    (venv) $ python -m pygame.examples.aliens
    
    24 của lớp
    (venv) $ python -m pip install -r requirements.txt
    
    52 để tính toán góc mà một vectơ cần được xoay để chỉ theo cùng một hướng với vectơ khác. Điều này làm cho nó không đau khi dịch hướng tàu vũ trụ vào góc quay theo độ.
    uses the
    (venv) $ python -m pygame.examples.aliens
    
    24 method of the
    (venv) $ python -m pip install -r requirements.txt
    
    52 class to calculate the angle by which one vector needs to be rotated in order to point in the same direction as the other vector. This makes it painless to translate the spaceship’s direction into the rotation angle in degrees.

  • Dòng 3 xoay sprite bằng

    (venv) $ python -m pygame.examples.aliens
    
    26. Nó lấy hình ảnh gốc, góc mà nó nên được xoay và tỷ lệ nên được áp dụng cho sprite. Trong trường hợp này, bạn không muốn thay đổi kích thước, vì vậy bạn giữ thang đo là
    (venv) $ python -m pygame.examples.aliens
    
    27.
    rotates the sprite using
    (venv) $ python -m pygame.examples.aliens
    
    26. It takes the original image, the angle by which it should be rotated, and the scale that should be applied to the sprite. In this case, you don’t want to change the size, so you keep the scale as
    (venv) $ python -m pygame.examples.aliens
    
    27.

  • Các dòng 4 và 5 tính toán lại vị trí blit, sử dụng kích thước

    (venv) $ python -m pygame.examples.aliens
    
    28. Quá trình được mô tả dưới đây. recalculate the blit position, using the size of
    (venv) $ python -m pygame.examples.aliens
    
    28. The process is described below.

  • Dòng 5 chứa hoạt động

    (venv) $ python -m pygame.examples.aliens
    
    29. Đó là một điều khác mà bạn có thể làm với các vectơ trong pygame. Khi bạn nhân một vectơ với một số, tất cả các tọa độ của nó được nhân với số đó. Do đó, nhân với
    (venv) $ python -m pygame.examples.aliens
    
    30 sẽ trả về một vectơ với một nửa chiều dài của bản gốc.
    contains the
    (venv) $ python -m pygame.examples.aliens
    
    29 operation. That’s another thing you can do with vectors in Pygame. When you multiply a vector by a number, all its coordinates are multiplied by that number. As a result, multiplying by
    (venv) $ python -m pygame.examples.aliens
    
    30 will return a vector with half the length of the original.

  • Dòng 6 sử dụng vị trí Blit mới được tính toán để đặt hình ảnh lên màn hình. uses the newly calculated blit position to put the image on the screen.

Lưu ý rằng

(venv) $ python -m pygame.examples.aliens
26 trả về một bề mặt mới với hình ảnh xoay. Tuy nhiên, để giữ tất cả các nội dung của sprite gốc, hình ảnh mới có thể có kích thước khác. Trong trường hợp đó, pygame sẽ thêm một số nền tảng, minh bạch bổ sung:

Hướng dẫn python code for shooting game - code python cho game bắn súng

Kích thước của hình ảnh mới có thể khác biệt đáng kể so với hình ảnh gốc. Đó là lý do tại sao

(venv) $ python -m pip install -r requirements.txt
69 tính toán lại vị trí blit của
(venv) $ python -m pygame.examples.aliens
28. Hãy nhớ rằng
(venv) $ python -m pip install -r requirements.txt
28 bắt đầu ở góc trên bên trái, để tập trung vào hình ảnh xoay, bạn cũng cần di chuyển vị trí blit bằng một nửa kích thước của hình ảnh.

Bây giờ bạn cần thêm xử lý đầu vào. Tuy nhiên, vòng lặp sự kiện đã giành chiến thắng chính xác ở đây. Các sự kiện được ghi lại khi chúng xảy ra, nhưng bạn cần liên tục kiểm tra xem phím có được nhấn không. Rốt cuộc, tàu vũ trụ sẽ tăng tốc miễn là bạn ấn lên, và nó sẽ quay liên tục khi bạn nhấn bên trái hoặc phải.Up, and it should rotate constantly when you press Left or Right.

Bạn có thể tạo một lá cờ cho mỗi phím, đặt nó khi nhấn phím và đặt lại khi nó được phát hành. Tuy nhiên, có một cách tốt hơn.

Trạng thái hiện tại của bàn phím được lưu trữ trong pygame và có thể thu được bằng cách sử dụng

(venv) $ python -m pygame.examples.aliens
35. Nó trả về một từ điển trong đó các hằng số khóa (như
(venv) $ python -m pip install -r requirements.txt
16 mà bạn đã sử dụng trước đó) là các khóa và giá trị là
(venv) $ python -m pip install -r requirements.txt
86 nếu nhấn phím hoặc
(venv) $ python -m pip install -r requirements.txt
87 khác.

Biết được điều này, bạn có thể chỉnh sửa tệp

(venv) $ python -m pip install -r requirements.txt
12 và cập nhật phương thức
def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT or (
            event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE
        ):
            quit()
8 của lớp
def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
6. Các hằng số bạn cần sử dụng cho các phím mũi tên là
(venv) $ python -m pygame.examples.aliens
42 và
(venv) $ python -m pygame.examples.aliens
43:

(venv) $ python -m pygame.examples.aliens
7

Bây giờ tàu vũ trụ của bạn sẽ xoay trái và phải khi bạn nhấn các phím mũi tên:

Hướng dẫn python code for shooting game - code python cho game bắn súng

Như bạn có thể thấy, tàu vũ trụ quay chính xác. Tuy nhiên, nó vẫn không di chuyển. Bạn sẽ sửa chữa điều đó tiếp theo.

Tăng tốc tàu vũ trụ

Trong phần này, bạn sẽ thêm gia tốc vào tàu vũ trụ của mình. Hãy nhớ rằng, theo cơ chế trò chơi của các tiểu hành tinh, tàu vũ trụ chỉ có thể tiến về phía trước.

Trong trò chơi của bạn, khi bạn nhấn lên, tốc độ tàu vũ trụ sẽ tăng lên. Khi bạn phát hành khóa, tàu vũ trụ sẽ duy trì tốc độ hiện tại của nó nhưng không còn tăng tốc nữa. Vì vậy, để làm chậm nó, bạn sẽ phải xoay tàu vũ trụ và ấn lại.Up, the spaceship’s speed will increase. When you release the key, the spaceship will maintain its current speed but should no longer accelerate. So in order to slow it down, you’ll have to turn the spaceship around and press Up again.

Quá trình này có vẻ hơi phức tạp, vì vậy trước khi bạn tiến hành, đây là một bản tóm tắt ngắn:

  • (venv) $ python -m pygame.examples.aliens
    
    44 là một vector mô tả nơi tàu vũ trụ đang chỉ.
    is a vector describing where the spaceship is pointing.
  • (venv) $ python -m pip install -r requirements.txt
    
    46 là một vectơ mô tả nơi tàu vũ trụ di chuyển từng khung hình.
    is a vector describing where the spaceship moves each frame.
  • (venv) $ python -m pygame.examples.aliens
    
    46 là một số không đổi mô tả mức độ nhanh chóng của tàu vũ trụ có thể tăng tốc từng khung hình.
    is a constant number describing how fast the spaceship can speed up each frame.

Bạn có thể tính toán thay đổi vận tốc bằng cách nhân vectơ

(venv) $ python -m pygame.examples.aliens
44 với giá trị
(venv) $ python -m pygame.examples.aliens
46 và thêm kết quả vào
(venv) $ python -m pip install -r requirements.txt
46 hiện tại. Điều này chỉ xảy ra khi động cơ ở trên đó, khi người chơi nhấn lên. Vị trí mới của tàu vũ trụ được tính toán bằng cách thêm vận tốc hiện tại vào vị trí hiện tại của tàu vũ trụ. Điều này xảy ra mỗi khung hình, bất kể trạng thái động cơ.Up. The new position of the spaceship is calculated by adding the current velocity to the current position of the spaceship. This happens each frame, regardless of the engine status.

Biết được điều này, bạn có thể thêm giá trị

(venv) $ python -m pygame.examples.aliens
46 vào lớp
(venv) $ python -m pip install -r requirements.txt
95:

(venv) $ python -m pygame.examples.aliens
8

Sau đó, tạo

(venv) $ python -m pygame.examples.aliens
52 trong lớp
(venv) $ python -m pip install -r requirements.txt
95:

(venv) $ python -m pygame.examples.aliens
9

Bây giờ bạn có thể thêm xử lý đầu vào vào

def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT or (
            event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE
        ):
            quit()
8 trong
def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
6. Tương tự như vòng quay, điều này sẽ kiểm tra trạng thái hiện tại của bàn phím, không phải là sự kiện Keypress. Hằng số cho UP là
(venv) $ python -m pygame.examples.aliens
56:Up is
(venv) $ python -m pygame.examples.aliens
56:

 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
0

Đi trước và kiểm tra điều này. Chạy trò chơi của bạn, xoay tàu vũ trụ và bật động cơ:

Hướng dẫn python code for shooting game - code python cho game bắn súng

Tàu vũ trụ của bạn bây giờ có thể di chuyển và xoay! Tuy nhiên, khi nó đến cạnh của màn hình, nó chỉ tiếp tục di chuyển. Đó là một cái gì đó bạn nên sửa!

Bao bọc các đối tượng xung quanh màn hình

Một yếu tố quan trọng của trò chơi này là đảm bảo rằng các đối tượng trò chơi không rời khỏi màn hình. Bạn có thể để chúng bật ra khỏi cạnh hoặc làm cho chúng xuất hiện lại ở cạnh đối diện của màn hình. Trong dự án này, bạn sẽ thực hiện cái sau.

Bắt đầu bằng cách nhập lớp

(venv) $ python -m pip install -r requirements.txt
52 trong tệp
(venv) $ python -m pip install -r requirements.txt
21:

 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
1

Tiếp theo, tạo

(venv) $ python -m pygame.examples.aliens
59 trong cùng một tệp:

 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
2

Bằng cách sử dụng toán tử modulo trên dòng 4, bạn đảm bảo rằng vị trí không bao giờ rời khỏi khu vực của bề mặt đã cho. Trong trò chơi của bạn, bề mặt đó sẽ là màn hình.

Nhập phương thức mới này trong

(venv) $ python -m pip install -r requirements.txt
94:

 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
3

Bây giờ bạn có thể cập nhật

(venv) $ python -m pip install -r requirements.txt
74 trong lớp
(venv) $ python -m pip install -r requirements.txt
41:

 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
4

Lưu ý rằng việc sử dụng

(venv) $ python -m pygame.examples.aliens
59 không phải là thay đổi duy nhất ở đây. Bạn cũng thêm một đối số
(venv) $ python -m pygame.examples.aliens
64 mới vào phương thức này. Điều đó bởi vì bạn cần phải biết khu vực xung quanh vị trí nên được bọc. Hãy nhớ cập nhật cuộc gọi phương thức trong lớp
def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
6:

 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
5

Bây giờ tàu vũ trụ của bạn xuất hiện lại ở phía bên kia của màn hình.

Logic của việc di chuyển và xoay tàu vũ trụ đã sẵn sàng. Nhưng con tàu vẫn cô đơn trong không gian trống. Thời gian để thêm một số tiểu hành tinh!

Bước 6: Tiểu hành tinh

Tại thời điểm này, bạn có một tàu vũ trụ duy nhất mà bạn có thể di chuyển trên màn hình. Vào cuối bước này, trò chơi của bạn cũng sẽ hiển thị một số tiểu hành tinh. Hơn nữa, bạn sẽ thực hiện các va chạm giữa tàu vũ trụ và tiểu hành tinh.

Tạo một lớp học

Tương tự như

(venv) $ python -m pip install -r requirements.txt
95, bạn sẽ bắt đầu bằng cách tạo một lớp gọi là
(venv) $ python -m pygame.examples.aliens
67 kế thừa từ
(venv) $ python -m pip install -r requirements.txt
41. Chỉnh sửa tệp
(venv) $ python -m pip install -r requirements.txt
94 như vậy:

 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
6

Giống như trước đây, bạn bắt đầu bằng cách gọi hàm xây dựng

(venv) $ python -m pip install -r requirements.txt
41 với một hình ảnh cụ thể. Bạn đã thêm hình ảnh trong một trong các bước trước.

Tiếp theo, nhập lớp mới trong

(venv) $ python -m pip install -r requirements.txt
12:

 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
7

Cuối cùng, chỉnh sửa hàm tạo của lớp

def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
6 trong cùng một tệp để tạo sáu tiểu hành tinh:

 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
8

Bây giờ bạn có nhiều đối tượng trò chơi hơn, sẽ là một ý tưởng tốt để tạo ra một phương pháp trợ giúp trong lớp

def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
6 trả về tất cả chúng. Phương pháp này sau đó sẽ được sử dụng bởi logic vẽ và di chuyển. Bằng cách đó, sau này bạn có thể giới thiệu các loại đối tượng trò chơi mới và chỉ sửa đổi phương thức duy nhất này hoặc bạn có thể loại trừ một số đối tượng khỏi nhóm này nếu cần thiết.

Gọi phương thức này

(venv) $ python -m pygame.examples.aliens
74:

 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
9

Bây giờ sử dụng nó để di chuyển tất cả các đối tượng trò chơi trong một vòng lặp duy nhất bằng cách chỉnh sửa

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

 1import pygame
 2
 3class SpaceRocks:
 4    def __init__(self):
 5        self._init_pygame()
 6        self.screen = pygame.display.set_mode((800, 600))
 7
 8    def main_loop(self):
 9        while True:
10            self._handle_input()
11            self._process_game_logic()
12            self._draw()
13
14    def _init_pygame(self):
15        pygame.init()
16        pygame.display.set_caption("Space Rocks")
17
18    def _handle_input(self):
19        pass
20
21    def _process_game_logic(self):
22        pass
23
24    def _draw(self):
25        self.screen.fill((0, 0, 255))
26        pygame.display.flip()
0

Điều tương tự cũng xảy ra với

(venv) $ python -m pip install -r requirements.txt
00:

 1import pygame
 2
 3class SpaceRocks:
 4    def __init__(self):
 5        self._init_pygame()
 6        self.screen = pygame.display.set_mode((800, 600))
 7
 8    def main_loop(self):
 9        while True:
10            self._handle_input()
11            self._process_game_logic()
12            self._draw()
13
14    def _init_pygame(self):
15        pygame.init()
16        pygame.display.set_caption("Space Rocks")
17
18    def _handle_input(self):
19        pass
20
21    def _process_game_logic(self):
22        pass
23
24    def _draw(self):
25        self.screen.fill((0, 0, 255))
26        pygame.display.flip()
1

Chạy trò chơi của bạn ngay bây giờ và bạn sẽ thấy một màn hình với các tiểu hành tinh:

Hướng dẫn python code for shooting game - code python cho game bắn súng

Thật không may, tất cả các tiểu hành tinh được chất đống ở một góc của màn hình.

Chà, đó là loại mong đợi, vì tất cả các tiểu hành tinh được tạo ra với vị trí

(venv) $ python -m pip install -r requirements.txt
35, đại diện cho góc trên cùng bên trái. Bạn có thể thay đổi điều này bằng cách đặt một vị trí ngẫu nhiên trên màn hình.

Ngẫu nhiên vị trí

Để tạo một vị trí ngẫu nhiên, bạn sẽ phải thêm một số nhập vào tệp

(venv) $ python -m pip install -r requirements.txt
21:

 1import pygame
 2
 3class SpaceRocks:
 4    def __init__(self):
 5        self._init_pygame()
 6        self.screen = pygame.display.set_mode((800, 600))
 7
 8    def main_loop(self):
 9        while True:
10            self._handle_input()
11            self._process_game_logic()
12            self._draw()
13
14    def _init_pygame(self):
15        pygame.init()
16        pygame.display.set_caption("Space Rocks")
17
18    def _handle_input(self):
19        pass
20
21    def _process_game_logic(self):
22        pass
23
24    def _draw(self):
25        self.screen.fill((0, 0, 255))
26        pygame.display.flip()
2

Sau đó, tạo một phương thức gọi là

(venv) $ python -m pygame.examples.aliens
79 trong cùng một tệp:

 1import pygame
 2
 3class SpaceRocks:
 4    def __init__(self):
 5        self._init_pygame()
 6        self.screen = pygame.display.set_mode((800, 600))
 7
 8    def main_loop(self):
 9        while True:
10            self._handle_input()
11            self._process_game_logic()
12            self._draw()
13
14    def _init_pygame(self):
15        pygame.init()
16        pygame.display.set_caption("Space Rocks")
17
18    def _handle_input(self):
19        pass
20
21    def _process_game_logic(self):
22        pass
23
24    def _draw(self):
25        self.screen.fill((0, 0, 255))
26        pygame.display.flip()
3

Điều này sẽ tạo ra một tập hợp tọa độ ngẫu nhiên trên một bề mặt nhất định và trả về kết quả dưới dạng một ví dụ

(venv) $ python -m pip install -r requirements.txt
52.

Tiếp theo, nhập phương thức này vào tệp

(venv) $ python -m pip install -r requirements.txt
12:

 1import pygame
 2
 3class SpaceRocks:
 4    def __init__(self):
 5        self._init_pygame()
 6        self.screen = pygame.display.set_mode((800, 600))
 7
 8    def main_loop(self):
 9        while True:
10            self._handle_input()
11            self._process_game_logic()
12            self._draw()
13
14    def _init_pygame(self):
15        pygame.init()
16        pygame.display.set_caption("Space Rocks")
17
18    def _handle_input(self):
19        pass
20
21    def _process_game_logic(self):
22        pass
23
24    def _draw(self):
25        self.screen.fill((0, 0, 255))
26        pygame.display.flip()
4

Bây giờ sử dụng

(venv) $ python -m pygame.examples.aliens
79 để đặt tất cả sáu tiểu hành tinh ở các vị trí ngẫu nhiên. Sửa đổi hàm tạo của lớp
def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
6:

 1import pygame
 2
 3class SpaceRocks:
 4    def __init__(self):
 5        self._init_pygame()
 6        self.screen = pygame.display.set_mode((800, 600))
 7
 8    def main_loop(self):
 9        while True:
10            self._handle_input()
11            self._process_game_logic()
12            self._draw()
13
14    def _init_pygame(self):
15        pygame.init()
16        pygame.display.set_caption("Space Rocks")
17
18    def _handle_input(self):
19        pass
20
21    def _process_game_logic(self):
22        pass
23
24    def _draw(self):
25        self.screen.fill((0, 0, 255))
26        pygame.display.flip()
5

Bây giờ khi bạn chạy trò chơi, bạn sẽ thấy một bản phân phối ngẫu nhiên, ngẫu nhiên của các tiểu hành tinh trên màn hình:

Hướng dẫn python code for shooting game - code python cho game bắn súng

Điều này có vẻ tốt hơn nhiều, nhưng có một vấn đề nhỏ: các tiểu hành tinh được tạo ra trong cùng khu vực với tàu vũ trụ. Sau khi bạn thêm các va chạm, điều này sẽ khiến người chơi thua ngay sau khi bắt đầu trò chơi. Điều đó sẽ rất không công bằng!

Một giải pháp cho vấn đề này là kiểm tra xem vị trí có quá gần với tàu vũ trụ không, và nếu vậy, hãy tạo một vị trí mới cho đến khi tìm thấy vị trí hợp lệ.

Bắt đầu bằng cách tạo một liên tục đại diện cho một khu vực phải trống. Giá trị của

(venv) $ python -m pygame.examples.aliens
84 pixel là đủ:

 1import pygame
 2
 3class SpaceRocks:
 4    def __init__(self):
 5        self._init_pygame()
 6        self.screen = pygame.display.set_mode((800, 600))
 7
 8    def main_loop(self):
 9        while True:
10            self._handle_input()
11            self._process_game_logic()
12            self._draw()
13
14    def _init_pygame(self):
15        pygame.init()
16        pygame.display.set_caption("Space Rocks")
17
18    def _handle_input(self):
19        pass
20
21    def _process_game_logic(self):
22        pass
23
24    def _draw(self):
25        self.screen.fill((0, 0, 255))
26        pygame.display.flip()
6

Bây giờ bạn có thể sửa đổi hàm tạo của lớp

def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
6 để đảm bảo rằng người chơi của bạn luôn có cơ hội giành chiến thắng:

 1import pygame
 2
 3class SpaceRocks:
 4    def __init__(self):
 5        self._init_pygame()
 6        self.screen = pygame.display.set_mode((800, 600))
 7
 8    def main_loop(self):
 9        while True:
10            self._handle_input()
11            self._process_game_logic()
12            self._draw()
13
14    def _init_pygame(self):
15        pygame.init()
16        pygame.display.set_caption("Space Rocks")
17
18    def _handle_input(self):
19        pass
20
21    def _process_game_logic(self):
22        pass
23
24    def _draw(self):
25        self.screen.fill((0, 0, 255))
26        pygame.display.flip()
7

Trong một vòng lặp, mã của bạn kiểm tra xem vị trí của một tiểu hành tinh lớn hơn khoảng cách tiểu hành tinh tối thiểu. Nếu không, thì vòng lặp chạy lại cho đến khi tìm thấy vị trí như vậy.

Chạy lại chương trình và không có tiểu hành tinh nào chồng chéo với tàu vũ trụ:

Hướng dẫn python code for shooting game - code python cho game bắn súng

Bạn có thể chạy trò chơi nhiều lần để đảm bảo rằng mỗi lần có một số không gian trống xung quanh tàu vũ trụ.

Di chuyển các tiểu hành tinh

Hiện tại, chương trình của bạn cho thấy sáu tiểu hành tinh ở các vị trí ngẫu nhiên và bạn đã sẵn sàng để thêm gia vị một chút bằng cách di chuyển chúng! Tương tự như vị trí, vận tốc của một tiểu hành tinh cũng phải là ngẫu nhiên, không chỉ theo hướng, mà còn cả giá trị.

Bắt đầu bằng cách tạo một phương thức gọi là

(venv) $ python -m pygame.examples.aliens
86 trong tệp
(venv) $ python -m pip install -r requirements.txt
21:

 1import pygame
 2
 3class SpaceRocks:
 4    def __init__(self):
 5        self._init_pygame()
 6        self.screen = pygame.display.set_mode((800, 600))
 7
 8    def main_loop(self):
 9        while True:
10            self._handle_input()
11            self._process_game_logic()
12            self._draw()
13
14    def _init_pygame(self):
15        pygame.init()
16        pygame.display.set_caption("Space Rocks")
17
18    def _handle_input(self):
19        pass
20
21    def _process_game_logic(self):
22        pass
23
24    def _draw(self):
25        self.screen.fill((0, 0, 255))
26        pygame.display.flip()
8

Phương pháp này sẽ tạo ra một giá trị ngẫu nhiên giữa

(venv) $ python -m pygame.examples.aliens
88 và
(venv) $ python -m pygame.examples.aliens
89 và một góc ngẫu nhiên giữa 0 đến 360 độ. Sau đó, nó sẽ tạo ra một vectơ với giá trị đó, được xoay theo góc đó.

Bởi vì vận tốc tiểu hành tinh nên là ngẫu nhiên cho dù nó được đặt ở đâu, hãy để sử dụng phương pháp này trực tiếp trong lớp

(venv) $ python -m pygame.examples.aliens
67. Bắt đầu với việc cập nhật nhập khẩu trong tệp
(venv) $ python -m pip install -r requirements.txt
94:

 1import pygame
 2
 3class SpaceRocks:
 4    def __init__(self):
 5        self._init_pygame()
 6        self.screen = pygame.display.set_mode((800, 600))
 7
 8    def main_loop(self):
 9        while True:
10            self._handle_input()
11            self._process_game_logic()
12            self._draw()
13
14    def _init_pygame(self):
15        pygame.init()
16        pygame.display.set_caption("Space Rocks")
17
18    def _handle_input(self):
19        pass
20
21    def _process_game_logic(self):
22        pass
23
24    def _draw(self):
25        self.screen.fill((0, 0, 255))
26        pygame.display.flip()
9

Lưu ý rằng bạn đã đặt một vị trí ngẫu nhiên của bạn ở một nơi và vận tốc ngẫu nhiên của bạn ở một nơi khác. Điều đó bởi vì vị trí chỉ nên ngẫu nhiên cho sáu tiểu hành tinh mà bạn bắt đầu, do đó, nó được đặt trong tệp

(venv) $ python -m pip install -r requirements.txt
12, trong đó trò chơi được khởi tạo. Tuy nhiên, vận tốc là ngẫu nhiên cho mỗi tiểu hành tinh, do đó bạn đặt nó trong hàm tạo của lớp
(venv) $ python -m pygame.examples.aliens
67.

Sau đó sử dụng phương thức mới trong hàm tạo của lớp

(venv) $ python -m pygame.examples.aliens
67:

from game import SpaceRocks

if __name__ == "__main__":
    space_rocks = SpaceRocks()
    space_rocks.main_loop()
0

Lưu ý rằng phương pháp sử dụng giá trị tối thiểu là

(venv) $ python -m pygame.examples.aliens
95. Điều đó bởi vì tiểu hành tinh nên luôn luôn di chuyển, ít nhất là một chút.

Chạy lại trò chơi của bạn để thấy các tiểu hành tinh di chuyển:

Bạn cũng có thể di chuyển tàu vũ trụ xung quanh màn hình. Thật không may, khi nó gặp một tiểu hành tinh, không có gì xảy ra. Nó thời gian để thêm một số va chạm.

Va chạm với tàu vũ trụ

Một phần rất quan trọng của trò chơi này là khả năng tàu vũ trụ của bạn bị phá hủy bởi một vụ va chạm tiểu hành tinh. Bạn có thể kiểm tra các va chạm bằng cách sử dụng

(venv) $ python -m pygame.examples.aliens
96 được giới thiệu trong bước 4. Tất cả những gì bạn cần thực hiện, hãy gọi phương pháp này cho mỗi tiểu hành tinh.

Chỉnh sửa phương thức

def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT or (
            event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE
        ):
            quit()
9 trong lớp
def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
6 như thế này:

from game import SpaceRocks

if __name__ == "__main__":
    space_rocks = SpaceRocks()
    space_rocks.main_loop()
1

Nếu bất kỳ tiểu hành tinh nào va chạm với tàu vũ trụ, thì tàu vũ trụ sẽ bị phá hủy. Trong trò chơi này, bạn sẽ đại diện cho điều này bằng cách đặt

(venv) $ python -m pygame.examples.aliens
99 thành
 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
00.

Lưu ý rằng cũng có một tấm séc cho

(venv) $ python -m pygame.examples.aliens
99 khi bắt đầu vòng lặp. Điều đó bởi vì, khi tàu vũ trụ bị phá hủy, không có lý do gì để kiểm tra bất kỳ va chạm nào với nó. Ngoài ra, việc phát hiện va chạm với đối tượng
 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
00 sẽ dẫn đến lỗi.

Bây giờ, tàu vũ trụ có thể có giá trị

 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
00, điều quan trọng là phải cập nhật
(venv) $ python -m pygame.examples.aliens
74 trong lớp
def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
6 để tránh cố gắng đưa ra hoặc di chuyển một con tàu vũ trụ bị phá hủy:

from game import SpaceRocks

if __name__ == "__main__":
    space_rocks = SpaceRocks()
    space_rocks.main_loop()
2

Điều tương tự cũng xảy ra đối với việc xử lý đầu vào:

from game import SpaceRocks

if __name__ == "__main__":
    space_rocks = SpaceRocks()
    space_rocks.main_loop()
3

Bạn có thể chạy trò chơi của mình ngay bây giờ và thấy rằng tàu vũ trụ biến mất sau khi va chạm với một tiểu hành tinh:

Hướng dẫn python code for shooting game - code python cho game bắn súng

Tàu vũ trụ của bạn bây giờ có thể bay xung quanh và bị phá hủy khi nó va chạm với các tiểu hành tinh. Bạn đã sẵn sàng để làm cho các tiểu hành tinh có thể bị phá hủy.

Bước 7: Đạn

Tại thời điểm này, bạn có một số tiểu hành tinh được đặt và di chuyển ngẫu nhiên và một con tàu vũ trụ có thể di chuyển xung quanh và tránh chúng. Vào cuối bước này, tàu vũ trụ của bạn cũng sẽ có thể tự vệ bằng cách bắn đạn.

Tạo một lớp học

Bắt đầu với việc thêm một hình ảnh của một viên đạn vào

(venv) $ python -m pip install -r requirements.txt
20. Bạn có thể tải xuống mã nguồn bằng cách nhấp vào liên kết bên dưới:

Cấu trúc của dự án của bạn sẽ trông như thế này:

from game import SpaceRocks

if __name__ == "__main__":
    space_rocks = SpaceRocks()
    space_rocks.main_loop()
4

Sau đó, chỉnh sửa tệp

(venv) $ python -m pip install -r requirements.txt
94 bằng cách tạo một lớp gọi là
 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
08 kế thừa từ
(venv) $ python -m pip install -r requirements.txt
41:

from game import SpaceRocks

if __name__ == "__main__":
    space_rocks = SpaceRocks()
    space_rocks.main_loop()
5

Giống như trước đây, điều này sẽ chỉ gọi hàm xây dựng

(venv) $ python -m pip install -r requirements.txt
41 với một sprite cụ thể. Tuy nhiên, lần này vận tốc sẽ là một đối số cần thiết vì một viên đạn phải di chuyển.

Tiếp theo, bạn nên thêm một cách để theo dõi các viên đạn, tương tự như những gì bạn đã làm cho các tiểu hành tinh. Chỉnh sửa hàm tạo của lớp

def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
6 trong tệp
(venv) $ python -m pip install -r requirements.txt
12:

from game import SpaceRocks

if __name__ == "__main__":
    space_rocks = SpaceRocks()
    space_rocks.main_loop()
6

Đạn nên được xử lý giống như các đối tượng trò chơi khác, vì vậy hãy chỉnh sửa phương pháp

 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
13 trong
def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
6:

from game import SpaceRocks

if __name__ == "__main__":
    space_rocks = SpaceRocks()
    space_rocks.main_loop()
7

Danh sách các viên đạn là có, nhưng bây giờ nó trống rỗng. Bạn có thể sửa chữa điều đó.

Chụp một viên đạn

Có một vấn đề nhỏ với bắn súng. Đạn được lưu trữ trong đối tượng trò chơi chính, được đại diện bởi lớp

def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
6. Tuy nhiên, logic bắn phải được xác định bởi tàu vũ trụ. Nó có một tàu vũ trụ biết cách tạo ra một viên đạn mới, nhưng nó là trò chơi lưu trữ và sau đó hoạt hình các viên đạn. Lớp
(venv) $ python -m pip install -r requirements.txt
95 cần một cách để thông báo cho lớp
def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
6 rằng một viên đạn đã được tạo ra và nên được theo dõi.

Để sửa lỗi này, bạn có thể thêm chức năng gọi lại vào lớp

(venv) $ python -m pip install -r requirements.txt
95. Hàm đó sẽ được cung cấp bởi lớp
def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
6 khi tàu vũ trụ được khởi tạo. Mỗi khi tàu vũ trụ tạo ra một viên đạn, nó sẽ khởi tạo một đối tượng
 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
08 và sau đó gọi gọi lại. Cuộc gọi lại sẽ thêm viên đạn vào danh sách tất cả các viên đạn được lưu trữ bởi trò chơi.

Bắt đầu bằng cách thêm một cuộc gọi lại vào hàm tạo của lớp

(venv) $ python -m pip install -r requirements.txt
95 trong tệp
(venv) $ python -m pip install -r requirements.txt
94:

from game import SpaceRocks

if __name__ == "__main__":
    space_rocks = SpaceRocks()
    space_rocks.main_loop()
8

Bạn cũng sẽ cần giá trị của tốc độ của viên đạn:

from game import SpaceRocks

if __name__ == "__main__":
    space_rocks = SpaceRocks()
    space_rocks.main_loop()
9

Tiếp theo, tạo một phương thức gọi là

 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
23 trong lớp
(venv) $ python -m pip install -r requirements.txt
95:

awesome_pygame_project/
|
├── space_rocks/
|   ├── __main__.py
|   └── game.py
|
└── requirements.txt
0

Bạn bắt đầu bằng cách tính toán vận tốc của viên đạn. Viên đạn luôn được bắn về phía trước, vì vậy bạn sử dụng hướng của tàu vũ trụ nhân với tốc độ của viên đạn. Bởi vì tàu vũ trụ không nhất thiết phải đứng yên, bạn thêm vận tốc của nó vào vận tốc của viên đạn. Bằng cách đó, bạn có thể tạo những viên đạn tốc độ cao nếu tàu vũ trụ đang di chuyển rất nhanh.

Sau đó, bạn tạo một thể hiện của lớp

 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
08 tại cùng một vị trí với tàu vũ trụ, sử dụng vận tốc vừa được tính toán. Cuối cùng, viên đạn được thêm vào tất cả các viên đạn trong trò chơi bằng cách sử dụng phương thức gọi lại.

Bây giờ thêm cuộc gọi lại vào tàu vũ trụ khi nó tạo ra. Đạn được lưu trữ dưới dạng danh sách, và điều duy nhất mà cuộc gọi lại phải làm là thêm các mục mới vào danh sách đó. Do đó, phương pháp

 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
26 nên thực hiện công việc. Chỉnh sửa hàm tạo của lớp
def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
6 trong tệp
(venv) $ python -m pip install -r requirements.txt
12:

awesome_pygame_project/
|
├── space_rocks/
|   ├── __main__.py
|   └── game.py
|
└── requirements.txt
1

Điều cuối cùng bạn cần thêm là xử lý đầu vào. Bullet chỉ nên được tạo ra khi không gian nhấn, vì vậy bạn có thể sử dụng vòng lặp sự kiện. Hằng số cho không gian là

 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
29.Space pressed, so you can use the event loop. The constant for Space is
 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
29.

Sửa đổi phương thức

def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT or (
            event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE
        ):
            quit()
8 trong lớp
def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
6:

awesome_pygame_project/
|
├── space_rocks/
|   ├── __main__.py
|   └── game.py
|
└── requirements.txt
2

Lưu ý rằng việc xử lý đầu vào mới cũng kiểm tra xem tàu ​​vũ trụ có tồn tại không. Nếu không, bạn có thể gặp lỗi khi cố gắng gọi

 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
23 trên đối tượng
 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
00.

Chạy trò chơi của bạn ngay bây giờ và bắn một số viên đạn:

Hướng dẫn python code for shooting game - code python cho game bắn súng

Tàu vũ trụ của bạn cuối cùng có thể bắn! Tuy nhiên, những viên đạn không rời khỏi màn hình, có thể là một vấn đề.

Gói đạn

Hiện tại, tất cả các đối tượng trò chơi được quấn quanh màn hình. Điều đó bao gồm đạn. Tuy nhiên, vì gói này, màn hình nhanh chóng chứa đầy những viên đạn bay theo mọi hướng. Điều đó có thể làm cho trò chơi hơi quá dễ dàng!

Bạn có thể giải quyết vấn đề này bằng cách vô hiệu hóa chỉ gói cho đạn. Ghi đè

(venv) $ python -m pip install -r requirements.txt
74 trong lớp
 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
08 trong tệp
(venv) $ python -m pip install -r requirements.txt
94 như thế này:

awesome_pygame_project/
|
├── space_rocks/
|   ├── __main__.py
|   └── game.py
|
└── requirements.txt
3

Bằng cách đó, những viên đạn đã giành được bao quanh màn hình. Tuy nhiên, họ cũng giành chiến thắng bị phá hủy. Thay vào đó, họ sẽ tiếp tục bay vào vực thẳm vô hạn của vũ trụ. Ngay sau đó, danh sách các viên đạn của bạn sẽ chứa hàng ngàn yếu tố và tất cả chúng sẽ được xử lý trong mỗi khung hình, dẫn đến sự suy giảm hiệu suất của trò chơi của bạn.

Để tránh tình huống đó, trò chơi của bạn sẽ loại bỏ các viên đạn ngay khi chúng rời khỏi màn hình. Cập nhật phương thức

def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT or (
            event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE
        ):
            quit()
9 của lớp
def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
6 trong tệp
(venv) $ python -m pip install -r requirements.txt
12:

awesome_pygame_project/
|
├── space_rocks/
|   ├── __main__.py
|   └── game.py
|
└── requirements.txt
4

Lưu ý rằng thay vì sử dụng danh sách ban đầu,

 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
40, bạn tạo một bản sao của nó bằng
 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
41 trong dòng 11. Điều đó vì loại bỏ các phần tử khỏi danh sách trong khi lặp lại nó có thể gây ra lỗi.

Các bề mặt trong pygame có phương pháp

 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
42 trả về một hình chữ nhật đại diện cho khu vực của chúng. Lần lượt, hình chữ nhật đó có phương thức
 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
43 trả về
(venv) $ python -m pip install -r requirements.txt
86 nếu một điểm được bao gồm trong hình chữ nhật và
(venv) $ python -m pip install -r requirements.txt
87 khác. Sử dụng hai phương pháp này, bạn có thể kiểm tra xem viên đạn có rời khỏi màn hình không, và nếu vậy, hãy xóa nó khỏi danh sách.

Va chạm với các tiểu hành tinh

Một yếu tố quan trọng trong viên đạn của bạn vẫn còn thiếu: khả năng phá hủy các tiểu hành tinh! Bạn sẽ sửa nó trong phần này.

Cập nhật phương thức

def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT or (
            event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE
        ):
            quit()
9 của lớp
def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
6 như thế này:

awesome_pygame_project/
|
├── space_rocks/
|   ├── __main__.py
|   └── game.py
|
└── requirements.txt
5

Bây giờ, bất cứ khi nào một vụ va chạm được phát hiện giữa một viên đạn và tiểu hành tinh, cả hai sẽ bị loại khỏi trò chơi. Lưu ý rằng, giống như trước đây trong Vòng đạn, bạn không sử dụng danh sách ban đầu ở đây. Thay vào đó, bạn tạo các bản sao bằng

 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
48 trong dòng 11 và 12.

Nếu bạn chạy trò chơi của mình ngay bây giờ và có mục tiêu tốt khi chụp, thì bạn sẽ có thể phá hủy một số tiểu hành tinh:

Hướng dẫn python code for shooting game - code python cho game bắn súng

Tàu vũ trụ của bạn cuối cùng có thể tự bảo vệ mình! Tuy nhiên, chỉ có sáu mục tiêu lớn trong trò chơi. Tiếp theo, bạn sẽ làm cho nó khó khăn hơn một chút.

Bước 8: Tách các tiểu hành tinh

Tại thời điểm này, bạn có một trò chơi với tàu vũ trụ, tiểu hành tinh và đạn. Vào cuối bước này, các tiểu hành tinh của bạn sẽ bị chia rẽ khi bị bắn bởi một viên đạn. Một tiểu hành tinh lớn sẽ biến thành hai trung bình, một trung bình sẽ biến thành hai cái nhỏ và một cái nhỏ sẽ biến mất.

Kích thước của một tiểu hành tinh sẽ được biểu thị bằng một số:

Kích thước tiểu hành tinhLoại tiểu hành tinh
 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
49
Tiểu hành tinh lớn
 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
50
Tiểu hành tinh trung bình
(venv) $ python -m pygame.examples.aliens
95
Tiểu hành tinh nhỏ

Mỗi lần một tiểu hành tinh được đánh, nó sẽ tạo ra hai tiểu hành tinh với kích thước nhỏ hơn. Ngoại lệ là một tiểu hành tinh có kích thước 1, vì nó không nên tạo ra bất kỳ tiểu hành tinh mới nào.

Kích thước của một tiểu hành tinh cũng sẽ xác định kích thước của sprite của nó và do đó bán kính của nó. Nói cách khác, các tiểu hành tinh sẽ được thu nhỏ như thế này:

Kích thước tiểu hành tinhLoại tiểu hành tinhSự mô tả
3 1 Sprite và bán kính mặc định
2 0.5 Một nửa sprite và bán kính mặc định
1 0.25 Một phần tư của sprite và bán kính mặc định

Điều này có vẻ hơi phức tạp, nhưng bạn có thể làm điều đó chỉ với một vài dòng mã. Viết lại hàm tạo của lớp

(venv) $ python -m pygame.examples.aliens
67 trong tệp
(venv) $ python -m pip install -r requirements.txt
94:

awesome_pygame_project/
|
├── space_rocks/
|   ├── __main__.py
|   └── game.py
|
└── requirements.txt
6

Phương pháp này sẽ gán một kích thước cho một tiểu hành tinh, sử dụng giá trị mặc định

 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
49, đại diện cho một tiểu hành tinh lớn. Nó cũng sẽ mở rộng quy mô sprite ban đầu bằng cách sử dụng
(venv) $ python -m pygame.examples.aliens
26. Bạn đã sử dụng nó trước đây để xoay tàu vũ trụ. Phương pháp này cũng có thể được sử dụng để chia tỷ lệ nếu góc là 0 và tỷ lệ là bất cứ thứ gì khác ngoài 0. Trong ví dụ này, bảng tra cứu
 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
56 chứa tỷ lệ cho các kích thước khác nhau:

Kích thướcTỉ lệ
3 1
2 0.5
1 0.25

Cuối cùng, bạn chuyển sprite tỷ lệ cho hàm tạo của lớp

(venv) $ python -m pip install -r requirements.txt
41, sẽ chăm sóc việc tính toán bán kính dựa trên kích thước hình ảnh mới.

Logic mới của bạn đòi hỏi một tiểu hành tinh để có thể tạo ra các tiểu hành tinh mới. Tình huống tương tự như tàu vũ trụ và đạn, vì vậy bạn có thể sử dụng một giải pháp tương tự: phương thức gọi lại.

Cập nhật hàm tạo của lớp

(venv) $ python -m pygame.examples.aliens
67:

awesome_pygame_project/
|
├── space_rocks/
|   ├── __main__.py
|   └── game.py
|
└── requirements.txt
7

Bây giờ bạn có thể tạo một phương thức gọi là

 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
59 trong cùng một lớp:

awesome_pygame_project/
|
├── space_rocks/
|   ├── __main__.py
|   └── game.py
|
└── requirements.txt
8

Điều này sẽ tạo ra hai tiểu hành tinh mới ở cùng một vị trí với vị trí hiện tại. Mỗi người trong số họ sẽ có kích thước nhỏ hơn một chút. Logic này sẽ chỉ xảy ra nếu tiểu hành tinh hiện tại là trung bình hoặc lớn.

Bây giờ bạn có thể thêm cuộc gọi lại cho mỗi tiểu hành tinh mới được tạo vào hàm tạo của lớp

def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
6. Giống như trong trường hợp tàu vũ trụ, bạn sẽ sử dụng phương thức
 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
26 của danh sách thích hợp:

awesome_pygame_project/
|
├── space_rocks/
|   ├── __main__.py
|   └── game.py
|
└── requirements.txt
9

Hãy nhớ gọi

 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
59 khi một tiểu hành tinh bị một viên đạn đâm vào. Cập nhật phương thức
def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT or (
            event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE
        ):
            quit()
9 của lớp
def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
6:

(venv) $ python space_rocks
0

Nếu bạn chạy trò chơi của mình ngay bây giờ và bắn hạ một số tiểu hành tinh, thì bạn sẽ nhận thấy rằng, thay vì biến mất ngay lập tức, chúng chia thành những người nhỏ hơn:

Hướng dẫn python code for shooting game - code python cho game bắn súng

Bạn vừa triển khai toàn bộ logic của trò chơi! Spaceship có thể di chuyển, nó bị phá hủy sau khi va chạm với một tiểu hành tinh, nó bắn đạn và các tiểu hành tinh chia thành những cái nhỏ hơn. Nhưng trò chơi đang im lặng vào lúc này. Bạn sẽ chăm sóc điều đó tiếp theo.

Bước 9: Phát âm thanh

Tại thời điểm này, chương trình của bạn hiển thị tất cả các đối tượng trò chơi và xử lý các tương tác giữa chúng. Vào cuối bước này, trò chơi của bạn cũng sẽ phát âm thanh.

Trong Bước 7, tàu vũ trụ được trang bị vũ khí. Vũ khí đó, tuy nhiên, hoàn toàn im lặng. Điều này rất chính xác về vật lý, vì âm thanh don đi du lịch trong chân không (trong không gian không ai có thể nghe thấy bạn hét lên). Tuy nhiên, sử dụng âm thanh trong trò chơi của bạn sẽ làm cho nó hấp dẫn hơn nhiều.

Đầu tiên, tạo một thư mục

 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
65 và thêm âm thanh laser ở đó. Bạn có thể tải xuống mã nguồn bằng cách nhấp vào liên kết bên dưới:

Cấu trúc dự án của bạn sẽ trông như thế này:

(venv) $ python space_rocks
1

Bây giờ bạn cần tải tệp. Trong pygame, một âm thanh được biểu thị bằng lớp

 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
66 từ mô -đun
 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
67. Mặc dù bạn sẽ chỉ sử dụng một âm thanh duy nhất trong trò chơi này, bạn có thể muốn thêm nhiều hơn sau. Đó là lý do tại sao bạn sẽ tạo ra một phương thức trợ giúp để tải âm thanh, tương tự như phương pháp bạn đã tạo cho Sprites.

Đầu tiên, nhập lớp

 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
66 trong tệp
(venv) $ python -m pip install -r requirements.txt
21:

(venv) $ python space_rocks
2

Tiếp theo, hãy tạo một phương thức gọi là

 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
70 trong cùng một tệp:

(venv) $ python space_rocks
3

Phương pháp này có logic tương tự như

(venv) $ python -m pip install -r requirements.txt
48. Nó sẽ cho rằng âm thanh luôn nằm trong thư mục
 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
65 và nó là một tệp WAV.

Bây giờ bạn có thể nhập phương thức mới này trong tệp

(venv) $ python -m pip install -r requirements.txt
94:

(venv) $ python space_rocks
4

Sau đó tải âm thanh trong hàm tạo của lớp

(venv) $ python -m pip install -r requirements.txt
95:

(venv) $ python space_rocks
5

Cuối cùng, bạn nên phát âm thanh bất cứ khi nào tàu vũ trụ bắn. Cập nhật

 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
23:

(venv) $ python space_rocks
6

Chạy trò chơi ngay bây giờ và bạn sẽ nghe thấy một âm thanh mỗi khi bạn quay.

Bạn chỉ học cách làm việc với các tệp âm thanh trong pygame! Tất cả những gì còn lại là hiển thị một tin nhắn ở cuối trò chơi.

Bước 10: Kết thúc trò chơi

Tại thời điểm này, trò chơi của bạn gần như hoàn tất, với việc xử lý đầu vào, tương tác, hình ảnh và thậm chí cả âm thanh. Vào cuối bước này, bạn cũng sẽ hiển thị trạng thái của trò chơi trên màn hình.

Nhiều trò chơi hiển thị một số thông tin bổ sung, cả trong trò chơi và sau khi nó kết thúc. Đây có thể là một số điểm nhấn còn lại, cấp độ khiên, số lượng đạn, tổng số điểm cho nhiệm vụ, v.v. Trong trò chơi này, bạn sẽ hiển thị trạng thái của trò chơi.

Nếu tàu vũ trụ bị phá hủy bởi một tiểu hành tinh, thì thông báo

 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
76 sẽ xuất hiện trên màn hình. Nhưng nếu tất cả các tiểu hành tinh đã biến mất và tàu vũ trụ vẫn còn đó, thì bạn nên hiển thị
 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
77

Pygame không có bất kỳ công cụ nâng cao nào để vẽ văn bản, có nghĩa là công việc nhiều hơn cho lập trình viên. Văn bản được hiển thị được biểu thị bằng một bề mặt với nền trong suốt. Bạn có thể điều khiển bề mặt đó giống như cách bạn làm với Sprites, ví dụ bằng cách sử dụng

(venv) $ python -m pip install -r requirements.txt
28. Bề mặt được tạo ra bằng cách sử dụng một phông chữ.

Quá trình làm việc đầy đủ với văn bản trong pygame trông như thế này:

  1. Tạo một phông chữ: Phông chữ được biểu thị bằng lớp

     1initialize_pygame()
     2
     3while True:
     4    handle_input()
     5    process_game_logic()
     6    draw_game_elements()
    
    79. Bạn có thể sử dụng tệp phông chữ tùy chỉnh hoặc bạn có thể sử dụng phông chữ mặc định. Đối với trò chơi này, bạn sẽ làm sau này. The font is represented by the
     1initialize_pygame()
     2
     3while True:
     4    handle_input()
     5    process_game_logic()
     6    draw_game_elements()
    
    79 class. You can use a custom font file, or you can use the default font. For this game, you’ll do the latter.

  2. Tạo một bề mặt với văn bản: Điều này được thực hiện bằng cách sử dụng

     1initialize_pygame()
     2
     3while True:
     4    handle_input()
     5    process_game_logic()
     6    draw_game_elements()
    
    80. Bạn sẽ tìm hiểu thêm về phương pháp đó sau này trong hướng dẫn này. Hiện tại, nó đủ để biết rằng nó tạo ra một bề mặt với văn bản được hiển thị và nền trong suốt. This is done using
     1initialize_pygame()
     2
     3while True:
     4    handle_input()
     5    process_game_logic()
     6    draw_game_elements()
    
    80. You’ll learn more about that method later in this tutorial. For now, it’s enough to know that it creates a surface with the rendered text and a transparent background.

  3. Nhập bề mặt lên màn hình: Như với bất kỳ bề mặt nào khác trong pygame, văn bản sẽ chỉ hiển thị nếu bạn nhấp vào màn hình hoặc một bề mặt khác cuối cùng sẽ được hiển thị trên màn hình. As with any other surface in Pygame, the text will only be visible if you blit it onto the screen or another surface that will eventually be shown on the screen.

Phông chữ của bạn sẽ được hiển thị với một màu. Trong bước 1, bạn đã tạo một màu bằng ba giá trị: đỏ, xanh lá cây và xanh dương. Trong phần này, bạn sẽ sử dụng một lớp

 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
81 thay thế. Bắt đầu bằng cách nhập nó vào tệp
(venv) $ python -m pip install -r requirements.txt
21:

(venv) $ python space_rocks
7

Sau đó, tạo phương thức

 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
83 trong cùng một tệp:

(venv) $ python space_rocks
8

Ở đây, những gì mà xảy ra:

  • Dòng 1 là khai báo của phương pháp của bạn. Nó cần một bề mặt để hiển thị văn bản, chính văn bản, một phông chữ và một màu. Lớp

     1initialize_pygame()
     2
     3while True:
     4    handle_input()
     5    process_game_logic()
     6    draw_game_elements()
    
    81 cung cấp rất nhiều màu được xác định trước, bạn có thể tìm thấy trong kho lưu trữ pygame. Phương pháp của bạn sẽ sử dụng một màu mặc định gọi là
     1initialize_pygame()
     2
     3while True:
     4    handle_input()
     5    process_game_logic()
     6    draw_game_elements()
    
    85.
    is the declaration of your method. It takes a surface to render the text on, the text itself, a font, and a color. The
     1initialize_pygame()
     2
     3while True:
     4    handle_input()
     5    process_game_logic()
     6    draw_game_elements()
    
    81 class offers a lot of predefined colors, which you can find in the Pygame repository. Your method will use a default color called
     1initialize_pygame()
     2
     3while True:
     4    handle_input()
     5    process_game_logic()
     6    draw_game_elements()
    
    85.

  • Dòng 2 tạo bề mặt với văn bản bằng cách sử dụng

     1initialize_pygame()
     2
     3while True:
     4    handle_input()
     5    process_game_logic()
     6    draw_game_elements()
    
    86. Đối số đầu tiên của nó là văn bản cần được hiển thị. Thứ hai là một lá cờ antialiasing. Đặt nó thành
    (venv) $ python -m pip install -r requirements.txt
    
    86 sẽ làm mịn các cạnh của văn bản được hiển thị. Đối số cuối cùng là màu của văn bản.
    creates the surface with the text using
     1initialize_pygame()
     2
     3while True:
     4    handle_input()
     5    process_game_logic()
     6    draw_game_elements()
    
    86. Its first argument is the text that needs to be rendered. The second is an antialiasing flag. Setting it to
    (venv) $ python -m pip install -r requirements.txt
    
    86 will smooth out the edges of the rendered text. The last argument is the color of the text.

  • Dòng 4 có được một hình chữ nhật đại diện cho diện tích bề mặt với văn bản của bạn. Hình chữ nhật đó là một ví dụ của lớp

     1initialize_pygame()
     2
     3while True:
     4    handle_input()
     5    process_game_logic()
     6    draw_game_elements()
    
    88 và có thể dễ dàng di chuyển và căn chỉnh. Bạn có thể đọc thêm về việc sắp xếp trong tài liệu. obtains a rectangle that represents the area of the surface with your text. That rectangle is an instance of the
     1initialize_pygame()
     2
     3while True:
     4    handle_input()
     5    process_game_logic()
     6    draw_game_elements()
    
    88 class and can be easily moved and aligned. You can read more about aligning in the documentation.

  • Dòng 5 đặt thuộc tính

     1initialize_pygame()
     2
     3while True:
     4    handle_input()
     5    process_game_logic()
     6    draw_game_elements()
    
    89 của hình chữ nhật thành một điểm ở giữa màn hình. Điểm đó được tính bằng cách chia kích thước màn hình cho
     1initialize_pygame()
     2
     3while True:
     4    handle_input()
     5    process_game_logic()
     6    draw_game_elements()
    
    50. Hoạt động này đảm bảo rằng văn bản của bạn sẽ được hiển thị ở giữa màn hình.
    sets the
     1initialize_pygame()
     2
     3while True:
     4    handle_input()
     5    process_game_logic()
     6    draw_game_elements()
    
    89 attribute of the rectangle to a point in the middle of the screen. That point is calculated by dividing the screen’s size by
     1initialize_pygame()
     2
     3while True:
     4    handle_input()
     5    process_game_logic()
     6    draw_game_elements()
    
    50. This operation ensures that your text will be displayed in the center of the screen.

  • Dòng 7 vẽ văn bản trên màn hình. Lưu ý rằng lần này, bạn vượt qua một hình chữ nhật, không phải là một điểm, đến

    (venv) $ python -m pip install -r requirements.txt
    
    28. Trong trường hợp này, phương pháp sẽ lấy góc trên cùng bên trái của hình chữ nhật đã cho và sẽ bắt đầu quá trình blits ở đó. draws the text on the screen. Notice that this time, you pass a rectangle, not a point, to
    (venv) $ python -m pip install -r requirements.txt
    
    28. In this case, the method will take the top-left corner of the given rectangle and will start the blitting process there.

Bây giờ bạn có thể nhập phương thức này trong tệp

(venv) $ python -m pip install -r requirements.txt
12:

(venv) $ python space_rocks
9

Bây giờ bạn cần tạo một phông chữ. Bạn cũng nên lưu trữ thông điệp sẽ được hiển thị. Chỉnh sửa hàm tạo của lớp

def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
6:

def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
0

Chất xây dựng của lớp

 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
94 có hai đối số:

  1. Tên của tệp phông chữ, trong đó
     1initialize_pygame()
     2
     3while True:
     4    handle_input()
     5    process_game_logic()
     6    draw_game_elements()
    
    00 có nghĩa là phông chữ mặc định sẽ được sử dụng
  2. Kích thước của phông chữ trong pixel

Nội dung của tin nhắn cần được đặt đúng. Khi tàu vũ trụ bị phá hủy, đặt nó thành

 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
96. Khi tất cả các tiểu hành tinh bị phá hủy, đặt nó thành
 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
97. Chỉnh sửa phương thức
def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT or (
            event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE
        ):
            quit()
9 của lớp
def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
6:

def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
1

Điều cuối cùng bạn cần làm là thực sự hiển thị thông báo trên màn hình. Cập nhật phương thức

(venv) $ python -m pip install -r requirements.txt
00 của lớp
def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
6:

def _handle_input(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
2

Đi trước và kiểm tra nó. Bắt đầu trò chơi và đâm tàu ​​vũ trụ vào một tiểu hành tinh:

Hướng dẫn python code for shooting game - code python cho game bắn súng

Trò chơi hiển thị chính xác một tin nhắn

 1initialize_pygame()
 2
 3while True:
 4    handle_input()
 5    process_game_logic()
 6    draw_game_elements()
76.

Bây giờ đặt thêm một số nỗ lực và cố gắng phá hủy tất cả các tiểu hành tinh. Nếu bạn quản lý để làm điều này, thì bạn sẽ thấy một màn hình chiến thắng:

Hướng dẫn python code for shooting game - code python cho game bắn súng

Trong bước này, bạn đã học được cách hiển thị một tin nhắn văn bản trên màn hình. Đó là bước cuối cùng của hướng dẫn này. Trò chơi của bạn bây giờ đã hoàn tất!

Sự kết luận

Xin chúc mừng, bạn vừa xây dựng một bản sao của trò chơi Asteroids bằng Python! Với pygame, kiến ​​thức Python của bạn có thể được dịch trực tiếp thành các dự án phát triển trò chơi.

Trong hướng dẫn này, bạn đã học được cách:

  • Tải hình ảnh và hiển thị chúng trên màn hìnhimages and display them on the screen
  • Thêm xử lý đầu vào vào trò chơi của bạninput handling to your game
  • Thực hiện logic trò chơi và phát hiện va chạm trong Pythongame logic and collision detection in Python
  • Chơi âm thanhsounds
  • Hiển thị văn bản trên màn hìnhtext on the screen

Bạn đã trải qua toàn bộ quá trình thiết kế một trò chơi, cấu trúc các tệp, nhập và sử dụng tài sản và mã hóa logic. Bạn có thể sử dụng tất cả kiến ​​thức đó cho tất cả các dự án tương lai tuyệt vời của bạn!

Nhấp vào liên kết bên dưới để tải xuống mã cho dự án này và theo dõi khi bạn xây dựng trò chơi của mình:

Bước tiếp theo

Trò chơi tiểu hành tinh của bạn trong Python đã hoàn tất, nhưng có rất nhiều tính năng mà bạn có thể thêm. Dưới đây là một vài ý tưởng để bạn bắt đầu:

  • Hạn chế tốc độ tối đa của tàu vũ trụ.
  • Phát một âm thanh khi một tiểu hành tinh bị phá hủy.
  • Thêm một lá chắn vào tàu vũ trụ, cho phép nó tồn tại một vụ va chạm duy nhất.
  • Giữ một hồ sơ về điểm số hàng đầu.
  • Làm cho những viên đạn phá hủy tàu vũ trụ quá và quấn chúng quanh màn hình, khiến trò chơi trở nên khó khăn hơn nhiều!

Những ý tưởng khác bạn có thể đưa ra để mở rộng dự án này? Hãy sáng tạo và vui chơi! Trong trường hợp này, như họ nói, không gian là giới hạn 😃

Nếu bạn quan tâm đến việc tìm hiểu thêm về phát triển trò chơi ở Python, thì đây là một số tài nguyên bổ sung:

  • Pygame: Một đoạn mồi về lập trình trò chơi trong Python: Bài viết này giải thích pygame chi tiết hơn một chút.
  • Arcade: Một đoạn mồi trên khung trò chơi Python: Bài viết này giới thiệu Arcade, một khung trò chơi khác cho các nhà phát triển Python.
  • Danh sách các dự án Pygame: Trang web này cho thấy rất nhiều dự án pygame mà bạn có thể sử dụng như một nguồn cảm hứng.
  • Tài liệu pygame: Ở đây bạn có thể tìm thấy nhiều hướng dẫn hơn và giải thích chi tiết về hoạt động bên trong của 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 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: Sử dụng pygame để xây dựng một trò chơi tiểu hành tinh ở Python This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Using Pygame to Build an Asteroids Game in Python

Một trò chơi có thể được mã hóa trong Python?

Tạo các trò chơi máy tính của riêng bạn trong Python là một cách tuyệt vời để học ngôn ngữ.Để xây dựng một trò chơi, bạn sẽ cần sử dụng nhiều kỹ năng lập trình cốt lõi.Các loại kỹ năng mà bạn sẽ thấy trong lập trình trong thế giới thực.To build a game, you'll need to use many core programming skills. The kinds of skills that you'll see in real-world programming.

Python có tốt cho các trò chơi lớn không?

Python được sử dụng trong phát triển trò chơi vì đây là ngôn ngữ lập trình cực kỳ linh hoạt và mạnh mẽ.Nó làm cho nhiều nhiệm vụ phổ biến nhất liên quan đến phát triển trò chơi nhanh chóng và dễ thực hiện - và có rất nhiều tài nguyên để giúp bạn học cách sử dụng nó một cách hiệu quả.. It makes many of the most common tasks associated with game development quick and easy to accomplish — and there are lots of resources to help you learn how to use it effectively.

Có động cơ trò chơi Python không?

Bây giờ, có Python và một loạt các động cơ trò chơi Python tuyệt vời có sẵn.Sự kết hợp mạnh mẽ này làm cho việc tạo ra các trò chơi máy tính tuyệt vời dễ dàng hơn nhiều so với trước đây.Trong hướng dẫn này, bạn sẽ khám phá một số động cơ trò chơi này, tìm hiểu những gì bạn cần để bắt đầu chế tạo các trò chơi video Python của riêng bạn!a host of great Python game engines available. This powerful combination makes crafting great computer games much easier than in the past. In this tutorial, you'll explore several of these game engines, learning what you need to start crafting your own Python video games!