Game 2D Flappy Bird

     

Chào phần lớn người! Trong bài gợi ý lần này mình vẫn thuộc các bạn tạo thành game Flappy Bird với pygame. Flappy Bird là 1 trong game mà lại phần đông ai cũng biết, cách chơi dễ dàng và đơn giản cùng gần như ai học thiết kế game cũng từng test có tác dụng tựa game này. Không nói lâu năm dòng nữa, bọn họ cùng bắt đầu luôn luôn nha!

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

Đầu tiên, những bạn phải biết cơ bản về pythonpygame. Bạn làm sao không tìm hiểu pygame thì rất có thể xem qua 2 bài bác trả lời cơ bạn dạng của 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 rất nhiều mối cung cấp khác nhé. Bài này hơi nhiều năm buộc phải chúng ta phải nỗ lực theo dõi. Để có rượu cồn lực thì chúng ta cùng coi trước thành quả này làm được vào bài này nhe!

Các bạn sở hữu source code khá đầy đủ tại đây.

Bạn đang xem: Game 2d flappy bird

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

Các bạn hãy tạo ra thỏng mục tất cả cấu trúc như sau:

*

flappyBird.py là file code chủ yếu của bọn họ. Thỏng mục img chứa hầu như hình hình họa vào game.

Các hình hình ảnh bản thân rước ở chỗ này với bản thân tất cả chỉnh lại mang đến cân xứng với game.

Các hình hình ảnh sẽ bao gồm trong phần source code đầy đủ rồi. Các các bạn ghi nhớ tải về cùng chế tạo.

bởi vậy là chúng ta sẽ sẵn sàng xong mọi đồ vật quan trọng. Bây tiếng chúng ta msinh hoạt fileflappyBird.py rồi code thôi!

Tạo hành lang cửa số game và vẽ nền mang đến game

Phần này khá đơn giản và dễ dàng yêu cầu mình đi nhanh qua nhe. Mọi sản phẩm vào này tôi đã trình làng sống gần như bài trước rồi.

À cơ mà bởi vì mình đang code mỗi bước yêu cầu đôi lúc phần đa mẫu code tất cả sự biệt lập đối với đoạn code không thiếu 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() fpsClochồng.tick(FPS)if __name__ == "__main__": main()

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

Tạo bé chlặng cùng vẽ lên cửa sổỞ đầu đoạn code, bọn họ sẽ tạo một số hằng số để tiện thể cho Việc đổi khác, đánh giá. Các chúng ta tìm hiểu thêm ở code không thiếu thốn 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.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 đã và đang đọc sứ mệnh của các vươn lên là trong __init__ rồi! Các bạn có thể coi hình dưới

*

Các bạn phải chăm chú self.tốc độ là vận tốc bay của chyên. Cái này mình đã nói ở đoạn sau.

Trong hàm main tạo ra thêm một biến chuyển bird và điện thoại tư vấn hàm bird.draw() trong tầm lặp game.

def main(): bird = Bird() while True: for event 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 chim đã được vẽ lên màn hình hiển thị. Bây tiếng bọn họ hãy kiếm tìm giải pháp tạo cho bé chyên rơi xuống nhe.

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

Bây tiếng bọn họ hãy code trước rồi bản thân sẽ giải thích sau.

Như bài giải đáp trước, để biến hóa địa điểm của chyên ổn thì rất cần được tất cả thêm hàm update. Các bạn hãy sinh sản hàm update của class Bird nhỏng sau:

def update(self): self.y += self.speed + 0.5*G self.tốc độ += GTrong vòng lặp game các bạn ghi nhớ Điện thoại tư vấn hàm bird.update() sau chiếc 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 thử và xem hiệu quả nhé. Bây giờ chúng ta nên biết phần nhiều gì vẫn xảy ra phía bên trong hàm update.

Nhưng trước hết, các bạn phải biết hồ hết điều cơ bạn dạng về chuyển động rơi từ do. Thực chất, rơi tự do thoải mái là vận động nkhô nóng dần dần đều theo vận tốc trọng trường. Các bạn cần phải biết các phương trình của chuyển động rơi từ bỏ do y = y0+ v0t + 0.5gt2 với v = v0+ gt. Nếu không rõ thì các chúng ta có thể từ khám phá nhe, mình ko nói kỹ tại đây.

*

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

Chuyển đụng cất cánh lên Lúc Cliông xã chuột

