Hướng Dẫn Làm Game Flappy Bird

 - 

Chào hầu như người! Trong bài bác giải đáp lần này mình vẫn cùng các bạn tạo nên game Flappy Bird với pygame. Flappy Bird là một game nhưng phần lớn người nào cũng biết, cách chơi dễ dàng và đơn giản cùng gần như là ai học tập xây dựng 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 thuộc bắt đầu luôn nha!

Kiến thức căn uống bản

Trước hết, những bạn phải biết cơ bạn dạng về python cùng pygame. Bạn nào chưa tìm hiểu pygame thì hoàn toàn có thể xem qua 2 bài xích gợi ý cơ phiên bản của chính bản thân mình (phần 1, phần 2)hoặc rất có thể học tập bên trên hầu hết mối cung cấp khác nhé. Bài này hơi dài phải chúng ta đề xuất cố gắng theo dõi và quan sát. Để có cồn lực thì họ cùng coi trước thành quả làm được vào bài này nhe!

Các bạn sở hữu source code không hề thiếu trên đây.

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

Tạo tlỗi mục với tệp tin mang đến game

Các các bạn hãy chế tạo ra tlỗi mục bao gồm cấu tạo nhỏng sau:

*

flappyBird.py là file code thiết yếu của họ. Thỏng mục img đựng số đông hình hình ảnh trong game.

Các hình hình ảnh bản thân mang tại đây với mình có chỉnh lại đến cân xứng với game.

Các 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ữ cài đặt về và cung ứng.

bởi thế là chúng ta sẽ chuẩn bị hoàn thành phần đa sản phẩm cần thiết. Bây giờ các bạn msống fileflappyBird.py rồi code thôi!

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

Phần này hơi đơn giản buộc phải bản thân đi nkhô cứng qua nhe. Mọi thứ trong này tôi đã giới thiệu sinh hoạt phần nhiều bài trước rồi.

À mà do mình đang code từng bước một yêu cầu đôi khi phần đa mẫu code bao gồm sự khác hoàn toàn đối với đoạn code vừa đủ 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 event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() DISPLAYSURF.blit(BACKGROUND, (0, 0)) pygame.display.update() fpsClock.tick(FPS)if __name__ == "__main__": main()

Tạo nhỏ chlặng với điểu khiển nó

Tạo con chyên và vẽ lên cửa ngõ sổỞ đầu đoạn code, chúng ta sẽ tạo nên một số hằng số để luôn tiện mang lại Việc biến đổi, chất vấn. Các các bạn tìm hiểu thêm ở code khá đầy đủ nhe!

BIRDWIDTH = 60BIRDHEIGHT = 45G = 0.5SPEEDFLY = -8BIRDIMG = pygame.image.load("img/bird.png")Tạo class Bird nhỏng 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.tốc độ = 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 đã hiểu mục đích của các vươn lên là vào __init__ rồi! Các chúng ta cũng có thể coi hình dưới

*

Các bạn cần để ý self.tốc độ là vận tốc bay của chyên ổn. Cái này bản thân sẽ nói ở trong phần sau.

Trong hàm main tạo thành thêm một đổi thay bird cùng điện thoại tư vấn hàm bird.draw() trong vòng lặp game.

def main(): bird = Bird() while True: for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() DISPLAYSURF.blit(BACKGROUND, (0, 0)) bird.draw() pygame.display.update() fpsClock.tick(FPS)Các các bạn chạy demo nhe. Con chlặng đã có được vẽ lên màn hình hiển thị. Bây giờ đồng hồ bọn họ hãy tra cứu bí quyết làm cho con chyên rơi xuống nhe.

Chuyển rượu cồn rơi tự do thoải mái của chim

Bây giờ đồng hồ bọn họ hãy code trước rồi bản thân vẫn phân tích và lý giải sau.

Nlỗi bài bác hướng dẫn trước, nhằm thay đổi địa chỉ của chlặng thì rất cần phải bao gồm thêm hàm update. Các các bạn hãy tạo hàm update của class Bird như sau:

def update(self): self.y += self.tốc độ + 0.5*G self.tốc độ += GTrong vòng lặp game chúng ta lưu giữ Gọi hàm bird.update() sau mẫu bird.draw()

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() bird.update() pygame.display.update() fpsClochồng.tick(FPS)Chạy demo và xem kết quả nhé. Bây tiếng họ cần biết phần đa gì sẽ xảy ra bên trong hàm update.

