1. Trang chủ
  2. » Luận Văn - Báo Cáo

Báo cáo bài tập lớn môn học lập trình python d

29 1 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Báo Cáo Bài Tập Lớn Môn Học: Lập Trình Python
Tác giả Nguyễn Việt Hà, Trương Hoàng Tùng, Đăng Ngọc Khánh, Hoàng Việt Dũng, Nguyễn Hoàng Anh
Người hướng dẫn Nguyễn Trọng Khánh
Trường học Học Viện Công Nghệ Bưu Chính Viễn Thông
Chuyên ngành Công Nghệ Thông Tin
Thể loại Báo cáo
Năm xuất bản 2023
Thành phố Hà Nội
Định dạng
Số trang 29
Dung lượng 4,62 MB

Nội dung

Tác dụng cụ thể của hàm này: *Tạo cửa sổ đồ họa: Hàm pg.display.set_modeRES tạo một cửa sổ đồ họa với kích thước và thuộc tính được xác định bởi biến RES.. *Trả về một đối tượng cửa sổ:

Trang 1

HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG

KHOA CÔNG NGHỆ THÔNG TIN 1

BÁO CÁO BÀI TẬP LỚN

Trang 2

2

Mục L c ụ

MỤC 1: ĐẶT VẤN ĐỀ 3

MỤC 2: THƯ VIỆN ĐƯỢC SỬ DỤNG 4

Nhóm cài đặt: 4

Nhóm liên quan đến thời gian: 6

Nhóm liên quan đến sự kiện: 6

Nhóm liên quan đến đồ họa: 9

Nhóm liên quan đến âm thanh: 11

Khác: 12

M C 3: TRI N KHAI VÀ TH NGHI MỤ Ể Ử Ệ .13

Lớp chính (main class): 14

Bản đồ trò chơi (map): 15

Chùm tia thăm dò (raycasting): 16

Người chơi: 22

V t th ậ ể động: 24

NPC: 24

H ệ thống tìm đường cho NPC: 25

H ệ thống ki t xu t hình nh:ế ấ ả .25

H ệ thống x lý object: .27

Vũ khí: 27

Âm thanh: 28

Cài đặt: 29

Trang 3

3

MỤC 1: ĐẶ T V ẤN ĐỀ

Ý tưởng: T o ra mạ ột t a game ự đơn giản thuộc thể loại bắn súng góc nhìn th ứ nhất

Mô tả: Trong trò chơi, nhân v t chính s s dậ ẽ ử ụng những vũ khí ủa mình đểc chống lại và tiêu di t k thù ệ ẻ Người chơi có thể di chuy n theo bể ốn hướng khác nhau và

có th ể thực hiện xoay màn hình Đồng thời, người chơi cũng có thể đổi vũ khí và

sử dụng chúng để tấn công Kẻ thù trong game s là nhẽ ững quái v t m nh m vậ ạ ẽ ới các đặc điểm và tính ch t khác nhau, mang l i s ấ ạ ự đa dạng cho trò chơi Người chơi

và t t c quái vấ ả ật đều s ẽ được đặt trong m t bộ ản đồ tạo sẵn, với cấu trúc chính là

m t mê cung C ộ ả người chơi và quái vật đều sử dụng h ệ thống HP (health point) để xác định hai trạng thái: s ng ố hoặ chế Khi người chơi tấc t n công quái v t bậ ằng vũ khí c a mình, chúng s b ủ ẽ ị trừ ột lượng HP tương ứ m ng với sát thương (damage) của vũ khí đó Ngược lại, nếu người chơi bị tấn công, một lượng HP tương ứng với sát thương của quái vật cũng sẽ ị trừ theo M t khi HP b b ộ ị trừ ề v giá tr 0 ho c nh ị ặ ỏhơn 0, nếu là quái v t, chúng s ậ ẽ chết và ngừng hoạt động Nếu trong trường hợp đó

