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

     

Chào đông đảo người! Trong bài lí giải lần này mình đã thuộc các bạn tạo nên game Flappy Bird cùng với pygame. Flappy Bird là 1 trong game mà lại phần đông người nào cũng biết, lối chơi dễ dàng và đơn giản cùng gần như ai học tập lập trình game cũng từng demo làm tựa game này. Không nói lâu năm chiếc nữa, bọn họ cùng ban đầu luôn nha!

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

Đầu tiên, các bạn phải biết cơ bạn dạng về python với pygame. Bạn như thế nào chưa tìm hiểu pygame thì có thể liếc qua 2 bài chỉ dẫn cơ bạn dạng của mình (phần 1, phần 2)hoặc rất có thể học tập bên trên phần đa nguồn không giống nhé. Bài này tương đối nhiều năm phải các bạn phải cố gắng quan sát và theo dõi. Để gồm cồn lực thì bọn họ cùng xem trước thành quả có tác dụng được vào bài xích này nhe!

Các chúng ta sở hữu source code không hề thiếu tại phía trên.

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

Tạo thư mục và tệp tin đến game

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

*

flappyBird.py là file code bao gồm của họ. Tlỗi mục img đựng phần đông hình ảnh vào game.

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

Các hình hình họa đã tất cả trong phần source code không thiếu rồi. Các các bạn nhớ download về và tiếp tế.

bởi thế là họ đã sẵn sàng chấm dứt phần đông thứ cần thiết. Bây giờ chúng ta msống fileflappyBird.py rồi code thôi!

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

Phần này tương đối dễ dàng cần mình đi nkhô giòn qua nhe. Mọi thứ vào này tôi đã ra mắt sinh hoạt phần đông bài trước rồi.

À mà lại vị mình đã code từng bước phải thỉnh thoảng gần như cái code gồm sự biệt lập đối với đoạn code không thiếu thốn nhe!

import pygame, sys, randomfrom pygame.locals import *WINDOWWIDTH = 400WINDOWHEIGHT = 600BACKGROUND = pygame.image.load("img/background.png")pygame.init()FPS = 60fpsClock = 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 bé chyên và điểu khiển nó

Tạo bé chim và vẽ lên cửa sổTại đầu đoạn code, bọn họ sẽ tạo một trong những hằng số để nhân tiện cho câu hỏi chuyển đổi, bình chọn. Các các bạn tham khảo ở code đầ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ẽ chúng ta đã và đang gọi sứ mệnh của các trở thành vào __init__ rồi! Các bạn cũng có thể coi hình dưới

*

Các bạn phải để ý self.speed là vận tốc bay của chyên. Cái này bản thân đã nói tại đoạn sau.

Trong hàm main chế tạo thêm 1 đổi mới bird với Gọi hàm bird.draw() trong tầm lặp game.

def main(): bird = Bird() while True: for sự kiện in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() DISPLAYSURF.blit(BACKGROUND, (0, 0)) bird.draw() pygame.display.update() fpsClochồng.tick(FPS)Các các bạn chạy test nhe. Con chyên đã có được vẽ lên screen. Bây giờ đồng hồ chúng ta hãy tra cứu biện pháp tạo nên nhỏ chyên rơi xuống nhe.

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

Bây tiếng chúng ta hãy code trước rồi mình sẽ phân tích và lý giải sau.

Nlỗi bài xích khuyên bảo trước, để thay đổi địa điểm của chim thì rất cần phải bao gồm thêm hàm update. Các bạn hãy tạo ra hàm update của class Bird nlỗi sau:

def update(self): self.y += self.speed + 0.5*G self.tốc độ += GTrong vòng lặp game chúng ta 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.sự kiện.get(): if event.type == QUIT: pygame.quit() sys.exit() DISPLAYSURF.blit(BACKGROUND, (0, 0)) bird.draw() bird.update() pygame.display.update() fpsCloông chồng.tick(FPS)Chạy thử với coi hiệu quả nhé. Bây giờ đồng hồ họ nên biết đều gì đã xảy ra bên trong hàm update.

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

*

