1. Trang chủ
  2. » Giáo Dục - Đào Tạo

(Tiểu luận) bài tập lớn đề tài stride, game thể loại survival

20 9 0

Đ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

Định dạng
Số trang 20
Dung lượng 4,34 MB

Nội dung

Mục TiêuMục tiêu của dự án này là tạo ra một trò chơi "survival" thú vị, trong đó người chơi phải đánh quái và sử dụng các kỹ năng đặc biệt để sống sót.Trò chơi sẽ đặt người chơi vào một

HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG  BÁO CÁO BÀI TẬP LỚN NHÓM Giảng Viên: Vũ Minh Mạnh Đề tài: Stride, game thể loại survival Thành viên: HÀ NỘI – 2022 Mục lục Giới Thiệu 1.1 Mô Tả Chung 1.2 Mục Tiêu MARIO SURVIVAL – NHÓM 1.3 Các Tính Năng Chính Nội dung 2.1 Cấu trúc dự án .3 2.2 Triển khai 2.2.1 Sử dụng Tiled để tạo giao diện game 2.2.3 Thiết lập thông số cho cửa sổ game 2.2.4 Các bước chung xây dựng giao diện từ kết làm việc phần mềm Tiled 2.2.4.1 Nhập tệp CSV vào Pygame 2.2.4.2 Nhập hình ảnh từ thư mục Graphics 2.2.4.3 Tạo chơi với thơng tin có 2.2.5 Xây dựng đối tượng Player kiện liên quan .9 2.2.5.1 Tạo camera theo nhân vật 2.2.5.2 Kiểm tra va chạm theo phương thẳng đứng, ngang thêm trọng lực cho nhân vật 10 2.2.5.3 Kiểm tra va chạm với quái 11 2.2.5.4 Tạo hiệu ứng skill shield 13 2.2.5.5 Tạo hiệu ứng skill sword 14 2.2.5.6 Tạo máu cách thức tụt máu nhân vật 15 2.2.6 Xây dựng quái cảnh bổ sung .17 2.2.6.1 Tạo UFO 17 Kết luận 18 Tài liệu tham khảo .18 MARIO SURVIVAL – NHÓM Giới Thiệu Tên Trị Chơi: Mario Survival Ngơn Ngữ Lập Trình: Python Framework: Pygame Tác Giả: Nhóm 1.1 Mơ Tả Chung Đây trò chơi phát triển Python sử dụng thư viện Pygame Trò chơi có hướng chơi "survival", người chơi phải đánh quái sử dụng kỹ đặc biệt để sống sót mơi trường sống đầy rẫy nguy hiểm 1.2 Mục Tiêu Mục tiêu dự án tạo trò chơi "survival" thú vị, người chơi phải đánh quái sử dụng kỹ đặc biệt để sống sót Trị chơi đặt người chơi vào môi trường sống đầy nguy hiểm, họ phải tìm cách bảo vệ thân cách đánh quái sử dụng kỹ 1.3 Các Tính Năng Chính  Hệ thống Survival: Trị chơi đặt người chơi vào môi trường sống đầy nguy hiểm, họ phải tìm cách đánh quái sử dụng kỹ đặc biệt để sống sót  Đánh Quái Sống Sót: Người chơi phải sử dụng vũ khí kỹ đặc biệt họ để đánh quái bảo vệ thân khỏi hiểm họa  Kỹ Năng Đặc Biệt: Người chơi có kỹ đặc biệt, ví dụ: khiên bảo vệ,  Giao Diện Người Dùng: Giao diện người dùng hiển thị thông tin mức độ máu người chơi để quản lý sống sót Nội dung 2.1 Cấu trúc dự án Dự án tổ chức thành thư mục sau: MARIO SURVIVAL – NHÓM 2.2 Triển khai 2.2.1 Sử dụng Tiled để tạo giao diện game Giao diện gồm lớp sau:         Map_player: giao diện người chơi Map_enemies: giao diện quái Map_constraints: tạo vùng đánh đấu nơi quái chuyển hướng di chuyển Map_crates: thuộc phần cảnh giao diện Map_bg_palms: thuộc phần cảnh giao diện Map_fg_palms: thuộc phần cảnh giao diện Map_grass: thuộc phần cảnh giao diện Map_terrain: thuộc phần cảnh giao diện Các lớp sau xuất sang tệp có mở rộng csv để phục vụ cho việc xây dựng giao diện game thông qua ngơn ngữ python MARIO SURVIVAL – NHĨM 2.2.3 Thiết lập thông số cho cửa sổ game     Vertical_tile_number: đại diện cho số tile xếp theo chiều cao cửa sổ game Tile_size: kích thước tile (pixel) Screen_height: chiều cao cửa sổ game tổng kích thước tile theo chiều cao screen_width: Chiều rộng cửa sổ game (pixel) 2.2.4 Các bước chung xây dựng giao diện từ kết làm việc phần mềm Tiled Bước 1: Nhập tệp CSV vào Pygame  Đầu tiên, cần nhập liệu từ tệp CSV (comma separated value) vào Pygame Điều sử dụng để định nghĩa yếu tố chơi Màn chơi lưu trữ dạng tệp CSV theo mục 2.2.1 Bước 2: Nhập hình ảnh từ thư mục Graphics  Tiếp theo, cần nhập tất hình ảnh cho trò chơi, bắt đầu với tệp terrain Tệp terrain chứa hình ảnh khối đất vật thể chơi Chúng ta cần cắt tệp hình thành phần nhỏ để sử dụng trò chơi Bước 3: Tạo chơi với thông tin có  Cuối cùng, Chúng ta cần sử dụng thơng tin từ phần cắt tệp CSV nhập để tạo bố cục chơi Pygame Trong trình này, viết lượng code đáng kể để thực bước cung cấp trải nghiệm trực quan chơi Pygame MARIO SURVIVAL – NHĨM Ngồi ra, q trình này, cần sử dụng thêm thư viện chức Pygame để điều khiển hiển thị, tương tác trạng thái trò chơi 2.2.4.1 Nhập tệp CSV vào Pygame Đoạn mã import_csv_layout thực việc đọc tệp CSV chứa thông tin chơi trò chơi biến đổi thành danh sách danh sách Dưới ý tưởng tổng quan: Mở tệp CSV sử dụng thư viện csv để đọc Duyệt qua hàng tệp CSV Mỗi hàng tệp CSV chứa thông tin cấu trúc chơi, ví dụ: dịng gồm ký tự đại diện cho phần chơi (ví dụ: khác “-1”cho đối tượng game, "-1" cho không gian trống) Chuyển hàng thành danh sách (list) Python, phần tử danh sách ký tự đại diện cho phần tử chơi Thêm danh sách vào danh sách terrian_map, danh sách hàng chơi Cuối cùng, trả danh sách terrian_map chứa thông tin chơi, để sử dụng cho việc hiển thị tương tác trò chơi Document continues below Discover more from: Basic PYB Python Học viện Công ng… 6 documents Go to course Python 18 24 Python Basic None Lap trinh huong doi tuong Python Python Basic None Python 92 please give more… Python Basic None Cài đặt pyspark Python Basic None 60 Python projects with code Python Basic 147 6183.2105.02-01 VCS-4G 6.0… None Phát triển dịch vụ gi… 100% (2) MARIO SURVIVAL – NHÓM 2.2.4.2 Nhập hình ảnh từ thư mục Graphics Đoạn mã sau có ý tưởng sau:         Hàm import_cut_graphics nhận vào đường dẫn (path) đến tệp hình ảnh, sử dụng hàm pygame.image.load để tải hình ảnh vào biến surface Hình ảnh có chứa nhiều tile khác nhau, tile có kích thước với biến tile_size Hàm tính toán số lượng tile theo chiều ngang (tile_num_x) chiều dọc (tile_num_y) hình ảnh cách chia kích thước hình ảnh cho kích thước tile Hàm tạo danh sách trống (cut_tiles) để lưu trữ tile cắt từ hình ảnh gốc Hàm sử dụng hai vòng lặp lồng để duyệt qua hàng (row) cột (col) hình ảnh, tính tốn tọa độ x y góc bên trái tile Hàm tạo biến new_surf đối tượng pygame.Surface mới, có kích thước với kích thước tile, có thuộc tính flags pygame.SRCALPHA phép hỗ trợ kênh alpha (độ suốt) hình ảnh Hàm sử dụng hàm pygame.Surface.blit để vẽ phần hình ảnh gốc (surface) lên biến new_surf, với phần vẽ hình chữ nhật (pygame.Rect) có góc bên trái (x,y) kích thước (tile_size,tile_size) Hàm thêm biến new_surf vào danh sách cut_tiles, tiếp tục vòng lặp cắt hết tất tile hình ảnh gốc Hàm trả danh sách cut_tiles, chứa tile cắt từ hình ảnh gốc Các tile sử dụng để đặt lên ô vuông đồ thiết kế map trò chơi phần mêm tiled MARIO SURVIVAL – NHÓM 2.2.4.3 Tạo chơi với thơng tin có Khi có list hình ảnh có id (giá trị xác định nơi đồ game hình ảnh đặt) tương ứng với mục hình ảnh list cho loại lớp đồ (crates, grass, terrain, …):    Duyệt giá trị tệp CSV nhập mục 2.2.4.1 sau đặt đối tượng sprite đại diện cho hình ảnh giá trị khác ‘-1’ Và để người chơi thấy đối tượng sprite cần đối tượng Group để quản lý việc thị trạng thái đối tượng này:  Cuối cùng, sủ dụng phương thức draw() update() pygame.sprite.Group() để thị sprite lớp đồ cụ thể lên cửa sổ game MARIO SURVIVAL – NHÓM 2.2.5 Xây dựng đối tượng Player kiện liên quan 2.2.5.1 Tạo camera theo nhân vật Dưới ý tưởng đoạn mã:    player = self.player.sprite: Lấy sprite nhân vật từ thuộc tính self.player player_x = player.rect.centerx: Lấy tọa độ x tâm hình chữ nhật (rect) bao quanh nhân vật direction_x = player.direction.x: Lấy hướng di chuyển ngang nhân vật Sau đó, phương thức kiểm tra xem nhân vật đâu hình di chuyển theo hướng nào:    Nếu nhân vật phần tư bên trái hình di chuyển sang trái (direction_x < 0), camera di chuyển sang trái (self.world_shift = 8) tốc độ di chuyển nhân vật giảm xuống (player.speed = 0) Nếu nhân vật phần tư bên phải hình di chuyển sang phải (direction_x > 0), camera di chuyển sang phải (self.world_shift = -8) tốc độ di chuyển nhân vật giảm xuống (player.speed = 0) Trong trường hợp khác, camera không di chuyển (self.world_shift = 0) tốc độ di chuyển nhân vật khôi phục lại (player.speed = 8) MARIO SURVIVAL – NHĨM Biến self.world_shift sau dùng làm đối số phương thức update() để cập nhật trạng thái toàn đối tượng sprite đồ game Điều cho phép camera “theo dõi” nhân vật di chuyển qua lại hình 2.2.5.2 Kiểm tra va chạm theo phương thẳng đứng, ngang thêm trọng lực cho nhân vật Chúng ta xác định hình chữ nhật bao quanh toàn người chơi trừ kiếm sau: Nguyên nhân cho điều là:   Khi tạo hoạt ảnh cho nhân vật kích thước self.rect thay đổi liên tục khơng cố định kích thước khung hình khác Điều gây số lỗi kiểm tra va chạm theo chiều ngang dọc Để tránh lỗi này, ta tạo hình chữ nhật tĩnh self.collision_rect bao quanh tồn thể nhân vật dùng để kiểm tra va chạm theo chiều ngang dọc Chiều dọc: 10 MARIO SURVIVAL – NHÓM Dưới ý tưởng đoạn code: Trước hết, ta cập nhật hướng di chuyển theo chiều dọc nhân vật cách gọi hàm apply_gravity Hàm cộng thêm giá trị gravity vào hướng di chuyển dọc (direction.y) nhân vật Tạo danh sách collidable_sprites cách gom tất sprite va chạm với nhân vật lại, bao gồm sprite mặt đất (terrain), thùng gỗ (crate), cọ (fg_palm) Sau đó, duyệt qua danh sách collidable_sprites kiểm tra xem có va chạm xảy hình chữ nhật va chạm nhân vật (player.collision_rect) hình chữ nhật sprite (sprite.rect) cách sử dụng colliderect Nếu va chạm xảy ra, kiểm tra hướng di chuyển dọc nhân vật (player.direction.y) để xác định xem nhân vật chạm đất chạm trần Nếu player.direction.y > 0, tức nhân vật xuống (rơi), đặt lại vị trí hình chữ nhật va chạm nhân vật để nằm sprite kia, đồng thời đặt player.direction.y = player.on_ground = True để ngăn nhân vật tiếp tục rơi đánh dấu nhân vật đứng mặt đất Ngược lại, player.direction.y < 0, tức nhân vật lên, đặt lại vị trí hình chữ nhật va chạm nhân vật để đỡ trần đặt player.direction.y = player.on_ceiling = True để ngăn nhân vật tiếp tục lên Cuối cùng, kiểm tra player.on_ground mà True (player.direction.y) nhỏ lớn 1, tức nhân nhảy lên(< 0) rơi xuống (>1) từ vách đá ta đặt (player.on_ground = False)  Tương tự cho chiều ngang 11 MARIO SURVIVAL – NHÓM 2.2.5.3 Kiểm tra va chạm với quái Dưới mô tả chi tiết phương thức này: enemy_collisions = pygame.sprite.spritecollide(self.player.sprite, self.enemy_sprites, False): Đầu tiên, ta sử dụng pygame.sprite.spritecollide xác định mục 2.2.5.2 để xác định xem nhân vật có va chạm với kẻ thù nhóm self.enemy_sprites hay không Kết việc danh sách kẻ thù mà nhân vật va chạm if enemy_collisions:: kiểm tra xem danh sách enemy_collisions có phần tử hay khơng, tức nhân vật có va chạm với kẻ thù Nếu danh sách enemy_collisions khơng rỗng (có va chạm), ta bắt đầu kiểm tra tình va chạm: a for enemy in enemy_collisions:: lặp qua kẻ thù danh sách enemy_collisions b enemy_center = enemy.rect.centery, enemy_top = enemy.rect.top, player_bottom = self.player.sprite.rect.bottom: ta lấy giá trị tọa độ trung tâm phần kẻ thù (enemy_center, enemy_top) phần nhân vật (player_bottom) c if enemy_top < player_bottom < enemy_center and self.player.sprite.direction.y >= 0:: Kiểm tra xem phần kẻ thù có phần nhân vật đồng thời nhân vật di chuyển xuống (self.player.sprite.direction.y >= 0) hay khơng 12 MARIO SURVIVAL – NHĨM Nếu hai điều kiện đúng, có nghĩa nhân vật nhảy lên đè lên kẻ thù từ xuống, ta xử lý trường hợp  self.stomp_sound.play(): bật âm (tiếng giày nhân vật đè lên kẻ thù)  self.player.sprite.direction.y = -15: Bạn thay đổi hướng di chuyển nhân vật để đè lên kẻ thù nhân vật nhảy lên khoảng  explosion_sprite = ParticleEffect(enemy.rect.center, 'explosion'): ta tạo hiệu ứng hạt bụi (explosion) vị trí kẻ thù bị đè lên  self.explosion_sprites.add(explosion_sprite): thêm hiệu ứng hạt bụi vào nhóm self.explosion_sprites  enemy.kill():loại bỏ kẻ thù khỏi nhóm self.enemy_sprites d Nếu điều kiện 3c không thỏa mãn (nhân vật khơng đè lên kẻ thù), ta kiểm tra xem nhân vật có bật khiên hay khơng:  Nếu nhân vật khơng bật khiên, ta bật âm nhân vật bị đụng (self.get_hit_sound.play())  Nếu nhân vật bật khiên, ta bật âm tạo hiệu ứng hạt bụi tiếng nổ khác (self.explode_sound2.play()) kẻ thù bị tiêu diệt 13 MARIO SURVIVAL – NHÓM 2.2.5.4 Tạo hiệu ứng skill shield Dưới ý tưởng cách phương thức hoạt động:  if self.can_cast_shield and time.time() - self.shield_start_time < self.shield_duration:: Trước hết, phương thức kiểm tra xem nhân vật kích hoạt "shield" khơng (self.can_cast_shield) đủ thời gian kể từ lần cuối "shield" kích hoạt (self.shield_start_time) chưa Nếu hai điều kiện đúng, nhân vật kích hoạt "shield" thực hiệu ứng  Trong phạm vi hiệu ứng "shield", khung hình chuyển đổi để tạo hiệu ứng hoạt hình Trong trường hợp này, ta sử dụng biến self.shield_frame_index để theo dõi khung hình self.shield_animation_speed để xác định tốc độ hoạt hình "shield"  shield_particle = self.shield_particles[int(self.shield_frame_index)]: ta lấy khung hình "shield" từ danh sách self.shield_particles dựa vào giá trị self.shield_frame_index  Xác định vị trí hiệu ứng "shield" dựa hướng mà nhân vật nhìn: 14 MARIO SURVIVAL – NHĨM o Nếu nhân vật nhìn bên phải (self.facing_right), tính tốn vị trí pos gần hình ảnh nhân vật đặt shield_particle o Nếu nhân vật nhìn bên trái, lật ngược hình ảnh shield_particle đặt vị trí tương ứng  Nếu self.shield_frame_index self.shield_frame_index2 (đối với shield_particles2) vượt số lượng khung hình có sẵn, ta đặt lại chúng để bắt đầu vịng lặp hoạt hình  Cuối cùng, ta vẽ hiệu ứng "shield" lên hình cách sử dụng self.display_surface.blit(shield_particle, pos) 2.2.5.5 Tạo hiệu ứng skill sword Dưới ý tưởng cách phương thức hoạt động: if self.can_cast and time.time() - self.cast_start_time < self.cast_duration:: Trước hết, phương thức kiểm tra xem nhân vật bật khkhơng (self.can_cast) đủ thời gian kể từ lần cuối "cast" kích hoạt (self.cast_start_time) chưa Nếu hai điều kiện đúng, nhân vật kích hoạt "cast" thực hiệu ứng Trong phạm vi hiệu ứng "cast", khung hình chuyển đổi để tạo hiệu ứng hoạt hình Ta sử dụng biến self.cast_frame_index để theo dõi khung hình self.cast_animation_speed để xác định tốc độ hoạt hình "cast" 15 MARIO SURVIVAL – NHĨM cast_particle = self.cast_particles[int(self.cast_frame_index)]: Ta lấy khung hình "cast" từ danh sách self.cast_particles dựa vào giá trị self.cast_frame_index Xác định vị trí hiệu ứng "cast" dựa hướng mà nhân vật nhìn:  Nếu nhân vật nhìn bên phải (self.facing_right), ta tính tốn vị trí pos gần hình ảnh nhân vật đặt cast_particle  Nếu nhân vật nhìn bên trái, lật ngược hình ảnh cast_particle đặt vị trí tương ứng Nếu self.cast_frame_index vượt q số lượng khung hình có sẵn, ta đặt lại để bắt đầu vịng lặp hoạt hình Cuối cùng, vẽ hiệu ứng "cast" lên hình cách sử dụng self.display_surface.blit(cast_particle, pos) 2.2.5.6 Tạo máu cách thức tụt máu nhân vật Lớp UI: 16 MARIO SURVIVAL – NHĨM  Lớp UI sử dụng để hiển thị máu hình quản lý thơng tin liên quan đến máu  Trong phần khởi tạo ( init ), ta nạp hình ảnh máu (health bar) thiết lập thơng số vị trí máu kích thước máu  Phương thức show_health sử dụng để cập nhật máu hiển thị hình Nó nhận vào hai tham số: current (là lượng máu tại) full (là máu tối đa)  Phương thức vẽ máu dựa tỉ lệ lượng máu máu tối đa Nó tính tốn độ rộng máu điền (bar) dựa tỉ lệ này, sau vẽ hình chữ nhật màu đỏ ('#dc4949') máu với độ rộng tính tốn Lớp Game:  Lớp Game chứa thông tin lượng máu (self.cur_health) lượng máu tối đa (self.max_health) người chơi  Phương thức change_health gọi để cập nhật lượng máu Ta truyền vào số âm để giảm máu số dương để tăng máu  Phương thức check_game_over kiểm tra xem máu người chơi có hay khơng Nếu có, reset máu tại, đặt self.max_level quay lại chơi overworld 17 MARIO SURVIVAL – NHÓM 2.2.6 Xây dựng quái cảnh bổ sung 2.2.6.1 Tạo UFO Lớp Ufo:  Lớp Ufo kế thừa từ lớp AnimatedTile, ta tạo đối tượng Ufo với thơng số kích thước (size), vị trí x y ban đầu  Ở phần khởi tạo, đối tượng Ufo di chuyển lên phía để nằm phía hình gán tốc độ di chuyển ngẫu nhiên khoảng từ 0.5 đến 2.5  Phương thức move gọi để thực di chuyển ngang cho đối tượng Ufo Nếu tốc độ (speed) dương, di chuyển sang bên phải, âm, di chuyển sang bên trái  Phương thức reverse_image để lật ngược hình ảnh Ufo di chuyển sang bên trái (tốc độ âm)  Phương thức reverse gọi xảy va chạm (ở phần enemy_collision_reverse file level.py) đảo ngược hướng di chuyển Ufo (đổi dấu tốc độ) 18 MARIO SURVIVAL – NHÓM  Tương tự với đối tượng thuộc lớp Enemy Kết luận Tài liệu tham khảo 19

Ngày đăng: 28/12/2023, 18:56