Hướng dẫn thiết kế game flappybird

Chào mọi người! Trong bài bác trả lời lần này mình đang cùng chúng ta tạo ra game Flappy Bird với pygame. Flappy Bird là một trong game nhưng mà hầu hết ai ai cũng biết, lối chơi dễ dàng và gần như ai học tập thiết kế game cũng từng test làm cho tựa game này. Không nói lâu năm mẫu nữa, họ cùng bắt đầu 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ơ phiên bản về python với pygame. quý khách như thế nào chưa mày mò pygame thì hoàn toàn có thể xem qua 2 bài xích lý giả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 trên những mối cung cấp khác nhé. Bài này hơi lâu năm đề nghị các bạn yêu cầu cố gắng theo dõi và quan sát. Để gồm cồn lực thì họ thuộc xem trước thành quả đó làm cho được trong bài xích này nhe!

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

Bạn đang xem: Hướng dẫn thiết kế game flappybird

Tạo tlỗi mục và file cho game

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

*

flappyBird.py là tệp tin code chính của họ. Tlỗi mục img cất đầy đủ hình hình họa vào game.

Các hình hình họa mình lấy tại chỗ này và bản thân bao gồm 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 không thiếu thốn rồi. Các chúng ta nhớ sở hữu về với cung cấp.

bởi thế là bọn họ đã chuẩn bị hoàn thành đầy đủ thứ quan trọng. Bây giờ chúng ta mlàm việc fileflappyBird.py rồi code thôi!

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

Phần này tương đối dễ dàng đề xuất mình đi nhanh hao qua nhe. Mọi thứ vào này tôi đã giới thiệu sinh sống rất nhiều bài bác trước rồi.

À nhưng bởi mình đang code từng bước buộc phải nhiều khi đầy đủ chiếc code có sự khác biệt đối với đoạn code không hề thiếu nhe!

import pygame, sys, randomfrom pygame.locals import *WINDOWWIDTH = 400WINDOWHEIGHT = 600BACKGROUND = pygame.image.load("img/background.png")pygame.init()FPS = 60fpsClochồ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 sự kiện.type == QUIT: pygame.quit() sys.exit() DISPLAYSURF.blit(BACKGROUND, (0, 0)) pygame.display.update() fpsCloông xã.tick(FPS)if __name__ == "__main__": main()

Tạo con chyên và điểu khiển nó

Tạo nhỏ chyên ổn với vẽ lên cửa sổỞ đầu đoạn code, chúng ta sẽ tạo một số hằng số để tiện thể mang lại vấn đề đổi khác, chất vấn. Các bạn tìm hiểu thêm nghỉ ngơi code vừa đủ 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ẽ chúng ta cũng đã đọc mục đích của các thay đổi vào __init__ rồi! Các bạn cũng có thể xem hình dưới

*

Các bạn cần chăm chú self.speed là vận tốc bay của chyên. Cái này bản thân đang nói ở vị trí sau.

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

def main(): bird = Bird() 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() pygame.display.update() fpsCloông xã.tick(FPS)Các bạn chạy demo nhe. Con chyên đã làm được vẽ lên screen. Bây tiếng họ hãy search phương pháp làm cho bé chim rơi xuống nhe.

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

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

Như bài bác gợi ý trước, để thay đổi vị trí của chlặng thì cần được tất cả 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.speed + 0.5*G self.speed += GTrong vòng lặp game các bạn ghi nhớ Gọi hàm bird.update() sau mẫu 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() fpsClochồng.tick(FPS)Chạy test và xem kết quả nhé. Bây tiếng bọn họ cần phải biết hầu hết gì đang xảy ra bên trong hàm update.

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

*

Trong hàm update họ và tính tung độ(self.y) với tốc độ (self.speed) của chlặng ứng với từng khung hình. Nhỏng chúng ta sẽ biết, những khung hình xuất hiện phương pháp nhau một khoảng thời hạn khẳng định. Để đến đơn giản thì mang lại rất nhiều khoảng thời gian hồ hết bởi 1 cùng lúc cụ vào phương thơm trình rơi tự do sẽ tiến hành 2 dòng code bên trên. Trong số đó, G đó là vận tốc trọng trường.

Chuyển đụng bay lên khi Cliông xã chuột

Để tạo được hoạt động bay lên khi Click con chuột thì rất cần phải bắt sự khiếu nại Clichồng chuột cùng thay đổi tốc độ của chyên ổn. Tốc độ bay lên tất yếu bắt buộc có quý giá âm, trong code của họ vẫn một hằng số là SPEEDFLY=-8.