Trong hàm update họ sẽ tính tung độ(self.y) và tốc độ (self.speed) của chyên ổn ứng cùng với từng khung người. Nlỗi các bạn sẽ biết, các khung người xuất hiện thêm giải pháp nhau một khoảng chừng thời hạn khẳng định. Để đến đơn giản và dễ dàng thì cho hầu hết khoảng thời hạn phần nhiều bằng 1 và Khi cố kỉnh vào phương thơm trình rơi tự do sẽ tiến hành 2 chiếc code trên. Trong đó, G đó là tốc độ trọng trường.

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

Để tạo ra hoạt động bay lên khi Click loài chuột thì cần được bắt sự khiếu nại Clichồng chuột cùng thay đổi tốc độ của chim. Tốc độ bay lên tất nhiên nên có quý hiếm âm, trong code của chúng ta đang một hằng số là SPEEDFLY=-8.

Bây tiếng rất cần phải thêm một trong những lắp thêm 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 một tsay đắm số là mouseClichồng, trở nên này dùng làm khám nghiệm câu hỏi Cliông chồng loài chuột.

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

Bây giờ đồng hồ, vấn đề yêu cầu làm cho là bắt sự khiếu nại Cliông xã con chuột và truyền vào hàm update, thêm hồ hết loại code bên trong vòng lặp game nlỗi sau:

while True: mouseCliông xã = False for sự kiện 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() fpsClochồng.tick(FPS)Biến mouseClick nhằm bình chọn sự kiện Cliông xã loài chuột và truyền vào hàm update. Trong vòng forthì tiến hành bài toán bắt sự kiện MOUSEBUTTONDOWN, sự khiếu nại này xảy ra lúc nút ít loài chuột được ấn vào.

Vậy là bọn họ sẽ chấm dứt xong xuôi phần của nhỏ chyên ổn. Trước lúc lịch sự phần bắt đầu, các bạn đề xuất chú ý lại đoạn code, nghĩ lại phần đa cái code coi bọn chúng có tính năng gì, hoạt động như thế nào. Nếu nắm rõ đa số thiết bị rồi thì chúng ta cùng quý phái phần tiếp theo, chính là tạo nên những cái cột.

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

Tạo cột

Như đã biết thì sẽ sở hữu được phần đông phần cột bên trên và bên dưới. lúc bản thân nói đến 1 cái "cột" thì các bạn hãy đọc là bao gồm cả 2 phần với khoảng trống giữa 2 phần nhe!

Bây giờ, các bạn hãy gõ code trước đi. Mình đang phân tích và lý giải phần lớn đoạn code kia 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.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 giống như nhỏng phần nhỏ chyên ổn nhe. Tạo thay đổ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.sự kiện.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() bird.draw() bird.update(mouseClick) pygame.display.update() fpsCloông chồng.tick(FPS)Rồi bây chừ thì hãy chạy demo và xem thành quả này. Sau đó, đến phần khám phá code thôi!

Bây giờ đồng hồ hãy chú ý lại class Columns, trong hàm __init__ gồm khởi chế tác một số biến:

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

Vòng lặp for vào __init__ dùng để 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 thứ nhất được vẽ tiếp giáp lề bên trái, Có nghĩa là x = 0. Các cột tiếp theo phương 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 nhận quý hiếm random nhằm tạo ra phần đa khoảng không tất 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, mỗi cột có 2 phần nên tất cả 2 mẫu nhằm vẽ phần bên trên với phần bên dưới.

bởi thế là chúng ta sẽ tạo được các cột, bây chừ hãy lịch sự phần tiếp theo nhằm mày mò giải pháp mang đến các cái cột di chuyển.

Tạo chuyển động đến cột

Nhỏng thường lệ, bọn họ đã thêm hàm update mang đến class Columns cùng ngơi nghỉ 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à sử dụng vòng lặp for để lặp qua 3 cột, so với từng cột thì hoành độ của chính nó sẽ giảm đi. Nghe dường như đơn giản thất thoát.

Xem thêm: Gói Bánh Chưng Trong Tiếng Anh, Cách Sơ Chế Nguyên Liệu Va Cách Gói Bánh Chưng