Nhưng đầu tiên, những bạn phải biết đầy đủ điều cơ bản về chuyển động rơi từ bỏ do. Thực hóa học, rơi tự do là vận động nhanh khô dần dần đều theo tốc độ trọng trường. Các bạ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 với v = v0+ gt. Nếu chưa rõ thì những bạn có thể từ tò mò nhe, bản thân không nói kỹ ở đây.

*

Trong hàm update họ sẽ tính tung độ(self.y) cùng tốc độ (self.speed) của chyên ứng cùng với từng khung người. Nlỗi chúng ta đang biết, các khung người mở ra giải pháp nhau một khoảng tầm thời gian xác định. Để cho đơn giản và dễ dàng thì đến đa số khoảng thời gian hồ hết bằng 1 và Khi ráng vào phương trình rơi thoải mái sẽ được 2 dòng code bên trên. Trong số đó, G chính là vận tốc trọng trường.

Chuyển cồn bay lên Lúc Cliông chồng chuột

Để tạo được hoạt động bay lên khi Clichồng loài chuột thì rất cần phải bắt sự khiếu nại Click chuột cùng biến hóa tốc độ của chlặng. Tốc độ bay lên tất yếu buộc phải bao gồm quý hiếm âm, trong code của chúng ta đã một hằng số là SPEEDFLY=-8.

Bây giờ rất cần được thêm một trong những thiết bị vào hàm update.

def update(self, mouseClick): self.y += self.tốc độ + 0.5*G self.tốc độ += G if mouseCliông chồng == True: self.tốc độ = SPEEDFLYCó thêm 1 tsay đắm số là mouseClick, biến này dùng để kiểm soát bài toán Cliông chồng chuột.

Dòng if được chế tạo khá đơn giản và dễ dàng. Nếu Clichồng chuột thì đặt tốc độ chlặng là SPEEDFLY.

Bây tiếng, bài toán cần làm là bắt sự khiếu nại Clichồng con chuột và truyền vào hàm update, thêm phần nhiều chiếc code phía bên trong vòng lặp game nlỗi sau:

while True: mouseClick = False for sự kiện in pygame.sự kiện.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 để bình chọn sự khiếu nại Click con chuột cùng truyền vào hàm update. Trong vòng forthì thực hiện bài toán bắt sự khiếu nại MOUSEBUTTONDOWN, sự khiếu nại này xẩy ra Lúc nút ít con chuột được ấn vào.

Vậy là họ đang xong hoàn thành phần của bé chyên ổn. Trước Lúc quý phái phần new, chúng ta phải nhìn lại đoạn code, nghĩ lại các loại code xem chúng tất cả công dụng gì, hoạt động ra sao. Nếu làm rõ các sản phẩm công nghệ rồi thì chúng ta thuộc quý phái phần tiếp theo, chính là tạo nên các chiếc cột.

Tạo cột cùng hoạt động của cột

Tạo cột

Nhỏng vẫn biết thì sẽ sở hữu phần nhiều phần cột bên trên và dưới. Khi bản thân kể tới 1 loại "cột" thì các bạn hãy hiểu là có cả hai phần với khoảng trống giữa 2 phần nhe!

Bây giờ đồng hồ, chúng ta hãy gõ code trước đi. Mình đã phân tích và lý giải rất nhiều đoạn code đó sau.

Thêm một trong những 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ương tự như phần con chlặng nhe. Tạo biến columns, thêm hàm columns.draw() vào vòng lặp game.

def main(): bird = Bird() columns = Columns() while True: mouseCliông chồng = 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)) columns.draw() bird.draw() bird.update(mouseClick) pygame.display.update() fpsCloông xã.tick(FPS)Rồi bây giờ thì nên chạy demo với xem kết quả này. Sau kia, đến phần mày mò code thôi!

Bây giờ hãy quan sát lại class Columns, trong hàm __init__ bao gồm khởi tạo ra một số trong những biến:

self.width là chiều rộng của cột.self.height là độ cao của một phần cột.self.blank là độ cao khoảng trống giữa 2 phần cột.self.distance là khoảng cách thân các cột.self.speed là vận tốc dịch rời của cột (cột đang dịch rời thanh lịch trái).self.surface là surface của 1 phần cột.self.ls là một trong những list chứa báo cáo về địa chỉ cột cùng địa điểm khoảng chừng trống. Cụ thể: 1 phần tử vào danh sách chứ đọng báo cáo của một cột, phần tử kia bao gồm dạng , trong những số ấy 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 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 thứ nhất được vẽ gần cạnh lề phía trái, Có nghĩa là x = 0. Các cột tiếp theo sau bí quyết nhau một khoảng chừng bởi self.distance.Biến y là địa chỉ của khoảng không. Biến này thừa nhận quý giá random để tạo thành những không gian có địa chỉ khác biệt.