là người chơi, trò chơi sẽ kết thúc Khác với quái vật, người chơi sẽ có cơ chế tự hồi phục HP để tăng tính chiến thuật cho game N u quái v t b t gế ậ ắ ặp người chơi, chúng s ẽ bám theo cho đến khi một trong hai b tiêu di t ị ệ Khi người chơi đã tiêu diệt tất cả quái v t trên bậ ản đồ, trò chơi sẽ thông báo người chơi đã chiến thắng Quy trình c a game: Khi bắt đầu trò chơi, người chơi sẽ được đặt ở vị trí khởi đầu, không có quái vật ở xung quanh Sau khi di chuyển, người chơi sẽ có khả năng bắt gặp những quái vật khác nhau được phân bố trên kh p bắ ản đồ Phụ thu c ộvào tình huống, người chơi hoàn toàn có thể đưa ra lựa chọn đuổi theo và tấn công hoặc là chạy tr n và n n p Bố ẩ ấ ất k chi n thể ế ắng hay thua cuộc, màn chơi sau đó sẽ được tạo l i hoàn toàn mạ ới Người chơi sẽ được hồi đầy HP và được đặt về vị trí khởi đầu, trong khi đó quái vật sẽ được t o mạ ới và phân bố l i trên bạ ản đồ

Trang 4

4

MỤC 2: THƯ VIỆN ĐƯỢC SỬ DỤNG

Trong d án này, ngoài nhự ững thư viện có s n thì ẵ thư viện quan trọng được ứng dụng để tạo thành game chính là pygame, thư viện được tạo ra dành riêng cho việc viết trò chơi Mục này sẽ đề cập ch yủ ếu đến các hàm và h ng s ằ ố được s dử ụngtrong trò chơi thông qua thư viện pygame

Nhóm cài đặt:

pg.init() :Hàm này có tác dụng khởi tạo môi trường làm việc cho Pygame và chuẩn

bị các tài nguyên cần thiết trước khi bạn bắt đầu sử dụng thư viện

Cụ thể, pg.init() thường thực hiện các công việc sau:

*Khởi tạo các module và thành phần bên dưới của Pygame, bao gồm cửa sổ đồ họa, âm thanh, và các tài nguyên đồ họa

*Chuẩn bị môi trường làm việc để bạn có thể tạo cửa sổ đồ họa, vẽ hình ảnh, và xử

*Khi bạn gọi pg.mouse.set_visible(True): Con trỏ chuột sẽ được hiển thị trở lại Điều này thường được sử dụng khi bạn muốn cho người dùng tương tác với giao diện hoặc thực hiện các thao tác chuột trong ứng dụng của bạn

pg.display.set_mode(RES):có tác dụng tạo cửa sổ đồ họa cho ứng dụng của bạn với kích thước và thuộc tính cụ thể

Tác dụng cụ thể của hàm này:

*Tạo cửa sổ đồ họa: Hàm pg.display.set_mode(RES) tạo một cửa sổ đồ họa với kích thước và thuộc tính được xác định bởi biến RES RES thường là một tuple

Trang 5

5

chứa chiều rộng (width) và chiều cao (height) của cửa sổ Ví dụ: RES = (800, 600)

sẽ tạo cửa sổ đồ họa có kích thước 800 pixel chiều rộng và 600 pixel chiều cao

*Cấu hình cửa sổ: Hàm này cho phép bạn cấu hình nhiều thuộc tính của cửa sổ đồ họa, bao gồm chế độ toàn màn hình, độ phân giải, màu nền và nhiều thuộc tính khác Bạn có thể truyền các tham số tùy chỉnh vào hàm set_mode để điều chỉnh cửa sổ theo ý muốn

*Trả về một đối tượng cửa sổ: Hàm set_mode trả về một đối tượng cửa sổ Pygame, bạn có thể sử dụng đối tượng này để vẽ hình ảnh, hiển thị nội dung đồ họa, và xử

lý sự kiện liên quan đến cửa sổ