Bây tiếng rất cần phải thêm một vài lắp thêm vào hàm update.

def update(self, mouseClick): self.y += self.tốc độ + 0.5*G self.tốc độ += G if mouseCliông xã == True: self.speed = SPEEDFLYCó thêm một tmê say số là mouseCliông chồng, đổi thay này dùng để làm đánh giá vấn đề Cliông xã loài chuột.

Dòng if được thêm vào hơi đơn giản và dễ dàng. Nếu Clichồng loài chuột thì đặt tốc độ chyên là SPEEDFLY.

Bây giờ, vấn đề nên có tác dụng là bắt sự khiếu nại Cliông chồng loài chuột cùng truyền vào hàm update, thêm hồ hết mẫu code bên trong vòng lặp game như sau:

while True: mouseCliông xã = False for event in pygame.event.get(): if event.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() fpsClochồng.tick(FPS)Biến mouseCliông chồng nhằm chất vấn sự kiện Click chuột cùng truyền vào hàm update. Trong vòng forthì triển khai Việc bắt sự khiếu nại MOUSEBUTTONDOWN, sự khiếu nại này xẩy ra khi nút ít loài chuột được ấn vào.

Vậy là chúng ta vẫn kết thúc dứt phần của con chlặng. Trước lúc sang trọng phần bắt đầu, chúng ta nên quan sát lại đoạn code, nghĩ về lại số đông mẫu code xem bọn chúng gồm tính năng gì, vận động thế nào. Nếu làm rõ đa số sản phẩm công nghệ rồi thì chúng ta thuộc lịch sự phần tiếp theo sau, chính là chế tạo các cái cột.

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

Tạo cột

Nlỗi đã biết thì sẽ sở hữu được phần nhiều phần cột trên và bên dưới. Lúc mình nói đến 1 dòng "cột" thì chúng ta hãy phát âm là có cả hai phần với không gian thân 2 phần nhe!

Bây giờ đồng hồ, các bạn hãy gõ code trước đi. Mình đã phân tích và lý giải đều đoạn code kia 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.speed = 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ự nlỗi phần bé chyên ổn nhe. Tạo trở thành columns, thêm hàm columns.draw() vào vòng lặp game.

def main(): bird = Bird() columns = Columns() while True: mouseClick = False for sự kiện in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() if sự kiện.type == MOUSEBUTTONDOWN: mouseClichồng = True DISPLAYSURF.blit(BACKGROUND, (0, 0)) columns.draw() bird.draw() bird.update(mouseClick) pygame.display.update() fpsClock.tick(FPS)Rồi hiện nay thì hãy chạy demo và coi thành quả. Sau kia, mang lại phần tìm hiểu code thôi!

Bây giờ đồng hồ hãy nhìn lại class Columns, trong hàm __init__ có khởi chế tạo ra một số 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 phần cột.self.blank là độ cao khoảng không thân 2 phần cột.self.distance là khoảng cách giữa những cột.self.tốc độ 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 1 phần cột.self.ls là 1 trong những list chứa công bố về vị trí cột cùng địa chỉ khoảng chừng trống. Cụ thể: một phần tử vào danh sách chứ đọng ban bố của một cột, bộ phận kia tất cả 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 vào __init__ dùng làm chế tác 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ẽ cạnh bên lề phía bên trái, Tức là x = 0. Các cột tiếp theo sau biện pháp nhau một khoảng tầm bằng self.distance.Biến y là địa chỉ của khoảng trống. Biến này dìm giá trị random nhằm sinh sản những không gian gồm vị trí khác biệt.

*

Bây tiếng 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 để vẽ 3 cột, từng cột tất cả 2 phần đề xuất tất cả 2 cái nhằm vẽ phần trên và phần bên dưới.

vì vậy là chúng ta sẽ tạo ra những cột, hiện nay hãy sang trọng phần tiếp sau nhằm tìm hiểu biện pháp cho những cái cột di chuyển.

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

Nhỏng thường lệ, bọn họ đã thêm hàm update mang lại class Columns với nghỉ ngơi vòng lặp game thì điện thoại tư vấn hàm columns.update() sau loại columns.draw(). Ý tưởng là sử dụng vòng lặp for nhằm lặp qua 3 cột, so với từng cột thì hoành độ của nó đang giảm xuống. Nghe dường như dễ dàng thất thoát.

Xem thêm: Tài Liệu Hướng Dẫn Sử Dụng Sap2000 V14, Tài Liệu Hướng Dẫn Sử Dụng Sap 2000 V14

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