*

Bây tiếng hãy coi 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, từng cột tất cả 2 phần phải có 2 chiếc để vẽ phần trên cùng phần dưới.

vì vậy là bọn họ đã tạo nên những cột, bây giờ hãy sang trọng phần tiếp theo sau nhằm mày mò phương pháp mang đến các cái cột di chuyển.

Tạo hoạt động đến cột

Như hay lệ, chúng ta đang thêm hàm update mang đến class Columns và làm việc vòng lặp game thì gọi hàm columns.update() sau dòng columns.draw(). Ý tưởng là cần sử dụng vòng lặp for để lặp qua 3 cột, đối với mỗi cột thì hoành độ của chính nó đã giảm xuống. Nghe dường như đơn giản dễ dàng thất thoát.

Xem thêm: Đồng Nghĩa Của Explore Nghĩa Là Gì ? Nghĩa Của Từ Explored Trong Tiếng Việt

def update(self): for i in range(3): self.ls<0> -= self.speedChạy thử để xem tác dụng nhé. Những loại cột đang di chuyển thanh lịch trái rồi.

Tuy nhiên, có một sự việc làm việc đó là bọn họ mới chỉ có 3 cột, trong những khi đó game rất cần được có rất nhiều (còn nếu như không muốn nói là vô hạn) cột. Các bạn có thể sinh sản thiệt các bộ phận đến self.ls. Tuy nhiên, điều này nghe có vẻ ko hiệu quả 1 chút nào. Hãy nghĩ về ra 1 phát minh new như thế nào, những cột vẫn dịch chuyển lịch sự trái cùng lúc 1 cột nào đó đi thoát khỏi màn hình thì nó không thể tính năng gì nữa, bạn có thể xoá mẫu cột kia đi với sản xuất một cái cột không giống tiếp liền theo. Theo vậy thì self.ls đã vẫn chỉ bao gồm 3 thành phần, lúc đến số đông thời điểm tương thích sẽ có được 1 cột bị xoá đi với 1 cột nhận thêm vào.

*

Nếu bao gồm ý tưởng phát minh 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 thêm vào nhằm bình chọn xem cột bao gồm đi ra ngoài screen hay 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 sản xuất. Cột được thêm vào đã bí quyết cột cuối một khoảng chừng bởi self.distance. Do vừa xoá 1 cột rồi bắt buộc self.ls chỉ còn 2 cột thôi.

y là tung độ khoảng không của cột tiếp tế, cũng rước giá chỉ trị random tựa như các cột không giống.

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

À mà lại thời điểm nãy bản thân code loại cột trước tiên nghỉ ngơi gần kề lề phía trái nhằm tiện thể theo dõi và quan sát thôi. Thực tế, vào game những cột đã nghỉ ngơi mặt phải màn hình hiển thị rồi mới di chuyển hẳn qua. Nên sinh hoạt vòng lặp for trong hàm __init__ chúng ta sửa lại cái x=i*self.distance thành x= WINDOWWIDTH +i*self.distance để cột thứ nhất nằm cạnh sát đề nghị màn hình

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

Xử lý va chạm

Va va giữa hai 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 thiết kế game. Trong Flappy Bird sẽ sở hữu được sự va đụng giữa chyên và cột, chính vì như thế chúng ta cần biết rõ khi nào chim đang va chạm tới cột, từ bỏ kia viết những đoạn code nhằm cách xử lý. Để cho đơn giản dễ dàng thì hãy coi chyên là một trong hình chữ nhật, một phần của cột (bên trên hoặc dưới) là một trong những hình chữ nhật. Chúng ta bắt buộc viết một hàm để đánh giá xem hai hình chữ nhật bao gồm va chạm tới nhau hay là không. Hàm buộc phải viết sẽ có 2 tđê mê số truyền vào là 2 danh sách đựng mọi thông số kỹ thuật hình chữ nhật (hoành độ, tung độ, chiều rộng, chiều cao).

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

Kiểm tra gameover