pg.event.set_grab(True): có tác dụng bắt (grab) con trỏ chuột trong cửa sổ đồ họa của ứng dụng của bạn Trong trường hợp gọi hàm này với tham số True, con trỏ chuột sẽ bị bắt trong cửa sổ và không thể di chuyển ra ngoài cửa sổ

Tác dụng của pg.event.set_grab(True) là:

*Bắt con trỏ chuột: Khi con trỏ chuột bị bắt, nó sẽ không thể thoát ra ngoài cửa sổ

đồ họa của ứng dụng của bạn Điều này có thể hữu ích trong trường hợp bạn muốn tạo một ứng dụng hoặc trò chơi yêu cầu người chơi hoặc người dùng tương tác với nội dung bên trong cửa sổ mà không cần quan tâm đến vị trí con trỏ chuột ngoài cửa sổ

*Phản ứng chuột liên tục: Khi con trỏ chuột được bắt, bạn có thể theo dõi và xử lý

sự kiện chuột một cách liên tục trong cửa sổ, ngay cả khi con trỏ chuột đang nằm ngoài cửa sổ Điều này cho phép bạn theo dõi sự di chuyển chuột và xử lý các sự kiện chuột ngay cả khi người dùng di chuyển chuột ra ngoài cửa sổ

*Giải phóng con trỏ chuột: Để cho phép con trỏ chuột thoát ra ngoài cửa sổ, bạn có thể gọi lại hàm pg.event.set_grab(False) với tham số False Khi con trỏ chuột không còn bị bắt, nó có thể tự do di chuyển ra ngoài cửa sổ bình thường

pg.display.set_caption(f'{self.clock.get_fps() :.1f}' ):có tác dụng đặt tiêu đề cho cửa sổ đồ họa trong ứng dụng

Tác Dụng Cụ Thể:

*Đặt tiêu đề cho cửa sổ: Hàm này được sử dụng để thiết lập tiêu đề (title) cho cửa

sổ đồ họa của ứng dụng của bạn Tiêu đề này thường xuất hiện ở phần trên cùng của cửa sổ và có thể chứa thông tin tùy chỉnh như tên trò chơi, tên ứng dụng, hoặc bất kỳ nội dung nào bạn muốn hiển thị

*Cập nhật tiêu đề động: Trong trường hợp của bạn, bạn đang đặt tiêu đề của cửa sổ dựa trên giá trị FPS (frames per second) được trả về bởi self.clock.get_fps() Điều này làm cho tiêu đề cửa sổ thay đổi theo tần suất cập nhật của trò chơi hoặc ứng dụng, và cung cấp thông tin về hiệu suất của ứng dụng cho người chơi hoặc người dùng

Trang 6

6

Nhóm liên quan đến thời gian:

pg.time.Clock(): có tác dụng tạo một đối tượng đồng hồ (clock) Pygame Đối tượng đồng hồ này được sử dụng để điều chỉnh tốc độ cập nhật và vẽ trong trò chơi hoặc ứng dụng đồ họa Pygame

Cụ thể tác dụng của hàm này:

*Điều chỉnh tốc độ cập nhật: Bằng cách sử dụng đối tượng đồng hồ, bạn có thể thiết lập một số lượng hình ảnh (frames per second FPS) mà bạn muốn trò chơi - hoặc ứng dụng của bạn vẽ Điều này giúp đảm bảo rằng trò chơi không chạy quá nhanh hoặc quá chậm trên các máy tính khác nhau, và nó làm cho trải nghiệm người chơi ổn định hơn

*Đo thời gian: Đối tượng đồng hồ cũng có khả năng đo thời gian giữa các frame cập nhật Điều này có thể hữu ích trong việc tính toán thời gian hoặc đoạn đường

di chuyển trong trò chơi

pg.time.delay(1500):

có tác dụng tạm ngừng thực thi của ứng dụng trong một khoảng thời gian cụ thể, được tính bằng mili giây (ms) Trong trường hợp này, pg.time.delay(1500) sẽ tạm ngừng thực thi của ứng dụng trong 1500 mili giây, tức là 1,5 giây