def update(self): for i in range(3): self.ls<0> -= self.speedChạy test để thấy hiệu quả nhé. Những chiếc cột sẽ di chuyển lịch sự trái rồi.

Tuy nhiên, có một sự việc sống đó là bọn họ new chỉ tất cả 3 cột, trong lúc kia game rất cần phải có rất nhiều (còn nếu không ý muốn nói là vô hạn) cột. Các chúng ta cũng có thể chế tác thiệt những bộ phận cho self.ls. Tuy nhiên, điều đó nghe có vẻ không công dụng 1 chút nào. Hãy nghĩ ra 1 ý tưởng phát minh new như thế nào, các cột sẽ dịch rời quý phái trái và lúc một cột như thế nào kia đi thoát khỏi màn hình hiển thị thì nó không hề tính năng gì nữa, bạn cũng có thể xoá chiếc cột đó đi cùng chế 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ỉ tất cả 3 bộ phận, lúc đến mọi thời điểm phù hợp sẽ sở hữu 1 cột bị xoá đi cùng 1 cột đạt thêm vào.

*

Nếu có 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.tốc độ if self.ls<0><0> Dòng if được cung ứng nhằm soát sổ xem cột gồm đi ra bên ngoài màn hình giỏi chưa.

Dòng self.ls.pop(0) để xoá cột tại phần thứ nhất.

x là hoành độ cột chế tạo. Cột được chế tạo đang giải 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 bắt buộc self.ls chỉ với 2 cột thôi.

y là tung độ không gian của cột phân phối, cũng lấy giá chỉ trị random như các cột khác.

Các bạn hãy chạy test với coi kết quả nhe.

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

Vậy nên là bọn họ sẽ chấm dứt xong xuôi phần cột rồi! Các chúng ta xem xét lại code nhằm sẵn sàng sang trọng phần tiếp theo nhé!

Xử lý va chạm

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

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

Kiểm tra gameover

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

Vậy là họ vẫn có một hàm để hiểu dịp như thế nào thì gameover. Hãy bình chọn hoạt động của hàm này nhe! Các 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 nhìn vào thì cũng đọc tức thì. Khi soát sổ thấy gameover thì kết thúc game luôn. Các các bạn từ bỏ chạy thử nhé!

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

Tính điểm

Trong game, giả dụ nhỏ chyên ổn đ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 chyên ổn đi qua một cột?? Trong phần trước, họ sẽ bao gồm hàmrectCollision để khám nghiệm sự va chạm của 2 hình chữ nhật. Vì vậy, bạn có thể tận dụng hàm này bằng phương pháp sinh sản một hình chữ nhật vùng sau cột, trợ thì điện thoại tư vấn là "hình chữ nhật tính điểm", trường hợp chyên va vào hình chữ nhật đó thì sẽ cộng thêm điểm. Các bạn có thể xem hình minch hoạ tiếp sau đây.

*

Các các bạn sẽ sinh sản một class Score nhỏng dưới. Nhìn nó có vẻ như phức hợp đấy, mình sẽ phân tích và lý giải sau.

class Score(): def __init__(self): self.score = 0 self.addScore = True def draw(self): phông = pygame.fonts.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, các bạn nhớ chế tạo thêm đổi mới score và Hotline 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 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 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() fpsClochồng.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 đổi thay, self.score chính là số điểm, còn đổi mới self.addScore dùng để soát sổ coi đã đạt được cộng thêm điểm hay không.

Tại sao lại sở hữu đổi thay self.addScore với biến hóa này sử dụng như thế nào?? Trong game, Khi chlặng trải qua cột vẫn chạm vào "hình chữ nhật tính điểm" tương đối nhiều lần. Tuy nhiên, các lần chyên ổn qua cột chỉ tính 1 điểm thôi, chính vì thế biến này nhằm chúng ta thêm vào đó điểm vào lần đụng trước tiên.