Tuy nhiên, tất cả một sự việc làm việc đó là chúng ta new chỉ có 3 cột, trong những lúc đó game cần phải có không ít (còn nếu không ý muốn nói là vô hạn) cột. Các bạn có thể tạo ra thật những phần tử cho self.ls. Tuy nhiên, điều đó nghe có vẻ ko tác dụng một chút nào. Hãy nghĩ ra 1 ý tưởng phát minh new như thế nào, các cột vẫn dịch chuyển sang trái và lúc một cột như thế nào đó đi ra khỏi screen thì nó không còn tác dụng gì nữa, bạn cũng có thể xoá loại cột đó đi cùng chế tác một cái cột khác tiếp nối theo. Theo vậy thì self.ls vẫn vẫn chỉ gồm 3 thành phần, lúc tới các thời điểm tương thích sẽ sở hữu được 1 cột bị xoá đi cùng 1 cột đạt 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 tiếp tế nhằm khám nghiệm xem cột gồm đi ra bên ngoài màn hình xuất xắc không.

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

x là hoành độ cột sản xuất. Cột được tiếp tế sẽ bí quyết cột cuối một khoảng bằng self.distance. Do vừa xoá 1 cột rồi cần self.ls chỉ còn 2 cột thôi.

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

Các các bạn hãy chạy thử cùng coi hiệu quả nhe.

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

Như vậy là chúng ta sẽ xong ngừng phần cột rồi! Các các bạn xem lại code để chuẩn bị thanh lịch phần tiếp sau nhé!

Xử lý va chạm

Va chạm thân hai hình chữ nhật

Xử lý va chạm là một phần luôn luôn phải có vào thiết kế game. Trong Flappy Bird sẽ sở hữu sự va chạm thân chyên và cột, vì vậy họ nên biết rõ khi nào chlặng vẫn va tiếp xúc với cột, trường đoản cú đó viết gần như đoạn code nhằm cách xử lý. Để đến đơn giản và dễ dàng thì nên xem chim là 1 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 những hình chữ nhật. Chúng ta đề nghị viết một hàm để kiểm soát coi hai hình chữ nhật có va tiếp xúc với nhau hay là không. Hàm đề xuất viết sẽ có 2 tsi số truyền vào là 2 danh sách cất hầu như thông số hình chữ nhật (hoành độ, tung độ, chiều rộng, chiều cao).

def rectCollision(rect1, rect2): if rect1<0> Cách áp dụng của hàm này cực kỳ dễ dàng và đơn giản, 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 đụng nhau, ngược trở lại trả về False. Hàm này chuyển động nắm nào thì các bạn từ hiểu code rồi tò mò nhe, mình sẽ sở hữu được một bài bác riêng biệt nhằm nói tới cách xử lý va chạm.

Kiểm tra gameover

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

Dòng if dưới vòng for dùng làm chất vấn thêm trường phù hợp chyên đụng khu đất hoặc cất cánh không hề thấp. Dòng này cũng đơn giản dễ dàng thôi!

Vậy là họ vẫn tất cả một hàm để hiểu lúc nào thì gameover. Hãy kiểm soát hoạt động vui chơi của hàm này nhe! Các bạn hãy thêm đoạn code này vào trong khoảng lặp game.

if isGameOver(bird, columns) == True: pygame.quit() sys.exit()Đoạn này chú ý vào thì cũng hiểu ngay lập tức. khi đánh giá thấy gameover thì hoàn thành game luôn luôn. Các bạn trường đoản cú chạy thử nhé!

Vậy là họ sẽ kết thúc phần cách xử lý va va rồi. Tiếp theo họ đã kiếm tìm phương pháp tính điểm vào game nhe!

Tính điểm

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

*

Các bạn sẽ tạo ra một class Score nlỗi dưới. Nhìn nó dường như tinh vi đấy, bản thân đang giải thích sau.

class Score(): def __init__(self): self.score = 0 self.addScore = True def draw(self): fonts = pygame.font.SysFont("consolas", 40) scoreSuface = font.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 vươn lên là score cùng Call 2 hàm của nó trong tầm 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 event.type == QUIT: pygame.quit() sys.exit() if event.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() fpsCloông chồng.tick(FPS)Xong rồi, hiện thời bọn họ cùng chú ý lại class Score. Trong hàm __init__ bao gồm 2 đổi mới, self.score đó là số điểm, còn đổi mới self.addScore dùng để đánh giá xem giành được thêm vào đó điểm hay là không.