*Trả về số mili giây kể từ khi pygame.init() được gọi

*Trước khi Pygame được khởi tạo, giá trị này sẽ luôn là 0

*Bạn có thể sử dụng hàm này để theo dõi thời gian trong game Ví dụ, bạn có thể lưu thời điểm bắt đầu một sự kiện nhất định, sau đó so sánh thời điểm hiện tại (được lấy bằng cách gọi pg.time.get_ticks()) với thời điểm bắt đầu để xác định thời gian đã trôi qua

Nhóm liên quan đến sự kiện:

Trang 7

7

pg.QUIT: không phải là một hàm mà là một hằng số trong thư viện Pygame

Hằng số này đại diện cho một sự kiện kiểu QUIT, là sự kiện xảy ra khi người dùng đóng cửa sổ của ứng dụng Pygame

Tác dụng của pg.KEYDOWN là để xác định và kiểm tra khi người dùng ấn một phím trên bàn phím

pg.K_ESCAPE: là một hằng số trong thư viện Pygame Hằng số này đại diện cho phím ESCAPE (phím thoát) trên bàn phím

pg.MOUSEBUTTONDOWN:là một hằng số trong thư viện Pygame Hằng số này đại diện cho một loại sự kiện xảy ra khi người dùng nhấn chuột

Tác dụng cụ thể:

Tác dụng của pg.MOUSEBUTTONDOWN là để xác định và kiểm tra khi người dùng nhấn một nút chuột, liên quan đến việc xử lý sự kiện chuột trong ứng dụng Pygame Khi bạn kiểm tra các sự kiện chuột (sử dụng pg.event.get() trong một vòng lặp), bạn có thể kiểm tra event.type để xem nếu sự kiện là

pg.MOUSEBUTTONDOWN Nếu đúng, bạn có thể kiểm tra event.button để xác định nút chuột nào đã được nhấn và thực hiện các hành động tương ứng

Trang 8

8

pg.time.set_timer(self.global_event, 40):được sử dụng để tạo một sự kiện (event) định kỳ trong trò chơi hoặc ứng dụng Pygame

Cụ thể tác dụng của hàm này:

*Tạo sự kiện định kỳ: Hàm này tạo một sự kiện định kỳ với tần số cố định Trong

ví dụ của bạn, tần số được thiết lập là 40 (milliseconds), có nghĩa là mỗi 40ms, một

sự kiện sẽ được tạo và gửi đến hàng đợi sự kiện Pygame

*Triggers callback function: Khi sự kiện được tạo, nó sẽ kích hoạt một hàm

callback (thường là một hàm xử lý sự kiện mà bạn đã định nghĩa) Điều này cho phép bạn thực hiện các hành động cụ thể vào thời điểm cố định, ví dụ như cập nhật trạng thái trò chơi, vẽ đồ họa, hoặc xử lý các tác vụ khác liên quan đến trò chơi

*Điều chỉnh tốc độ cập nhật: Sử dụng hàm này có thể giúp bạn kiểm soát tốc độ cập nhật và sự kiện trong trò chơi Trong trường hợp này, một sự kiện sẽ được tạo mỗi 40ms, vì vậy trò chơi hoặc ứng dụng của bạn sẽ có tốc độ cập nhật xác định

pg.key.get_pressed(): trả về một tuple, trong đó mỗi phần tử được sử dụng như một giá trị logic, cho biết cho mỗi phím trên bàn phím liệu nó đang được nhấn hay không

pg.K_w: là một hằng số được sử dụng để biểu diễn phím ‘w’ trên bàn phím Bạn

có thể sử dụng nó để kiểm tra xem phím ‘w’ có đang được nhấn hay không

pg.K_s: là một hằng số được sử dụng để biểu diễn phím ‘s’ trên bàn phím Bạn có thể sử dụng nó để kiểm tra xem phím ‘s’ có đang được nhấn hay không