Điểm chỉ được cùng khi self.addScore là True. Ban đầu thì self.addScore = True, Khi chlặng chạm vào "hình chữ nhật tính điểm" lần đầu thì sẽ tiến hành cộng điểm vàself.addScore dấn cực hiếm False. Nếu chim 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 cho lần đụng tiếp sau. Nếu chúng ta thấy rối quá thì 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 tồn tại gì phức hợp yêu cầu bản thân không giải thích hàm này.

Các chúng ta chú ý hàm update nhé. Biến collision để soát sổ xem chyên ổn tất cả va "hình chữ nhật tính điểm" hay không. Cũng tương tự như như hàm isGameOver, bao 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 chlặng, vẫn dùng hàm rectCollision để bình chọn va chạm.

Những chiếc code dưới là nhằm thêm vào đó điểm mang đến biến self.score với điều chỉnh đổi thay self.addScore cho tương xứng. Các dòng code vận động theo như phần giải thích sống bên trên.

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

Tạo các màn đến game và hoàn hảo game

Nhỏng chúng ta sẽ thấy thì game của bọn họ vẫn chưa hoàn hảo. lấy một ví dụ như khi bước đầu game thì cần phải có 1 screen bắt đầu, sau khoản thời gian Cliông chồng chuột thì mới vào nghịch. Sau khi gamover thì cũng cần gồm screen gameover rồi rất có thể cho chơi lại chẳng hạn. Bây giờ đồng hồ họ cùng sinh sản các màn như thế nhé.

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

gamePlay

Thực hóa học thì cái vòng lặp game bọn họ code từ trước mang lại giờ là của màn gamePlay thôi. Chúng ta sẽ tạo hàm gamePlay như sau:

def gamePlay(bird, columns, score): bird.__init__() bird.tốc độ = 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: 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ỏng sau:

def main(): bird = Bird() columns = Columns() score = Score() while True: gamePlay(bird, columns, score)Lúc chạy hàm gamePlay thì những giá trị của bird, columns, score sẽ được đặt lại bằng bài toán gọi hàm __init__ và vị trí con chyên thì cho nó bay lên 1 dòng. khi chất vấn thấy gameOver thì chấm dứt hàm.

gameStart

Hàm này thì quá đơn giản dễ dàng rồi, chỉ Việc bố trí phần đa hình hình ảnh, chiếc chữ sao cho bắt mắt thôi. Bên cạnh đó thì họ chỉ cần thêm việc bắt sự khiếu nại Clichồng chuột rồi chấm dứt hàm (gửi sang gamePlay).

def gameStart(bird): bird.__init__() font = pygame.fonts.SysFont("consolas", 60) headingSuface = fonts.render("FLAPPY BIRD", True, (255, 0, 0)) headingSize = headingSuface.get_size() fonts = pygame.phông.SysFont("consolas", 20) commentSuface = font.render("Clichồng lớn 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 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 ghi nhớ điện thoại tư vấn 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ỉ là vẽ chữ, vẽ số điểm thôi. Hàm này thì bắt sự khiếu nại dấn phím space để xong xuôi hàm.

def gameOver(bird, columns, score): fonts = pygame.phông.SysFont("consolas", 60) headingSuface = phông.render("GAMEOVER", True, (255, 0, 0)) headingSize = headingSuface.get_size() fonts = pygame.phông.SysFont("consolas", 20) commentSuface = phông.render("Press "space" lớn replay", True, (0, 0, 0)) commentSize = commentSuface.get_size() phông = pygame.phông.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 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() fpsClochồng.tick(FPS)Xong rồi thì ghi nhớ chỉnh hàm main 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 chúng ta đang tương tự cùng với đoạn code vừa đủ rồi. Các bạn chạy thử và xem thành quả này đi!

Kết

Vậy là bọn họ sẽ ngừng hoàn thành game Flappy Bird cùng với pygame. Các bạn có thể thêm rất nhiều tính năng được cải thiện (thêm điểm trên cao, thêm huy cmùi hương...) đến game độc đáo hơn. Bài lý giải mang đến đây là dứt rồi. Mình sẽ còn ra phần nhiều bài xích khuyên bảo tiếp theo sau về pygame, các bạn nhớ đón coi nhe! Tạm biệt và hứa hẹn chạm chán lại!


Chuyên mục: Thế giới Game