Để tạo nên hoạt động cất cánh lên Lúc Click loài chuột thì rất cần phải bắt sự kiện Click chuột cùng đổi khác tốc độ của chyên. Tốc độ cất cánh lên tất yếu cần bao gồm quý hiếm âm, trong code của chúng ta vẫn một hằng số là SPEEDFLY=-8.

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

def update(self, mouseClick): self.y += self.speed + 0.5*G self.speed += G if mouseCliông chồng == True: self.tốc độ = SPEEDFLYCó thêm 1 tsi mê số là mouseClick, đổi thay này dùng để soát sổ Việc Cliông xã chuột.

Dòng if được sản xuất khá dễ dàng. Nếu Cliông chồng chuột thì đặt vận tốc chlặng là SPEEDFLY.

Bây giờ, vấn đề đề nghị có tác dụng là bắt sự khiếu nại Clichồng chuột với truyền vào hàm update, thêm hầu hết mẫu code bên phía trong vòng lặp game như sau:

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)) bird.draw() bird.update(mouseClick) pygame.display.update() fpsCloông chồng.tick(FPS)Biến mouseClichồng để khám nghiệm sự kiện Click chuột và truyền vào hàm update. Trong vòng forthì thực hiện việc bắt sự khiếu nại MOUSEBUTTONDOWN, sự kiện này xảy ra lúc nút ít con chuột được ấn vào.

Vậy là bọn họ đang hoàn thành xong phần của nhỏ chim. Trước Khi sang phần new, chúng ta bắt buộc quan sát lại đoạn code, suy nghĩ lại những chiếc code coi bọn chúng có công dụng gì, vận động ra làm sao. Nếu làm rõ rất nhiều sản phẩm rồi thì bọn họ thuộc sang trọng phần tiếp sau, sẽ là chế tạo các chiếc cột.

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

Tạo cột

Như đã biết thì sẽ sở hữu các phần cột bên trên cùng bên dưới. lúc bản thân kể đến 1 loại "cột" thì các bạn hãy phát âm là tất cả cả 2 phần cùng khoảng không giữa 2 phần nhe!

Bây giờ, các bạn hãy gõ code trước đi. Mình sẽ giải thích phần đông đoạn code đó sau.

Thêm một số 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ư như phần nhỏ chim nhe. Tạo biến đổi 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 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() fpsClock.tick(FPS)Rồi hiện thời thì nên chạy demo và xem thành quả. Sau kia, cho phần mày mò code thôi!

Bây giờ hãy nhìn lại class Columns, vào hàm __init__ gồm khởi sản xuất 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 1 phần cột.self.blank là chiều cao khoảng trống thân 2 phần cột.self.distance là khoảng cách giữa 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 quý phái trái).self.surface là surface của một phần cột.self.ls là 1 trong những list cất báo cáo về vị trí cột với vị trí khoảng chừng trống. Cụ thể: 1 phần tử trong list chđọng thông báo của một cột, thành phần đó gồm dạng , trong các 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 trước 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ẽ tiếp giáp lề bên trái, có nghĩa là x = 0. Các cột tiếp sau cách nhau một khoảng bằng self.distance.Biến y là địa điểm của khoảng trống. Biến này dìm cực hiếm random để tạo ra đều khoảng không có địa chỉ 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, từng cột có 2 phần đề nghị gồm 2 mẫu nhằm vẽ phần trên cùng phần bên dưới.

Bởi vậy là họ sẽ tạo được các cột, hiện thời hãy quý phái phần tiếp sau để mày mò phương pháp mang đến các chiếc cột dịch chuyển.

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

Nlỗi hay lệ, họ vẫn thêm hàm update đến class Columns với sinh sống vòng lặp game thì Hotline hàm columns.update() sau mẫu columns.draw(). Ý tưởng là cần sử dụng vòng lặp for để lặp qua 3 cột, so với mỗi cột thì hoành độ của nó sẽ sụt giảm. Nghe có vẻ dễ dàng nhỉ.

Xem thêm: Thuốc Hoạt Huyết Dưỡng Não Traphaco Có Tốt Không ? Giá Bao Nhiêu?

def update(self): for i in range(3): self.ls<0> -= self.speedChạy thử để xem kết quả nhé. Những dòng cột đã di chuyển quý phái trái rồi.