pg.K_a: là một hằng số được sử dụng để biểu diễn phím ‘a’ trên bàn phím Bạn có thể sử dụng nó để kiểm tra xem phím ‘a’ có đang được nhấn hay không

pg.K_d: là một hằng số được sử dụng để biểu diễn phím ‘d’ trên bàn phím Bạn có thể sử dụng nó để kiểm tra xem phím ‘d’ có đang được nhấn hay không

pg.mouse.get_pos(): trả về một tuple hai phần tử tương ứng với tọa độ x và y của

vị trí hiện tại của chuột

Cụ thể, hàm này sẽ:

*Trả về một tuple hai phần tử tương ứng với tọa độ x và y của vị trí hiện tại của chuột

Trang 9

9

*Vị trí được tính từ góc trên bên trái của màn hình

*Vị trí của con trỏ chuột có thể nằm ngoài cửa sổ hiển thị, nhưng luôn bị hạn chế trong màn hình

pg.mouse.get_rel()[0]: trả về lượng di chuyển theo trục x của chuột kể từ lần gọi hàm này trước đó

Cụ thể, hàm này sẽ:

*Trả về lượng di chuyển theo trục x của chuột kể từ lần gọi hàm này trước đó

*Lượng di chuyển tương đối của con trỏ chuột bị hạn chế ở các cạnh của màn hình

Nhóm liên quan đến đồ họa:

pg.draw.rect(self.game.screen, 'darkgray', (pos[0] * 100, pos[1] * 100, 100, 100), 2):có tác dụng vẽ một hình chữ nhật lên cửa sổ đồ họa trong ứng dụng của bạn Tác Dụng Cụ thể:

vẽ một hình chữ nhật lên cửa sổ đồ họa với màu sắc, kích thước và vị trí được chỉ định Thường được sử dụng để vẽ các đối tượng hoặc khung viền trong trò chơi hoặc ứng dụng đồ họa Pygame

pg.draw.circle(self.game.screen, 'red', (100 * self.x, 100 * self.y), 15):là vẽ một hình tròn lên cửa sổ đồ họa với màu sắc, tâm và bán kính được chỉ định Thường được sử dụng để vẽ các đối tượng tròn trong trò chơi hoặc ứng dụng đồ họa

Pygame