Tại sao lại sở hữu phát triển thành self.addScore cùng vươn lên là này sử dụng như vậy nào?? Trong game, Khi chyên ổn đi qua cột sẽ chạm vào "hình chữ nhật tính điểm" rất nhiều lần. Tuy nhiên, các lần chlặng qua cột chỉ tính 1 điều thôi, vì vậy biến này nhằm họ cộng thêm điểm vào lần chạm đầu tiên.

Điểm chỉ được cùng Lúc self.addScore là True. Ban đầu thì self.addScore = True, Lúc chyên ổn va vào "hình chữ nhật tính điểm" lần đầu tiên thì sẽ được cùng điểm vàself.addScore thừa nhận cực hiếm False. Nếu chyên ổn đi qua khỏ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 mang lại lần chạm tiếp sau. Nếu chúng ta thấy rối quá thì hoàn toàn có thể coi hình 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 đề nghị bản thân ko phân tích và lý giải hàm này.

Các các bạn chú ý hàm update nhé. Biến collision để soát sổ coi chim có đụng "hình chữ nhật tính điểm" hay không. Cũng tương tự nhỏng hàm isGameOver, gồm một vòng for nhằm chạy qua 3 cột, phát triển thành rectColumn chính là "hình chữ nhật tính điểm", rectBird là hình chữ nhật của chim, vẫn cần sử dụng hàm rectCollision nhằm soát sổ va va.

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

Vậy là bọn họ đã gần hoàn hảo game Flappy Bird rồi. Các bạn chạy test nhằm chất vấn nhé. Nếu thấy cực nhọc nhằm kiểm tra thì có thể kiểm soát và điều chỉnh các hằng số nhé (tăng chiều cao khoảng không, bớt tốc độ cột ...). Nếu thấy ok rồi thì hãy lịch sự phần ở đầu cuối nào!

Tạo các màn cho game và hoàn chỉnh game

Như các bạn vẫn thấy thì game của chúng ta vẫn không hoàn hảo. ví dụ như nlỗi khi bắt đầu game thì cần có 1 screen bước đầu, sau khi Cliông chồng loài chuột thì mới có thể vào chơi. Sau Lúc gamover thì cũng bắt buộc bao gồm screen gameover rồi hoàn toàn có thể mang lại nghịch lại ví dụ điển hình. Bây giờ chúng ta thuộc tạo ra những màn như vậy nhé.

Chúng ta sẽ khởi 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 ứng là gameStart, gamePlay, gameOver.

gamePlay

Thực chất thì chiếc vòng lặp game bọn họ code trường đoản cú trước cho 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 event in pygame.event.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: 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ì các quý hiếm của bird, columns, score sẽ được đặt lại bởi việc call hàm __init__ cùng địa điểm nhỏ chyên ổn thì cho nó cất cánh lên 1 chiếc. lúc soát sổ thấy gameOver thì xong xuôi hàm.

gameStart

Hàm này thì thừa dễ dàng rồi, chỉ vấn đề thu xếp đều hình hình họa, cái chữ sao cho đẹp mắt thôi. Bên cạnh đó thì chúng ta chỉ cần thêm việc bắt sự kiện Cliông xã chuột rồi kết thúc hàm (đưa lịch sự gamePlay).

def gameStart(bird): bird.__init__() font = pygame.fonts.SysFont("consolas", 60) headingSuface = font.render("FLAPPY BIRD", True, (255, 0, 0)) headingSize = headingSuface.get_size() fonts = pygame.phông.SysFont("consolas", 20) commentSuface = fonts.render("Cliông xã khổng lồ 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ớ 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 nhe, cũng chỉ cần vẽ chữ, vẽ số điểm thôi. Hàm này thì bắt sự kiện dấn phím space để hoàn thành hàm.

Xem thêm: Kỹ Thuật Trồng Cây Trong Chậu Đúng Cách Trồng Cây Cảnh Trong Chậu Đúng Cách

def gameOver(bird, columns, score): font = pygame.font.SysFont("consolas", 60) headingSuface = fonts.render("GAMEOVER", True, (255, 0, 0)) headingSize = headingSuface.get_size() font = pygame.font.SysFont("consolas", 20) commentSuface = fonts.render("Press "space" to replay", True, (0, 0, 0)) commentSize = commentSuface.get_size() fonts = pygame.fonts.SysFont("consolas", 30) scoreSuface = font.render("Score: " + str(score.score), True, (0, 0, 0)) scoreSize = scoreSuface.get_size() while True: for event in pygame.sự kiện.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ì 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à chấm dứt rồi. Code của bọn họ sẽ tương tự cùng với đoạn code vừa đủ rồi. Các chúng ta chạy thử với xem kế quả đi!

Kết

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


Chuyên mục: Kiến thức