Như các bạn đã biết, Khi chyên đụng vào cột, va khu đất hoặc là di chuyển không thấp chút nào thoát khỏi screen thì gameover. Ở bên trên họ đã gồm hàm để khám nghiệm sự va đụng giữa 2 hình chữ nhật rồi, chúng ta đang sử dụng hàm kia trong hàm kiểm tra gameover. Các bạn thêm hàm isGameOver phía bên dưới hàm rectCollision nhe. Mình đang lý giải 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 những bạn cũng có thể thấy một vòng lặp for dùng làm chạy qua 3 cột, chlặng va bất kể cột nào cũng gameover. Các bạn coi phần đa loại code bên trong for nhé. Biến rectBird được tạo ra để đựng thông số kỹ thuật hình chữ nhật của chyên. Tương từ bỏ gắng, 2 biến chuyển rectColumn1 và rectColumn2 là thông số 2 hình chữ nhật của cột (mỗi cột bao gồm phần bên trên cùng phần dưới). Dòng if phía bên trong vòng lặp for nhằm chất vấn xem chyên ổn có đụng vào 1 trong những 2 phần cột hay là không. Hàm rectCollision được dùng để chất vấn sự va đụng giữa chyên cùng 1 phần cột. Nếu chlặng đụng vào một trong những 2 phần cột thì hàm isGameOver trả về giá trị True.

Dòng if dưới vòng for dùng làm soát sổ thêm trường vừa lòng chlặng chạm khu đất hoặc cất cánh tương đối cao. Dòng này cũng dễ dàng thôi!

Vậy là bọn họ sẽ bao gồm một hàm để biết thời gian nào thì gameover. Hãy soát sổ hoạt động 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 gọi ngay. khi kiểm soát thấy gameover thì hoàn thành game luôn luôn. Các chúng ta từ bỏ chạy test nhé!

Vậy là họ vẫn xong xuôi phần giải pháp xử lý va chạm rồi. Tiếp theo bọn họ đang kiếm tìm phương pháp tính điểm trong game nhe!

Tính điểm

Trong game, nếu như con chyên đi sang một cột thì sẽ tiến hành thêm vào đó điểm. Vậy làm thế nào để biết chim đi sang một cột?? Trong phần trước, họ sẽ có hàmrectCollision nhằm kiểm soát sự va va của 2 hình chữ nhật. Vì vậy, chúng ta cũng có thể tận dụng hàm này bằng cách tạo thành một hình chữ nhật vùng sau cột, trợ thời hotline là "hình chữ nhật tính điểm", giả dụ chyên ổn đụng vào hình chữ nhật kia thì đã thêm vào đó điểm. Các chúng ta cũng có thể xem hình minh hoạ dưới đây.

*

Các các bạn sẽ tạo ra một class Score nhỏng dưới. Nhìn nó dường như tinh vi đấy, mình đã lý giải sau.

class Score(): def __init__(self): self.score = 0 self.addScore = True def draw(self): phông = pygame.phông.SysFont("consolas", 40) scoreSuface = phông.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, các bạn nhớ tạo thêm đổi mới score và gọi 2 hàm của nó trong khoảng lặp game.

def main(): bird = Bird() columns = Columns() score = Score() while True: mouseClichồng = False for sự kiện in pygame.sự kiện.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: pygame.quit() sys.exit() pygame.display.update() fpsClochồng.tick(FPS)Xong rồi, hiện giờ chúng ta cùng quan sát lại class Score. Trong hàm __init__ gồm 2 biến hóa, self.score đó là số điểm, còn vươn lên là self.addScore dùng để làm kiểm soát xem giành được cộng thêm điểm hay không.

Tại sao lại sở hữu đổi mới self.addScore và biến đổi này áp dụng như vậy nào?? Trong game, lúc chlặng trải qua cột đã chạm vào "hình chữ nhật tính điểm" rất nhiều lần. Tuy nhiên, mỗi lần chlặng qua cột chỉ tính một điểm thôi, chính vì vậy thay đổi này nhằm họ cộng thêm điểm vào lần chạm thứ nhất.

Điểm chỉ được cùng khi self.addScore là True. Ban đầu thì self.addScore = True, Lúc chyên chạm vào "hình chữ nhật tính điểm" trước tiên thì sẽ được cộng điểm vàself.addScore nhận quý giá False. Nếu chlặng đi qua ngoài "hình chữ nhật tính điểm", tức là ko chạm vào nó nữa thìself.addScore dìm quý giá True để chuẩn bị cộng điểm mang lại lần chạm tiếp theo. Nếu chúng ta thấy rối thừa thì có thể coi hình bên dưới nhe!

*

Hàm draw vào class Score chỉ dùng để vẽ điểm thôi, không có gì phức hợp đề nghị mình ko lý giải hàm này.

Các bạn chú ý hàm update nhé. Biến collision nhằm soát sổ xem chim có đụng "hình chữ nhật tính điểm" hay là không. Cũng tương tự nlỗi hàm isGameOver, gồm 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 sử dụng hàm rectCollision nhằm khám nghiệm va đụng.