pg.draw.line(self.game.screen, 'orange', (100 * self.game.player.x, 100 * self.game.player.y): vẽ một đoạn đường thẳng từ điểm xuất phát đến điểm kết thúc trên cửa sổ đồ họa với màu sắc được chỉ định Điều này thường được sử dụng để

vẽ các đường thẳng hoặc ký hiệu trên màn hình, chẳng hạn như đường dẫn, dấu vết hoặc các yếu tố tương tự

pg.draw.rect(self.screen, FLOOR_COLOR, (0, HALF_HEIGHT, WIDTH, HEIGHT)):

có tác dụng vẽ một hình chữ nhật lên cửa sổ đồ họa trong ứng dụng

Giải thích tham số:

*self.screen: Đây là cửa sổ đồ họa Pygame mà bạn muốn vẽ hình chữ nhật lên self.screen có thể là biến đối tượng cửa sổ bạn đã tạo trong ứng dụng của bạn

Trang 10

10

*FLOOR_COLOR: Đây là màu sắc của hình chữ nhật FLOOR_COLOR có thể là một biến hoặc giá trị màu cụ thể Màu sắc này định dạng dưới dạng mã màu RGB hoặc bất kỳ cách biểu diễn màu sắc nào Pygame hỗ trợ

*(0, HALF_HEIGHT, WIDTH, HEIGHT): Đây là hình dạng và vị trí của hình chữ nhật

pg.display.flip(): có tác dụng cập nhật cửa sổ đồ họa để hiển thị các thay đổi mà bạn đã vẽ hoặc cập nhật lên cửa sổ Tác dụng của hàm này là làm cho các thay đổi trên cửa sổ trở nên hiển thị và thấy rõ trước mắt người dùng

Tác Dụng Cụ Thể:

*Cập nhật cửa sổ đồ họa: Sau khi bạn đã vẽ hình ảnh, đồ họa hoặc nội dung mới lên cửa sổ Pygame, bạn cần gọi pg.display.flip() để cập nhật cửa sổ để hiển thị các thay đổi Điều này là cần thiết vì Pygame sử dụng cơ chế double buffering, nghĩa

là bạn vẽ trên một bộ đệm ẩn và sau đó chuyển nó lên cửa sổ để tránh tạo ra các hiện tượng không đồng nhất hoặc nhấp nháy trên màn hình

*Hiển thị nội dung mới: Khi bạn gọi pg.display.flip(), nội dung bạn đã vẽ lên bộ đệm ẩn sẽ được hiển thị lên cửa sổ và trở thành nội dung hiển thị thực sự mà người dùng thấy được trên màn hình

pg.transform.scale(texture, res): được sử dụng để thay đổi kích thước của một hình ảnh (được biểu diễn bởi một đối tượng Surface) đến một kích thước mới

Cụ thể, hàm này sẽ:

*Thay đổi kích thước của hình ảnh (được biểu diễn bởi một đối tượng Surface) đến một kích thước mới Kích thước mới được chỉ định bởi tham số res, một iterable chứa chiều rộng và chiều cao mới

*Hàm này trả về một đối tượng Surface mới với kích thước đã được thay đổi

*Một đối tượng Surface tùy chọn có thể được sử dụng làm đích, thay vì tạo một đối tượng mới

pg.transform.smoothscale(img, (self.image.get_width() * scale,

self.image.get_height() * scale)): được sử dụng để thay đổi kích thước của một hình ảnh (được biểu diễn bởi một đối tượng Surface) đến một kích thước mới

*Hàm này áp dụng một bộ lọc làm mịn cho hình ảnh, giúp giảm các cạnh gãy gập

có thể xuất hiện khi thay đổi kích thước hình ảnh

*Hàm này trả về một đối tượng Surface mới với kích thước đã được thay đổi

Trang 11

vô hạn, tức là khi nhạc kết thúc, nó sẽ được phát lại từ đầu

*Kết hợp với các hàm khác của Pygame: Bạn có thể sử dụng các hàm khác của thư viện Pygame để điều khiển và quản lý việc phát nhạc Ví dụ, bạn có thể sử dụng pg.mixer.music.pause() để tạm dừng nhạc, pg.mixer.music.unpause() để tiếp tục phát, và pg.mixer.music.stop() để dừng phát nhạc

***Lưu ý rằng trước khi sử dụng pg.mixer.music.play(), bạn cần đã khởi tạo đun âm thanh của Pygame bằng pg.mixer.init() và chỉ định tệp âm thanh bạn muốn phát bằng pg.mixer.music.load()

mô-pg.mixer.init(): được sử dụng để khởi tạo module mixer Module mixer là một module tùy chọn và phụ thuộc vào SDL_mixer

Cụ thể, hàm này sẽ:

*Khởi tạo module mixer

*Hàm này nhận một số tham số tùy chọn để kiểm soát tốc độ phát lại và kích thước mẫu

*Pygame sẽ mặc định các giá trị hợp lý, nhưng Pygame không thể thực hiện tái lấy mẫu âm thanh, vì vậy mixer nên được khởi tạo để phù hợp với các giá trị của nguồn tài nguyên âm thanh của bạn

pg.mixer.Sound(): được sử dụng để tạo một đối tượng Sound từ một tệp hoặc đối tượng buffer

Cụ thể, hàm này sẽ:

*Tạo một đối tượng Sound từ một tệp hoặc đối tượng buffer

*Đối tượng Sound sau đó có thể được phát lại bằng cách gọi phương thức play() của nó

*Đối tượng Sound cũng có thể được phát lại nhiều lần

pg.mixer.music.load(): được sử dụng để tải một tệp âm nhạc và chuẩn bị nó cho việc phát lại1

Cụ thể, hàm này sẽ:

*Tải một tệp âm nhạc và chuẩn bị nó cho việc phát lại

Trang 12

12

*Nếu một luồng âm nhạc đã đang chạy, nó sẽ bị dừng

*Hàm này không bắt đầu phát âm nhạc

*Nếu bạn đang tải từ một đối tượng tệp, tham số namehint có thể được sử dụng để chỉ định loại dữ liệu âm nhạc trong đối tượng

*Pygame có thể tải các tệp WAV, MP3, OGG và lấy chúng làm đầu vào cho pygame.mixer

pg.mixer.music.set_volume(): được sử dụng để đặt âm lượng cho việc phát lại âm nhạc12

Cụ thể, hàm này sẽ:

*Đặt âm lượng cho việc phát lại âm nhạc

*Tham số âm lượng là một số thực từ 0.0 đến 1.0, trong đó giá trị cao hơn có nghĩa

là âm lượng lớn hơn

*Khi âm nhạc mới được tải, âm lượng sẽ được đặt lại về âm lượng tối đa

*Nếu âm lượng là một giá trị âm, nó sẽ bị bỏ qua và âm lượng sẽ vẫn được đặt ở mức hiện tại

Khác:

pg.mouse.set_pos([HALF_WIDTH, HALF_HEIGHT]): được sử dụng để đặt vị trí của con trỏ chuột

Cụ thể, hàm này sẽ:

*Đặt vị trí của con trỏ chuột

*Vị trí mới được chỉ định bởi một danh sách hai phần tử, tương ứng với tọa độ x và

y mới

*Trong trường hợp này, vị trí mới là giữa màn hình, vì HALF_WIDTH và

HALF_HEIGHT tương ứng với nửa chiều rộng và nửa chiều cao của màn hình

pg.image.load(path).convert_alpha(): được sử dụng để tải một hình ảnh từ một tệp

và chuyển đổi nó thành một định dạng mà Pygame có thể làm việc

Cụ thể, hàm này sẽ:

*Tải hình ảnh từ đường dẫn được chỉ định bởi path

*Sử dụng phương thức convert_alpha() để chuyển đổi hình ảnh sang một định dạng mà Pygame có thể làm việc Phương thức này cũng giữ lại thông tin alpha của hình ảnh, cho phép hỗ trợ độ trong suốt

Trang 13

13

MỤC 3: TRI N KHAI VÀ TH NGHI M Ể Ử Ệ

Trước khi đi vào chi tiết, một vấn đề cực kỳ quan tr ng cọ ần được xác định rõ đó là cách t ổ chức không gian trong trò chơi Như đã nêu rõ ở ục đặ ấn đề, ý tưở m t v ng của trò chơi là một t a game b n súng góc nhìn th ự ắ ứ nhất Do đó, không gian mà trò chơi hướng đến sẽ là m t không gian 3 chiộ ều Tuy vậy, trên th c t thì vi c t o ự ế ệ ạdựng m t không gian 3 chi u s kéo theo t t c ộ ề ẽ ấ ả những v t th ậ ể trong không gian đó cũng mang đặc điểm của không gian 3 chiều Điều này s làm ph c t p hóa d án ẽ ứ ạ ự

vì v t th s ậ ể ẽ phả ử ụi s d ng nh ng model 3D, th v n r t ph c tữ ứ ố ấ ứ ạp và khó để quản lý hoạt ảnh cũng như tương tác, thậm chí ph i s dả ử ụng đến nh ng ph n m m chuyên ữ ầ ềdụng Với tư tưởng là m t tộ ựa game đơn giản, việc xây dựng không gian 3 chiều trong trò chơi là điều buộc phải tránh Và để hiện thực hóa điều này, một phương pháp rất độc đáo sẽ được sử dụng Ý tưởng chính của phương pháp này là triển khai trò chơi trong không gian 2 chiều Tất cả những gì thực sự xảy ra và tương tác trong game đều được thực hiện trong không gian 2 chiều đó Bằng các phép chiếu khác nhau, những hình nh c a vả ủ ật th s được chi u lên khung hình, t ể ẽ ế ừ đó tạo ra

ảo ảnh không gian 3 chiều Đây chính là phương pháp sẽ giúp trò chơi hoạt động như một tựa game bắn súng góc nhìn th ứ nhất 3 chi u th c s ề ự ự (Cần phải lưu ý rằng phương pháp này vốn dùng để mô ph ng không gian 3 chi u t không gian 2 ỏ ề ừchi u nên s có mề ẽ ột số giới h n cạ ủa chính nó Điều này làm cho trò chơi không thể tri n khai các v t th ể ậ ể phứ ạp mà ch có th tri n khai m t s vc t ỉ ể ể ộ ố ật th ể đơn giản nhất định.)

Để ể tri n khai, d án s ự ẽ được chia làm nh ng phữ ần chính sau đây:

- Lớp chính (main class): đây sẽ là nơi mà những đối tượng (object) đượ ạo c t

ra và th c thi quá trình ch y c a game ự ạ ủ

- Bản đồ trò chơi (map): mô t ả những chi tiết và đặc điểm của bản đồ trong trò chơi

- Chùm tia thăm dò (raycasting): object đặc biệt dùng để thực hi n phép chiệ ếu

đã trình bày ở trên

- Người chơi (player)

- Vật th ể động (animated sprite): đây là lớp cha c a nh ng l p v t th có hình ủ ữ ớ ậ ểảnh động, không tham gia tr c tiự ếp vào trò chơi mà thông qua việc các lớp khác k ế thừa

Trang 14

14

- NPC (non-playable character), được hiểu là nh ng nhân v t t hành, không ữ ậ ự

do người chơi điều khiển: đây là những quái vật trong trò chơi

- Hệ thống tìm đường cho NPC (pathfinding): ch a gi i thuứ ả ật tìm đường đến

- Vũ khí (weapon: shotgun/pistol)

- Âm thanh (sound)

- Cài đặt (settings): mô t các h ng s cả ằ ố ủa trò chơi

Để ể hi u rõ cơ chế hoạt động ủa trò chơi, từng thành ph n nêu trên s c ầ ẽ được làm rõ

về c thuả ộc tính l n cách thẫ ức mà chúng tương tác với nhau

Lớp chính (main class):

Đây là lớp thực thi t t c ấ ả hoạt động của trò chơi thông qua việc khởi tạo các object

và g i t i nhọ ớ ững hàm chung tương tác với chúng

Khởi tạo l p này s ớ ẽ đồng th i kh i tờ ở ạo các biến như clock (đồng hồ),

global_trigger (dùng để ểm tra điề ki u kiện kích hoạt cho m t s ộ ố phương thứ … c),Cùng với đó, mộ ố t s cài đặt mặc định cũng được kích hoạt như ẩn con tr chu t, ỏ ộthi t lế ập kích thước màn hình, focus các thi t b input vào game và g i tế ị ọ ới phương thức new_game() để khởi tạo màn chơi mới

Lớp có phương thứ new_game() đểc khởi tạo các object, được dùng để tạo mới màn chơi Các object được khởi tạo trong hàm này bao gồm bản đồ trò chơi, người chơi, hệ thống kiết xu t hình nh, ấ ả chùm tia thăm dò, hệ thống x lý object, vũ khí, ử

âm thanh, h ệ thống tìm đường cho NPC

Tiếp theo là phương thứ update() dùng đểc cập nh t tr ng thái cho các object ậ ạPhương thức này s g i tẽ ọ ới chính phương thức update() c a các ủ object sau: người

Ngày đăng: 15/02/2025, 22:09

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN