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 Show
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:
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 ở PythonTrò 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ự ánTrò 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:
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:
Bắt đầu nào! Demo: Trò chơi tiểu hành tinh ở PythonTrò 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
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 gianBắn
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:
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 4 và bên trong nó tạo một tệp có tên 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: 6. Tệp sẽ trông như thế này:
Ở đây, những gì mà xảy ra trong mã, từng bước:
Đ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 00. Để thêm xử lý đầu vào, bạn sẽ sửa đổi 8, v.v.Tiếp theo, tạo tệp 07 trong thư mục 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 09. Nó sẽ giống như thế này:
Cấu trúc của dự án của bạn bây giờ trông như thế này:
Đi trước và chạy trò chơi:
Bạn sẽ thấy một cửa sổ có nền màu xanh: 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àoTạ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à 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 10.Sự kiện bạn cần ngay bây giờ là 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 12 bằng cách viết lại 13 như vậy:Alt+F4 on Windows and Linux or Cmd+W on macOS. Modify 12 by rewriting
13 like so:
Đ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ố 14. Mỗi sự kiện như vậy có thông tin về khóa được nhấn trong thuộc tính 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 16.Esc, you’ll use 16.Sửa đổi phương thức 8 một lần nữa:
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 ảnhTạ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à 18 và, bên trong nó, một thư mục khác được gọi là 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 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à 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: 0Đây là những gì xảy ra:
Cấu trúc của dự án của bạn bây giờ trông như thế này: 1Bâ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 12: 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 28 trên bề mặt bạn muốn vẽ. Phương pháp này có hai đối số:
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: Như bạn có thể thấy, vectơ 29, hướng lên trên, sẽ có một tọa độ y âm.Các tọa độ được truyền đến 28 được đưa ra dưới dạng hai giá trị: 31 và 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: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 ( 1 × 2 pixel), do đó, tọa độ sẽ là 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: 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ơiTạ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 caoBạn đã sử dụng các bề mặt, nhưng Pygame cũng cung cấp một lớp khác, 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 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: 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 36 có thể giúp đỡ, vì bạn có thể sử dụng nó với 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 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 GameObjectTrong phần này, bạn sẽ giới thiệu lớp 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 41 sẽ lưu trữ các dữ liệu sau:
Ở đây, một đại diện đồ họa của đối tượng trò chơi: 44 sẽ là một bề mặt được tải với 48 từ các ví dụ trước. 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 43 và 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: 52 trong mô -đun 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 4, tạo một tệp mới có tên 55. Hiện tại, nó sẽ lưu trữ lớp 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: 3Ở đây, một sự cố:
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 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ơ:Quá trình đó xảy ra trong 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 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: 4Bây giờ sửa đổi tệp 12: 5Cả hai đối tượng được đặt ở giữa màn hình, sử dụng tọa độ 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 9 và chúng sẽ được vẽ bằng cách sử dụng 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: Bạn cũng có thể kiểm tra 75 bằng cách tạm thời thêm một dòng vào cuối 00: 6Trong dòng lệnh, bạn sẽ nhận thấy cách phương thức ban đầu in 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 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 88 với phương thức 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 12: 7Nế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 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, 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ọcHình ảnh của tàu vũ trụ đã có trong thư mục 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 94: 8Bây giờ bạn có thể tạo, trong cùng một tệp, lớp 95 kế thừa từ 41: 9Nó 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 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 12 như thế này: 0Bạn có thể nhận thấy rằng nhập khẩu ban đầu của lớp 41 đã biến mất. Điều đó bởi vì 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 6 để trông như thế này:
1Hai điều đã xảy ra:
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: 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 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:
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 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à 29 trong tệp 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: Tiếp theo, sửa đổi lớp 95: 2Giá trị 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 95 bằng cách sửa đổi hàm tạo: 3Vectơ hướng ban đầu sẽ giống như vectơ 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 95 được gọi là 17: 4Phươ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 18 của lớp 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 95. Để làm điều này, trước tiên bạn cần nhập 21, chịu trách nhiệm cho việc mở rộng và xoay hình ảnh: 5Sau đó, bạn có thể ghi đè phương thức 69 trong lớp 95: 6Ở đây, một sự cố từng bước:
Lưu ý rằng 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: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 69 tính toán lại vị trí blit của 28. Hãy nhớ rằng 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 35. Nó trả về một từ điển trong đó các hằng số khóa (như 16 mà bạn đã sử dụng trước đó) là các khóa và giá trị là 86 nếu nhấn phím hoặc 87 khác.Biết được điều này, bạn có thể chỉnh sửa tệp 12 và cập nhật phương thức 8 của lớp 6. Các hằng số bạn cần sử dụng cho các phím mũi tên là 42 và 43: 7Bâ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: 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:
Bạn có thể tính toán thay đổi vận tốc bằng cách nhân vectơ 44 với giá trị 46 và thêm kết quả vào 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ị 46 vào lớp 95: 8Sau đó, tạo 52 trong lớp 95: 9Bây giờ bạn có thể thêm xử lý đầu vào vào 8 trong 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à 56:Up is 56: 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ơ: 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ìnhMộ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 52 trong tệp 21: 1Tiếp theo, tạo 59 trong cùng một tệp: 2Bằ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 94: 3Bây giờ bạn có thể cập nhật 74 trong lớp 41: 4Lưu ý rằng việc sử dụng 59 không phải là thay đổi duy nhất ở đây. Bạn cũng thêm một đối số 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 6: 5Bâ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 tinhTạ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ọcTương tự như 95, bạn sẽ bắt đầu bằng cách tạo một lớp gọi là 67 kế thừa từ 41. Chỉnh sửa tệp 94 như vậy: 6Giống như trước đây, bạn bắt đầu bằng cách gọi hàm xây dựng 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 12: 7Cuối cùng, chỉnh sửa hàm tạo của lớp 6 trong cùng một tệp để tạo sáu tiểu hành tinh: 8Bâ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 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 74: 9Bâ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 9: 0Điều tương tự cũng xảy ra với 00: 1Chạ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: 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í 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 21: 2Sau đó, tạo một phương thức gọi là 79 trong cùng một tệp: 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ụ 52.Tiếp theo, nhập phương thức này vào tệp 12: 4Bây giờ sử dụng 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 6: 5Bâ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: Đ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 84 pixel là đủ: 6Bây giờ bạn có thể sửa đổi hàm tạo của lớp 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: 7Trong 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ụ: 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 tinhHiệ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à 86 trong tệp 21: 8Phương pháp này sẽ tạo ra một giá trị ngẫu nhiên giữa 88 và 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 67. Bắt đầu với việc cập nhật nhập khẩu trong tệp 94: 9Lư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 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 67.Sau đó sử dụng phương thức mới trong hàm tạo của lớp 67: 0Lưu ý rằng phương pháp sử dụng giá trị tối thiểu là 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 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 9 trong lớp 6 như thế này: 1Nế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 99 thành 00.Lưu ý rằng cũng có một tấm séc cho 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 00 sẽ dẫn đến lỗi.Bây giờ, tàu vũ trụ có thể có giá trị 00, điều quan trọng là phải cập nhật 74 trong lớp 6 để tránh cố gắng đưa ra hoặc di chuyển một con tàu vũ trụ bị phá hủy: 2Điều tương tự cũng xảy ra đối với việc xử lý đầu vào: 3Bạ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: 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: ĐạnTạ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ọcBắt đầu với việc thêm một hình ảnh của một viên đạn vào 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: 4Sau đó, chỉnh sửa tệp 94 bằng cách tạo một lớp gọi là 08 kế thừa từ 41: 5Giống như trước đây, điều này sẽ chỉ gọi hàm xây dựng 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 6 trong tệp 12: 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 13 trong 6: 7Danh 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 đạnCó 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 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 95 cần một cách để thông báo cho lớp 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 95. Hàm đó sẽ được cung cấp bởi lớp 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 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 95 trong tệp 94: 8Bạn cũng sẽ cần giá trị của tốc độ của viên đạn: 9Tiếp theo, tạo một phương thức gọi là 23 trong lớp 95: 0Bạ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 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 26 nên thực hiện công việc. Chỉnh sửa hàm tạo của lớp 6 trong tệp 12: 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à 29.Space pressed, so you can use the event loop. The constant for Space is 29.
Sửa đổi phương thức 8 trong lớp 6: 2Lư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 23 trên đối tượng 00.Chạy trò chơi của bạn ngay bây giờ và bắn một số viên đạn: 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 đạnHiệ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 đè 74 trong lớp 08 trong tệp 94 như thế này: 3Bằ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 9 của lớp 6 trong tệp 12: 4Lưu ý rằng thay vì sử dụng danh sách ban đầu, 40, bạn tạo một bản sao của nó bằng 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 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 43 trả về 86 nếu một điểm được bao gồm trong hình chữ nhật và 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 tinhMộ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 9 của lớp 6 như thế này: 5Bâ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 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: 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 tinhTạ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ố:
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:
Đ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 67 trong tệp 94: 6Phươ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 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 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 56 chứa tỷ lệ cho các kích thước khác nhau:
Cuối cùng, bạn chuyển sprite tỷ lệ cho hàm tạo của lớp 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 67: 7Bây giờ bạn có thể tạo một phương thức gọi là 59 trong cùng một lớp: 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 6. Giống như trong trường hợp tàu vũ trụ, bạn sẽ sử dụng phương thức 26 của danh sách thích hợp: 9Hãy nhớ gọi 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 9 của lớp 6: 0Nế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: 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 thanhTạ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 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: 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 66 từ mô -đun 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 66 trong tệp 21: 2Tiếp theo, hãy tạo một phương thức gọi là 70 trong cùng một tệp: 3Phương pháp này có logic tương tự như 48. Nó sẽ cho rằng âm thanh luôn nằm trong thư mục 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 94: 4Sau đó tải âm thanh trong hàm tạo của lớp 95: 5Cuố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 23: 6Chạ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ơiTạ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 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ị 77Pygame 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 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:
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 81 thay thế. Bắt đầu bằng cách nhập nó vào tệp 21: 7Sau đó, tạo phương thức 83 trong cùng một tệp: 8Ở đây, những gì mà xảy ra:
Bây giờ bạn có thể nhập phương thức này trong tệp 12: 9Bâ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 6: 0Chất xây dựng của lớp 94 có hai đối số:
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 96. Khi tất cả các tiểu hành tinh bị phá hủy, đặt nó thành 97. Chỉnh sửa phương thức 9 của lớp 6: 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 00 của lớp 6: 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: Trò chơi hiển thị chính xác một tin nhắn 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: 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ậnXin 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:
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 theoTrò 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:
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:
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! |