Những loại code bên dưới là nhằm thêm vào đó điểm mang lại trở nên self.score cùng điều chỉnh biến hóa self.addScore mang lại phù hợp. Các loại code vận động theo như phần giải thích ngơi nghỉ bên trên.

Vậy là bọn họ đã được gần hoàn chỉnh game Flappy Bird rồi. Các chúng ta chạy test để đánh giá nhé. Nếu thấy khó để kiểm tra thì hoàn toàn có thể điều chỉnh những hằng số nhé (tăng chiều cao không gian, 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 cho game cùng hoàn hảo game

Nhỏng chúng ta đang thấy thì game của chúng ta vẫn chưa hoàn chỉnh. Ví dụ như lúc bước đầu game thì cần phải có 1 màn hình bước đầu, sau khi Clichồng con chuột thì mới vào chơi. Sau Khi gamover thì cũng yêu cầu có screen gameover rồi hoàn toàn có thể cho nghịch lại chẳng hạn. Bây tiếng bọn họ thuộc sinh sản những màn như thế nhé.

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

gamePlay

Thực chất thì cái vòng lặp game họ code từ trước mang đến tiếng là của màn gamePlay thôi. Chúng ta sẽ tạo hàm gamePlagiống như sau:

def gamePlay(bird, columns, score): bird.__init__() bird.speed = SPEEDFLY columns.__init__() score.__init__() while True: mouseClick = False for sự kiện in pygame.sự kiện.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() fpsCloông xã.tick(FPS)Các bạn chỉnh lại hàm main như sau:

def main(): bird = Bird() columns = Columns() score = Score() while True: gamePlay(bird, columns, score)khi chạy hàm gamePlay thì những cực hiếm của bird, columns, score sẽ tiến hành đặt lại bởi bài toán Call hàm __init__ và vị trí con chim thì cho nó cất cánh lên 1 mẫu. Khi soát sổ thấy gameOver thì hoàn thành hàm.

gameStart

Hàm này thì vượt đơn giản rồi, chỉ bài toán bố trí gần như hình hình ảnh, loại chữ làm sao cho bắt mắt thôi. Bên cạnh đó thì chúng ta chỉ cần thêm bài toán bắt sự khiếu nại Cliông xã chuột rồi kết thúc hàm (gửi quý phái gamePlay).

def gameStart(bird): bird.__init__() phông = pygame.phông.SysFont("consolas", 60) headingSuface = fonts.render("FLAPPY BIRD", True, (255, 0, 0)) headingSize = headingSuface.get_size() phông = pygame.phông.SysFont("consolas", 20) commentSuface = fonts.render("Cliông xã to start", True, (0, 0, 0)) commentSize = commentSuface.get_size() while True: for event in pygame.sự kiện.get(): if sự kiện.type == QUIT: pygame.quit() sys.exit() if sự kiện.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() fpsCloông xã.tick(FPS)Trong main cũng nhớ Hotline hàm này nhe:

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

Xem thêm: Chơi Gì Ở Buôn Ma Thuột Check, Du Lịch Buôn Ma Thuột: Cẩm Nang Từ A Đến Z

def gameOver(bird, columns, score): font = pygame.fonts.SysFont("consolas", 60) headingSuface = font.render("GAMEOVER", True, (255, 0, 0)) headingSize = headingSuface.get_size() fonts = pygame.phông.SysFont("consolas", 20) commentSuface = fonts.render("Press "space" lớn replay", True, (0, 0, 0)) commentSize = commentSuface.get_size() fonts = pygame.phông.SysFont("consolas", 30) scoreSuface = font.render("Score: " + str(score.score), True, (0, 0, 0)) scoreSize = scoreSuface.get_size() while True: for sự kiện in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() if event.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à xong xuôi rồi. Code của chúng ta sẽ giống như cùng với đoạn code không hề thiếu rồi. Các chúng ta chạy demo cùng xem thành quả đó đi!

Kết

Vậy là chúng ta sẽ xong xuôi ngừng game Flappy Bird với pygame. Các bạn cũng có thể thêm mọi tính năng lạ (thêm điểm trên cao, thêm huy cmùi hương...) đến game thú vị hơn. Bài lý giải cho đấy là xong rồi. Mình vẫn còn ra phần đa bài lý giải tiếp theo sau về pygame, các bạn lưu giữ đón coi nhe! Tạm biệt cùng hứa hẹn gặp gỡ lại!