Tuy nhiên, tất cả một sự việc nghỉ ngơi đó là chúng ta bắt đầu chỉ tất cả 3 cột, trong những lúc đó game cần được có rất nhiều (nếu như không mong mỏi nói là vô hạn) cột. Các bạn cũng có thể tạo thiệt nhiều phần tử cho self.ls. Tuy nhiên, vấn đề này nghe có vẻ như ko công dụng 1 chút nào. Hãy nghĩ ra 1 ý tưởng bắt đầu làm sao, những cột đang dịch chuyển sang trọng trái và lúc 1 cột như thế nào đó đi ra khỏi màn hình hiển thị thì nó không thể tác dụng gì nữa, bạn cũng có thể xoá mẫu cột đó đi với chế tạo ra một cái cột khác thông suốt theo. Theo vậy thì self.ls sẽ vẫn chỉ tất cả 3 phần tử, khi tới đầy đủ thời gian thích hợp sẽ có 1 cột bị xoá đi cùng 1 cột được thêm vào.

*

Nếu có ý 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 cấp dưỡng để bình chọn xem cột tất cả đi ra ngoài màn hình hay chưa.

Dòng self.ls.pop(0) nhằm xoá cột ở phần trước tiên.

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

y là tung độ khoảng trống của cột cung cấp, cũng đem giá chỉ trị random giống như những cột không giống.

Các các bạn hãy chạy thử và xem công dụng nhe.

À mà lại thời điểm nãy bản thân code mẫu cột thứ nhất nghỉ ngơi ngay cạnh lề phía bên trái để nhân thể theo dõi thôi. Thực tế, vào game những cột vẫn ở bên yêu cầu màn hình rồi bắt đầu di chuyển hẳn qua. Nên ở vòng lặp for vào hàm __init__ các bạn sửa lại chiếc x=i*self.distance thành x= WINDOWWIDTH +i*self.distance nhằm cột trước tiên nằm sát đề xuất màn hình

do vậy là chúng ta đang hoàn thành hoàn thành phần cột rồi! Các các bạn xem lại code nhằm chuẩn bị sang trọng phần tiếp sau nhé!

Xử lý va chạm

Va va thân nhị hình chữ nhật

Xử lý va chạm là một phần không thể thiếu vào thiết kế game. Trong Flappy Bird sẽ có sự va chạm thân chlặng cùng cột, chính vì như thế họ nên biết rõ lúc nào chyên vẫn va chạm với cột, trường đoản cú đó viết rất nhiều đoạn code nhằm cách xử trí. Để đến dễ dàng thì hãy xem chyên ổn là một trong những hình chữ nhật, một phần của cột (trên hoặc dưới) là 1 trong hình chữ nhật. Chúng ta nên viết một hàm để kiểm tra xem nhì hình chữ nhật tất cả va chạm với nhau hay không. Hàm phải viết sẽ có 2 tđắm đuối số truyền vào là 2 danh mục chứa gần như 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 rất dễ dàng, truyền 2 "hình chữ nhật" vào hàm, hàm trả về True giả dụ 2 hình chữ nhật chạm nhau, trở lại trả về False. Hàm này hoạt động gắng như thế nào thì chúng ta từ gọi code rồi tìm hiểu nhe, mình sẽ có được một bài xích riêng biệt để nói về xử trí va va.

Kiểm tra gameover

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

Vậy là bọn họ đang tất cả một hàm để tìm hiểu thời gian như thế nào thì gameover. Hãy kiểm soát 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 chú ý vào thì cũng gọi ngay. Khi soát sổ thấy gameover thì ngừng game luôn luôn. Các chúng ta tự chạy demo nhé!

Vậy là chúng ta đã xong phần xử trí va va rồi. Tiếp theo chúng ta sẽ search cách tính điểm trong game nhe!

Tính điểm

Trong game, nếu bé chim đi qua một cột thì sẽ tiến hành thêm vào đó điểm. Vậy làm sao để tìm hiểu chim đi sang 1 cột?? Trong phần trước, chúng ta đang gồm hàmrectCollision để soát sổ 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 chế tạo một hình chữ nhật phía sau cột, tạm Hotline là "hình chữ nhật tính điểm", nếu như chlặng đụng vào hình chữ nhật đó thì đang cộng thêm điểm. Các chúng ta có thể coi hình minh hoạ tiếp sau đây.

*

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

class Score(): def __init__(self): self.score = 0 self.addScore = True def draw(self): phông = pygame.font.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 thành thêm biến hóa score và gọi 2 hàm của chính nó trong vòng lặp game.

def main(): bird = Bird() columns = Columns() score = Score() while True: mouseClichồ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: mouseCliông xã = 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() fpsCloông xã.tick(FPS)Xong rồi, bây giờ bọn họ thuộc chú ý lại class Score. Trong hàm __init__ gồm 2 biến, self.score đó là số điểm, còn biến hóa self.addScore dùng làm kiểm tra xem dành được cộng thêm điểm hay là không.

Tại sao lại có đổi thay self.addScore với biến này thực hiện như thế nào?? Trong game, khi chlặng trải qua cột đang đụng vào "hình chữ nhật tính điểm" không hề ít lần. Tuy nhiên, mỗi lần chyên qua cột chỉ tính 1 điều thôi, chính vì như thế đổi thay này nhằm chúng ta cộng thêm điểm vào lần chạm trước tiên.

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

*

Hàm draw vào class Score chỉ dùng để vẽ điểm thôi, không tồn tại gì tinh vi cần mình ko lý giải hàm này.

Các các bạn để ý hàm update nhé. Biến collision để bình chọn coi chlặng tất cả chạm "hình chữ nhật tính điểm" hay không. Cũng tương tự như nlỗi hàm isGameOver, tất cả một vòng for nhằm chạy qua 3 cột, biế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 va.

Những cái code bên dưới là để cộng thêm điểm đến trở nên self.score và điều chỉnh biến đổi self.addScore cho cân xứng. Các cái code vận động theo nhỏng phần phân tích và lý giải sinh sống bên trên.

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

Tạo các màn mang lại game với hoàn hảo game

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

Chúng ta sẽ tạo 3 phần giản thôi: bước đầu game, nghịch, gameover. Chúng ta đang viết 3 hàm tương xứng là gameStart, gamePlay, gameOver.

gamePlay

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

def gamePlay(bird, columns, score): bird.__init__() bird.speed = SPEEDFLY columns.__init__() score.__init__() while True: mouseCliông xã = False for sự kiện in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() if sự kiện.type == MOUSEBUTTONDOWN: mouseCliông chồ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: 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)lúc chạy hàm gamePlay thì các quý giá của bird, columns, score sẽ được đặt lại bởi câu hỏi gọi hàm __init__ và khu vực nhỏ chyên ổn thì cho nó cất cánh lên 1 loại. lúc đánh giá thấy gameOver thì xong hàm.

gameStart

Hàm này thì vượt dễ dàng và đơn giản rồi, chỉ vấn đề sắp xếp số đông hình hình họa, dòng chữ làm thế nào để cho đẹp mắt thôi. Trong khi thì họ chỉ việc thêm Việc bắt sự kiện Clichồng chuột rồi ngừng hàm (đưa sang trọng gamePlay).

def gameStart(bird): bird.__init__() fonts = pygame.fonts.SysFont("consolas", 60) headingSuface = phông.render("FLAPPY BIRD", True, (255, 0, 0)) headingSize = headingSuface.get_size() fonts = pygame.font.SysFont("consolas", 20) commentSuface = phông.render("Clichồng khổng lồ start", True, (0, 0, 0)) commentSize = commentSuface.get_size() while True: for sự kiện in pygame.event.get(): if event.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() fpsCloông chồng.tick(FPS)Trong main cũng ghi 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 chúng ta thêm hàm gameOver vào luôn nhe, cũng chỉ với vẽ chữ, vẽ số điểm thôi. Hàm này thì bắt sự khiếu nại nhận phím space để xong hàm.

Xem thêm: (Kèm Quà) Kem Uni Có Tốt Không ? Mỹ Phẩm Uni Beautiful

def gameOver(bird, columns, score): fonts = pygame.font.SysFont("consolas", 60) headingSuface = fonts.render("GAMEOVER", True, (255, 0, 0)) headingSize = headingSuface.get_size() font = pygame.fonts.SysFont("consolas", 20) commentSuface = font.render("Press "space" to replay", True, (0, 0, 0)) commentSize = commentSuface.get_size() fonts = pygame.fonts.SysFont("consolas", 30) scoreSuface = fonts.render("Score: " + str(score.score), True, (0, 0, 0)) scoreSize = scoreSuface.get_size() while True: for sự kiện in pygame.sự kiện.get(): if event.type == QUIT: pygame.quit() sys.exit() if event.type == KEYUP: if event.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() fpsClochồng.tick(FPS)Xong rồi thì ghi 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 rồi. Code của họ vẫn tương đương với đoạn code khá đầy đủ rồi. Các bạn chạy test với coi thành quả đi!

Kết

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