Hướng dẫn làm game flappy bird

Chào rất nhiều người! Trong bài xích khuyên bảo lần này mình sẽ cùng các bạn tạo thành game Flappy Bird cùng với pygame. Flappy Bird là một game mà hầu như người nào cũng biết, lối chơi đơn giản cùng gần như là ai học tập lập trình sẵn game cũng từng demo làm tựa game này. Không nói lâu năm mẫu nữa, chúng ta cùng bước đầu luôn luôn nha!

Kiến thức cnạp năng lượng bản

Thứ nhất, các bạn phải biết cơ bạn dạng về python cùng pygame. quý khách làm sao chưa tò mò pygame thì có thể xem qua 2 bài bác hướng dẫn cơ phiên bản của bản thân (phần 1, phần 2)hoặc hoàn toàn có thể học tập trên các nguồn không giống nhé. Bài này tương đối nhiều năm buộc phải các bạn yêu cầu nỗ lực theo dõi và quan sát. Để gồm động lực thì chúng ta cùng xem trước thành quả đó có tác dụng được vào bài này nhe!

Các các bạn cài đặt source code không hề thiếu trên phía trên.

Bạn đang xem: Hướng dẫn làm game flappy bird

Tạo thư mục cùng file cho game

Các bạn hãy tạo thành tlỗi mục tất cả cấu trúc như sau:

*

flappyBird.py là tệp tin code chủ yếu của bọn họ. Thỏng mục img đựng đa số hình hình ảnh vào game.

Các hình hình họa mình đem tại đây và bản thân bao gồm chỉnh lại đến phù hợp với game.

Các hình hình ảnh đang bao gồm vào phần source code tương đối đầy đủ rồi. Các bạn lưu giữ download về cùng cấp dưỡng.

vì vậy là họ sẽ chuẩn bị dứt mọi thiết bị quan trọng. Bây giờ chúng ta mngơi nghỉ fileflappyBird.py rồi code thôi!

Tạo cửa sổ game cùng vẽ nền mang đến game

Phần này hơi đơn giản và dễ dàng buộc phải mình đi nhanh hao qua nhe. Mọi vật dụng vào này mình đã trình làng sống rất nhiều bài bác trước rồi.

À mà do mình đang code mỗi bước bắt buộc đôi lúc hồ hết cái code tất cả sự khác hoàn toàn so với đoạn code tương đối đầy đủ nhe!

import pygame, sys, randomfrom pygame.locals import *WINDOWWIDTH = 400WINDOWHEIGHT = 600BACKGROUND = pygame.image.load("img/background.png")pygame.init()FPS = 60fpsCloông chồng = pygame.time.Clock()DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))pygame.display.set_caption("Flappy Bird")def main(): while True: for sự kiện in pygame.sự kiện.get(): if sự kiện.type == QUIT: pygame.quit() sys.exit() DISPLAYSURF.blit(BACKGROUND, (0, 0)) pygame.display.update() fpsCloông chồng.tick(FPS)if __name__ == "__main__": main()

Tạo bé chlặng cùng điểu khiển nó

Tạo nhỏ chlặng với vẽ lên cửa ngõ sổỞ đầu đoạn code, họ sẽ tạo nên một trong những hằng số để nhân thể cho câu hỏi chuyển đổi, chất vấn. Các bạn tìm hiểu thêm ở code không thiếu nhe!

BIRDWIDTH = 60BIRDHEIGHT = 45G = 0.5SPEEDFLY = -8BIRDIMG = pygame.image.load("img/bird.png")Tạo class Bird như sau:

class Bird(): def __init__(self): self.width = BIRDWIDTH self.height = BIRDHEIGHT self.x = (WINDOWWIDTH - self.width)/2 self.y = (WINDOWHEIGHT- self.height)/2 self.speed = 0 self.suface = BIRDIMG def draw(self): DISPLAYSURF.blit(self.suface, (int(self.x), int(self.y)))Có lẽ các bạn cũng đã đọc mục đích của các trở thành trong __init__ rồi! Các bạn có thể xem hình dưới

*

Các bạn cần để ý self.speed là tốc độ cất cánh của chim. Cái này mình đang nói ở trong phần sau.

Trong hàm main sinh sản thêm một thay đổi bird cùng Hotline hàm bird.draw() trong vòng lặp game.

def main(): bird = Bird() while True: for sự kiện in pygame.sự kiện.get(): if sự kiện.type == QUIT: pygame.quit() sys.exit() DISPLAYSURF.blit(BACKGROUND, (0, 0)) bird.draw() pygame.display.update() fpsCloông xã.tick(FPS)Các bạn chạy demo nhe. Con chyên ổn đã có vẽ lên màn hình. Bây tiếng họ hãy search giải pháp tạo nên con chlặng rơi xuống nhe.

Chuyển hễ rơi tự do thoải mái của chim

Bây giờ bọn họ hãy code trước rồi mình đang giải thích sau.

Nlỗi bài bác gợi ý trước, nhằm chuyển đổi vị trí của chyên ổn thì rất cần phải bao gồm thêm hàm update. Các bạn hãy sản xuất hàm update của class Bird nlỗi sau:

def update(self): self.y += self.tốc độ + 0.5*G self.speed += GTrong vòng lặp game các bạn nhớ điện thoại tư vấn hàm bird.update() sau dòng bird.draw()

while True: for sự kiện in pygame.event.get(): if sự kiện.type == QUIT: pygame.quit() sys.exit() DISPLAYSURF.blit(BACKGROUND, (0, 0)) bird.draw() bird.update() pygame.display.update() fpsCloông xã.tick(FPS)Chạy demo cùng coi hiệu quả nhé. Bây tiếng chúng ta cần biết hồ hết gì đang xảy ra phía bên trong hàm update.

Nhưng thứ nhất, những bạn cần phải biết gần như điều cơ phiên bản về hoạt động rơi từ bỏ do. Thực hóa học, rơi tự do thoải mái là hoạt động nhanh khô dần dần đều theo gia tốc trọng trường. Các bạn cần phải biết các phương trình của vận động rơi từ bỏ do y = y0+ v0t + 0.5gt2 cùng v = v0+ gt. Nếu chưa rõ thì các chúng ta cũng có thể từ tìm hiểu nhe, bản thân không nói kỹ ở chỗ này.

*

Trong hàm update họ công thêm tung độ(self.y) cùng tốc độ (self.speed) của chyên ứng cùng với từng khung hình. Như chúng ta đang biết, những khung hình xuất hiện biện pháp nhau một khoảng chừng thời gian xác định. Để mang lại dễ dàng và đơn giản thì đến đông đảo khoảng chừng thời hạn đều bởi 1 cùng Khi nuốm vào phương trình rơi thoải mái sẽ được 2 mẫu code bên trên. Trong số đó, G đó là tốc độ trọng trường.

Chuyển rượu cồn bay lên lúc Click chuột

Để tạo nên vận động bay lên Khi Cliông chồng loài chuột thì cần phải bắt sự khiếu nại Clichồng chuộtthay đổi tốc độ của chlặng. Tốc độ cất cánh lên tất yếu buộc phải gồm quý hiếm âm, trong code của chúng ta đang một hằng số là SPEEDFLY=-8.

Bây tiếng cần được thêm một số trong những đồ vật vào hàm update.

def update(self, mouseClick): self.y += self.tốc độ + 0.5*G self.speed += G if mouseClick == True: self.speed = SPEEDFLYCó thêm 1 tmê mệt số là mouseClichồng, vươn lên là này dùng để làm kiểm tra việc Clichồng loài chuột.

Dòng if được chế tạo hơi đơn giản và dễ dàng. Nếu Cliông chồng loài chuột thì đặt vận tốc chlặng là SPEEDFLY.

Bây tiếng, câu hỏi cần làm cho là bắt sự kiện Clichồng chuột và truyền vào hàm update, thêm phần đa dòng code bên phía trong vòng lặp game như sau:

while True: mouseCliông xã = False for event in pygame.event.get(): if sự kiện.type == QUIT: pygame.quit() sys.exit() if event.type == MOUSEBUTTONDOWN: mouseCliông xã = True DISPLAYSURF.blit(BACKGROUND, (0, 0)) bird.draw() bird.update(mouseClick) pygame.display.update() fpsCloông chồng.tick(FPS)Biến mouseCliông chồng nhằm chất vấn sự khiếu nại Cliông xã loài chuột và truyền vào hàm update. Trong vòng forthì thực hiện Việc bắt sự kiện MOUSEBUTTONDOWN, sự khiếu nại này xảy ra Lúc nút loài chuột được ấn vào.

Vậy là bọn họ vẫn kết thúc dứt phần của nhỏ chlặng. Trước khi thanh lịch phần new, các bạn buộc phải quan sát lại đoạn code, nghĩ lại rất nhiều chiếc code xem bọn chúng gồm tính năng gì, hoạt động thế nào. Nếu làm rõ rất nhiều thiết bị rồi thì bọn họ cùng sang phần tiếp sau, đó là sinh sản những chiếc cột.

Tạo cột với vận động của cột

Tạo cột

Như vẫn biết thì sẽ sở hữu hồ hết phần cột bên trên cùng dưới. Lúc mình kể đến 1 chiếc "cột" thì chúng ta hãy gọi là bao gồm cả hai phần với không gian thân 2 phần nhe!

Bây tiếng, các bạn hãy gõ code trước đi. Mình đang phân tích và lý giải đông đảo đoạn code kia sau.

Thêm một số hằng số:

COLUMNWIDTH = 60COLUMNHEIGHT = 500BLANK = 160DISTANCE = 200COLUMNSPEED = 2COLUMNIMG = pygame.image.load("img/column.png")Tạo class Columns

class Columns(): def __init__(self): self.width = COLUMNWIDTH self.height = COLUMNHEIGHT self.blank = BLANK self.distance = DISTANCE self.tốc độ = COLUMNSPEED self.surface = COLUMNIMG self.ls = <> for i in range(3): x = i*self.distance y = random.randrange(60, WINDOWHEIGHT - self.blank - 60, 20) self.ls.append() def draw(self): for i in range(3): DISPLAYSURF.blit(self.surface, (self.ls<0>, self.ls<1> - self.height)) DISPLAYSURF.blit(self.surface, (self.ls<0>, self.ls<1> + self.blank))Trong hàm main có tác dụng tựa như như phần con chlặng nhe. Tạo biến chuyển columns, thêm hàm columns.draw() vào vòng lặp game.

def main(): bird = Bird() columns = Columns() while True: mouseClichồng = False for event in pygame.sự kiện.get(): if event.type == QUIT: pygame.quit() sys.exit() if sự kiện.type == MOUSEBUTTONDOWN: mouseCliông xã = True DISPLAYSURF.blit(BACKGROUND, (0, 0)) columns.draw() bird.draw() bird.update(mouseClick) pygame.display.update() fpsCloông chồng.tick(FPS)Rồi hiện nay thì nên chạy thử với xem kết quả đó. Sau kia, mang lại phần khám phá code thôi!

Bây giờ hãy chú ý lại class Columns, vào hàm __init__ bao gồm khởi chế tạo một vài biến:

self.width là chiều rộng lớn của cột.self.height là chiều cao của một trong những phần cột.self.blank là chiều cao không gian giữa 2 phần cột.self.distance là khoảng cách thân các cột.self.speed là tốc độ dịch rời của cột (cột vẫn dịch rời thanh lịch trái).self.surface là surface của một trong những phần cột.self.ls là 1 list đựng lên tiếng về địa điểm cột và địa điểm khoảng trống. Cụ thể: một trong những phần tử vào danh mục chđọng đọc tin của một cột, phần tử đó gồm dạng , trong đó x là hoành độ của cột, y là tung độ của khoảng trống.

Vòng lặp for trong __init__ dùng để chế tạo ra 3 cột đầu tiên.

for i in range(3): x = i*self.distance y = random.randrange(60, WINDOWHEIGHT - self.blank - 60, 20) self.ls.append()Biến x là hoành độ của cột. Cột trước tiên được vẽ liền kề lề phía trái, Tức là x = 0. Các cột tiếp theo bí quyết nhau một khoảng tầm bởi self.distance.Biến y là vị trí của khoảng không. Biến này thừa nhận cực hiếm random để tạo nên phần đông không gian có địa điểm không giống nhau.

*

Bây giờ đồng hồ hãy xem hàm draw của class Columns.

def draw(self): for i in range(3): DISPLAYSURF.blit(self.surface, (self.ls<0>, self.ls<1> - self.height)) DISPLAYSURF.blit(self.surface, (self.ls<0>, self.ls<1> + self.blank))Vòng lặp for dùng làm vẽ 3 cột, mỗi cột bao gồm 2 phần yêu cầu tất cả 2 chiếc nhằm vẽ phần bên trên với phần bên dưới.

Như vậy là chúng ta đã tạo nên các cột, hiện giờ hãy sang trọng phần tiếp theo để tò mò phương pháp mang đến những chiếc cột dịch rời.

Tạo vận động cho cột

Nhỏng thường xuyên lệ, bọn họ sẽ thêm hàm update mang lại class Columns với sinh sống vòng lặp game thì Điện thoại tư vấn hàm columns.update() sau dòng columns.draw(). Ý tưởng là dùng vòng lặp for nhằm lặp qua 3 cột, đối với mỗi cột thì hoành độ của nó sẽ giảm xuống. Nghe dường như đơn giản thất thoát.

Xem thêm: Khách Sạn Nhà Nghỉ Tại Lý Sơn Đang Khuyến Mãi Tại Traveloka, 10 Khách Sạn Tốt Nhất Ở Ly Son (Giá Từ Vnd 230

def update(self): for i in range(3): self.ls<0> -= self.speedChạy thử giúp xem công dụng nhé. Những dòng cột sẽ di chuyển sang trọng trái rồi.

Tuy nhiên, bao gồm một vụ việc nghỉ ngơi đây là chúng ta bắt đầu chỉ tất cả 3 cột, trong lúc kia game cần được có tương đối nhiều (nếu không muốn nói là vô hạn) cột. Các bạn có thể chế tạo thật những bộ phận cho self.ls. Tuy nhiên, điều này nghe có vẻ như không tác dụng một chút nào. Hãy nghĩ về ra 1 ý tưởng bắt đầu như thế nào, các cột đã dịch rời sang trái với lúc 1 cột làm sao đó đi thoát ra khỏi screen thì nó không còn chức năng gì nữa, bạn cũng có thể xoá loại cột kia đi với tạo một cái cột khác thông suốt theo. Theo vậy thì self.ls sẽ vẫn chỉ có 3 thành phần, lúc tới đầy đủ thời khắc tương thích sẽ sở hữu 1 cột bị xoá đi1 cột đạt thêm vào.

*

Nếu có ý tưởng rồi thì thêm code vào hàm update thôi.

def update(self): for i in range(3): self.ls<0> -= self.speed if self.ls<0><0> Dòng if được tiếp tế nhằm kiểm tra xem cột tất cả đi ra bên ngoài screen giỏi không.

Dòng self.ls.pop(0) nhằm xoá cột tại đoạn trước tiên.

x là hoành độ cột cung ứng. Cột được tiếp tế vẫn biện pháp cột cuối một khoảng bởi self.distance. Do vừa xoá 1 cột rồi bắt buộc self.ls chỉ với 2 cột thôi.

y là tung độ khoảng không của cột chế tạo, cũng mang giá bán trị random tựa như những cột khác.

Các các bạn hãy chạy demo với coi tác dụng nhe.

À nhưng mà lúc nãy mình code mẫu cột trước tiên ở cạnh bên lề bên trái nhằm một thể theo dõi và quan sát thôi. Thực tế, trong game các cột đã ngơi nghỉ mặt phải màn hình rồi new di chuyển hẳn qua. Nên sinh sống vòng lặp for vào hàm __init__ chúng ta sửa lại cái x=i*self.distance thành x= WINDOWWIDTH +i*self.distance nhằm cột đầu tiên nằm cạnh sát buộc phải màn hình

bởi thế là họ vẫn kết thúc kết thúc phần cột rồi! Các chúng ta xem xét lại code nhằm sẵn sàng thanh lịch phần tiếp sau nhé!

Xử lý va chạm

Va chạm giữa nhị hình chữ nhật

Xử lý va chạm là một trong những phần luôn luôn phải có trong lập trình sẵn game. Trong Flappy Bird sẽ có được sự va đụng giữa chlặng và cột, chính vì thế chúng ta cần phải biết rõ lúc nào chyên ổn sẽ va chạm tới cột, từ bỏ kia viết phần đông đoạn code nhằm cách xử lý. Để cho đơn giản thì hãy coi chyên ổn là một trong những hình chữ nhật, một trong những phần của cột (trên hoặc dưới) là 1 hình chữ nhật. Chúng ta đề nghị viết một hàm nhằm đánh giá coi hai hình chữ nhật bao gồm va tiếp xúc với nhau hay không. Hàm phải viết sẽ có 2 tđam mê số truyền vào là 2 danh mục đựng hồ hết thông số kỹ thuật hình chữ nhật (hoành độ, tung độ, chiều rộng lớn, chiều cao).

def rectCollision(rect1, rect2): if rect1<0> Cách áp dụng của hàm này khôn cùng dễ dàng, truyền 2 "hình chữ nhật" vào hàm, hàm trả về True nếu 2 hình chữ nhật va nhau, ngược chở lại trả về False. Hàm này chuyển động cố gắng như thế nào thì chúng ta từ bỏ đọc code rồi mày mò nhe, mình sẽ sở hữu một bài bác riêng nhằm nói đến cách xử lý va đụng.

Kiểm tra gameover

Nlỗi các bạn đang biết, Khi chlặng đụng vào cột, va đất hoặc di chuyển tương đối cao ra khỏi screen thì gameover. Tại bên trên chúng ta đang có hàm nhằm đánh giá sự va va giữa 2 hình chữ nhật rồi, họ sẽ sử dụng hàm đó vào hàm kiểm tra gameover. Các các bạn thêm hàm isGameOver bên dưới hàm rectCollision nhe. Mình đang giải thích code sau.

def isGameOver(bird, columns): for i in range(3): rectBird = rectColumn1 = <0>, columns.ls<1> - columns.height, columns.width, columns.height> rectColumn2 = <0>, columns.ls<1> + columns.blank, columns.width, columns.height> if rectCollision(rectBird, rectColumn1) == True or rectCollision(rectBird, rectColumn2) == True: return True if bird.y + bird.height WINDOWHEIGHT: return True return FalseTrong hàm này các chúng ta có thể thấy một vòng lặp for dùng để chạy qua 3 cột, chyên ổn va bất cứ cột nào thì cũng gameover. Các chúng ta xem những dòng code bên trong for nhé. Biến rectBird được tạo thành nhằm chứa thông số kỹ thuật hình chữ nhật của chyên ổn. Tương từ bỏ nỗ lực, 2 biến rectColumn1 và rectColumn2 là thông số kỹ thuật 2 hình chữ nhật của cột (mỗi cột có phần trên và phần dưới). Dòng if bên phía trong vòng lặp for nhằm khám nghiệm coi chyên có va vào 1 trong các 2 phần cột hay là không. Hàm rectCollision được dùng làm khám nghiệm sự va đụng giữa chlặng cùng một phần cột. Nếu chyên đụng vào một trong 2 phần cột thì hàm isGameOver trả về giá trị True.

Dòng if bên dưới vòng for dùng làm kiểm soát thêm ngôi trường vừa lòng chim đụng khu đất hoặc cất cánh quá cao. Dòng này cũng dễ dàng thôi!

Vậy là chúng ta đang có một hàm để tìm hiểu cơ hội như thế nào thì gameover. Hãy kiểm soát buổi giao lưu của hàm này nhe! Các bạn hãy thêm đoạn code này vào trong tầm lặp game.

if isGameOver(bird, columns) == True: pygame.quit() sys.exit()Đoạn này nhìn vào thì cũng hiểu ngay lập tức. Lúc khám nghiệm thấy gameover thì kết thúc game luôn. Các bạn từ chạy test nhé!

Vậy là họ vẫn xong xuôi phần giải pháp xử lý va đụng rồi. Tiếp theo chúng ta vẫn tra cứu cách tính điểm vào game nhe!

Tính điểm

Trong game, giả dụ bé chim đi sang 1 cột thì sẽ tiến hành cộng thêm điểm. Vậy làm thế nào để hiểu chyên ổn đi qua 1 cột?? Trong phần trước, chúng ta vẫn tất cả hàmrectCollision để chất vấn sự va đụng của 2 hình chữ nhật. Vì vậy, chúng ta có thể tận dụng hàm này bằng cách tạo một hình chữ nhật phía sau cột, tạm thời Điện thoại tư vấn là "hình chữ nhật tính điểm", nếu như chlặng chạm vào hình chữ nhật đó thì đang cộng thêm điểm. Các bạn cũng có thể coi hình minch hoạ tiếp sau đây.

*

Các các bạn sẽ sản xuất một class Score nlỗi dưới. Nhìn nó có vẻ tinh vi đấy, bản thân đã lý giải sau.

class Score(): def __init__(self): self.score = 0 self.addScore = True def draw(self): font = pygame.phông.SysFont("consolas", 40) scoreSuface = fonts.render(str(self.score), True, (0, 0, 0)) textSize = scoreSuface.get_size() DISPLAYSURF.blit(scoreSuface, (int((WINDOWWIDTH - textSize<0>)/2), 100)) def update(self, bird, columns): collision = False for i in range(3): rectColumn = <0> + columns.width, columns.ls<1>, 1, columns.blank> rectBird = if rectCollision(rectBird, rectColumn) == True: collision = True break if collision == True: if self.addScore == True: self.score += 1 self.addScore = False else: self.addScore = TrueTrong hàm main, chúng ta lưu giữ tạo nên thêm biến score với Call 2 hàm của chính nó trong tầm lặp game.

def main(): bird = Bird() columns = Columns() score = Score() while True: mouseCliông chồng = False for event in pygame.sự kiện.get(): if sự kiện.type == QUIT: pygame.quit() sys.exit() if sự kiện.type == MOUSEBUTTONDOWN: mouseClichồng = True DISPLAYSURF.blit(BACKGROUND, (0, 0)) columns.draw() columns.update() bird.draw() bird.update(mouseClick) score.draw() score.update(bird, columns) if isGameOver(bird, columns) == True: pygame.quit() sys.exit() pygame.display.update() fpsClock.tick(FPS)Xong rồi, bây chừ bọn họ thuộc quan sát lại class Score. Trong hàm __init__ có 2 phát triển thành, self.score chính là số điểm, còn trở nên self.addScore dùng để khám nghiệm coi có được thêm vào đó điểm hay là không.

Tại sao lại có biến chuyển self.addScore cùng phát triển thành này sử dụng như thế nào?? Trong game, Lúc chim đi qua cột sẽ va vào "hình chữ nhật tính điểm" tương đối nhiều lần. Tuy nhiên, những lần chyên qua cột chỉ tính một điểm thôi, chính vì như thế phát triển thành này để chúng ta cộng thêm điểm vào lần chạm thứ nhất.

Điểm chỉ được cùng Lúc self.addScore là True. Ban đầu thì self.addScore = True, Khi chyên va vào "hình chữ nhật tính điểm" thứ 1 thì sẽ được cộng điểm vàself.addScore dấn quý giá False. Nếu chlặng đi qua ngoài "hình chữ nhật tính điểm", có nghĩa là ko đụng vào nó nữa thìself.addScore nhấn cực hiếm True nhằm sẵn sàng cộng điểm mang đến lần đụng tiếp sau. Nếu các bạn thấy rối quá thì hoàn toàn có thể xem hình bên dưới nhe!

*

Hàm draw vào class Score chỉ dùng để làm vẽ điểm thôi, không có gì tinh vi buộc phải mình không phân tích và lý giải hàm này.

Các chúng ta để ý hàm update nhé. Biến collision để kiểm soát coi chlặng có chạm "hình chữ nhật tính điểm" hay không. Cũng giống như nlỗi hàm isGameOver, tất cả một vòng for nhằm chạy qua 3 cột, biến chuyển rectColumn đó là "hình chữ nhật tính điểm", rectBird là hình chữ nhật của chyên ổn, vẫn cần sử dụng hàm rectCollision để kiểm tra va đụng.

Những loại code dưới là nhằm thêm vào đó điểm cho vươn lên là self.score và kiểm soát và điều chỉnh biến hóa self.addScore mang đến phù hợp. Các mẫu code hoạt động theo nlỗi phần phân tích và lý giải làm việc bên trên.

Vậy là bọn họ đã gần hoàn chỉnh game Flappy Bird rồi. Các bạn chạy demo để khám nghiệm nhé. Nếu thấy khó khăn nhằm kiểm tra thì rất có thể điều chỉnh những hằng số nhé (tăng độ cao khoảng trống, giảm vận tốc cột ...). Nếu thấy ok rồi thì hãy sang phần sau cùng nào!

Tạo những màn mang đến game với hoàn hảo game

Nhỏng chúng ta đang thấy thì game của bọn họ vẫn không hoàn hảo. ví dụ như nhỏng Lúc bắt đầu game thì cần phải có 1 màn hình bắt đầu, sau khi Click chuột thì mới có thể vào chơi. Sau lúc gamover thì cũng cần tất cả màn hình gameover rồi có thể mang đến nghịch lại ví dụ điển hình. Bây tiếng họ cùng chế tạo những màn như vậy nhé.

Chúng ta sẽ tạo nên 3 phần giản thôi: bắt đầu game, đùa, gameover. Chúng ta sẽ viết 3 hàm khớp ứng là gameStart, gamePlay, gameOver.

gamePlay

Thực chất thì mẫu vòng lặp game chúng ta code từ trước mang đến giờ là của màn gamePlay thôi. Chúng ta sẽ tạo hàm gamePlahệt như sau:

def gamePlay(bird, columns, score): bird.__init__() bird.speed = SPEEDFLY columns.__init__() score.__init__() while True: mouseCliông chồng = False for sự kiện in pygame.event.get(): if sự kiện.type == QUIT: pygame.quit() sys.exit() if sự kiện.type == MOUSEBUTTONDOWN: mouseClick = True DISPLAYSURF.blit(BACKGROUND, (0, 0)) columns.draw() columns.update() bird.draw() bird.update(mouseClick) score.draw() score.update(bird, columns) if isGameOver(bird, columns) == True: return pygame.display.update() fpsClochồng.tick(FPS)Các bạn chỉnh lại hàm main nlỗi sau:

def main(): bird = Bird() columns = Columns() score = Score() while True: gamePlay(bird, columns, score)Khi chạy hàm gamePlay thì các quý hiếm của bird, columns, score sẽ tiến hành đặt lại bởi câu hỏi gọi hàm __init__ cùng khu vực nhỏ chlặng thì mang đến nó bay lên 1 dòng. Lúc khám nghiệm thấy gameOver thì kết thúc hàm.

gameStart

Hàm này thì thừa đơn giản và dễ dàng rồi, chỉ vấn đề sắp xếp đầy đủ hình ảnh, mẫu chữ sao cho bắt mắt thôi. Ngoài ra thì họ chỉ việc thêm Việc bắt sự kiện Cliông chồng chuột rồi dứt hàm (đưa thanh lịch gamePlay).

def gameStart(bird): bird.__init__() phông = pygame.fonts.SysFont("consolas", 60) headingSuface = fonts.render("FLAPPY BIRD", True, (255, 0, 0)) headingSize = headingSuface.get_size() phông = pygame.font.SysFont("consolas", 20) commentSuface = font.render("Cliông xã to start", True, (0, 0, 0)) commentSize = commentSuface.get_size() while True: for event in pygame.event.get(): if sự kiện.type == QUIT: pygame.quit() sys.exit() if event.type == MOUSEBUTTONDOWN: return DISPLAYSURF.blit(BACKGROUND, (0, 0)) bird.draw() DISPLAYSURF.blit(headingSuface, (int((WINDOWWIDTH - headingSize<0>)/2), 100)) DISPLAYSURF.blit(commentSuface, (int((WINDOWWIDTH - commentSize<0>)/2), 500)) pygame.display.update() fpsClochồng.tick(FPS)Trong main cũng nhớ call hàm này nhe:

def main(): bird = Bird() columns = Columns() score = Score() while True: gameStart(bird) gamePlay(bird, columns, score)gameOverCác bạn thêm hàm gameOver vào luôn nhe, cũng chỉ là vẽ chữ, vẽ số điểm thôi. Hàm này thì bắt sự kiện nhận phím space nhằm xong hàm.

def gameOver(bird, columns, score): font = pygame.phông.SysFont("consolas", 60) headingSuface = font.render("GAMEOVER", True, (255, 0, 0)) headingSize = headingSuface.get_size() phông = pygame.phông.SysFont("consolas", 20) commentSuface = phông.render("Press "space" khổng lồ replay", True, (0, 0, 0)) commentSize = commentSuface.get_size() phông = pygame.phông.SysFont("consolas", 30) scoreSuface = fonts.render("Score: " + str(score.score), True, (0, 0, 0)) scoreSize = scoreSuface.get_size() while True: for event in pygame.event.get(): if sự kiện.type == QUIT: pygame.quit() sys.exit() if sự kiện.type == KEYUP: if sự kiện.key == K_SPACE: return DISPLAYSURF.blit(BACKGROUND, (0, 0)) columns.draw() bird.draw() DISPLAYSURF.blit(headingSuface, (int((WINDOWWIDTH - headingSize<0>)/2), 100)) DISPLAYSURF.blit(commentSuface, (int((WINDOWWIDTH - commentSize<0>)/2), 500)) DISPLAYSURF.blit(scoreSuface, (int((WINDOWWIDTH - scoreSize<0>)/2), 160)) pygame.display.update() fpsClock.tick(FPS)Xong rồi thì nhớ chỉnh hàm main luôn luôn.

def main(): bird = Bird() columns = Columns() score = Score() while True: gameStart(bird) gamePlay(bird, columns, score) gameOver(bird, columns, score)Thế là ngừng rồi. Code của bọn họ sẽ như thể cùng với đoạn code rất đầy đủ rồi. Các các bạn chạy thử và xem kết quả đó đi!

Kết

Vậy là chúng ta đã kết thúc ngừng game Flappy Bird với pygame. Các bạn cũng có thể thêm hầu hết tính năng lạ (thêm điểm cao, thêm huy chương...) mang đến game thú vui rộng. Bài trả lời mang đến đó là xong rồi. Mình vẫn còn ra những bài bác trả lời tiếp theo về pygame, các bạn lưu giữ đón coi nhe! Tạm biệt và hứa gặp mặt lại!