07:蘑菇的前身-蘑菇小方塊的實現#python遊戲程式設計#紅傘傘

貓姐_遊戲程式設計 發表於 2022-05-13
Python

宣告: 原創不易,未經許可,不得轉載

xa

0.前言

hello,小夥伴們!我還是帶你們一起寫遊戲的貓姐。
今天是這個遊戲的,第7集了!上一集,我們讓小男孩的雙腳,靈活的動起來了,這一集,我們來實現蘑菇的前身-蘑菇小方塊的程式碼

07:蘑菇的前身-蘑菇小方塊的實現#python遊戲程式設計#紅傘傘

1.定義蘑菇類

我們先來定義一個蘑菇的類,類名叫MushRoom,在括號裡面我們傳入pygame.sprite.Sprite,讓MushRoom繼承這個精靈類。然後在類裡,實現我們自己的建構函式def __init__(self),用super函式來呼叫精靈父類的建構函式。

class MushRoom(pygame.sprite.Sprite):
    def __init__(self):
        super(MushRoom, self).__init__()

在建構函式裡面,我們用pygameSurface函式生成一個寬為30畫素高為30畫素的小方塊,給這個小方塊取個名,叫self.image。用self.image.fill函式給小方塊填充紅色。
通過self.image的get_rect函式可以得到小方塊的矩形區域,在括號裡面,需要設定矩形區域的顯示位置,也就是程式執行起來後,小方塊在哪裡顯示。在這裡,我們讓小方塊在螢幕頂部的中心顯示,center=(WIDTH//2, 15),x的座標為螢幕的寬度整除2,y的座標為15。

class MushRoom(pygame.sprite.Sprite):
    def __init__(self):
        super(MushRoom, self).__init__()
        self.image = pygame.Surface((30, 30))
        self.image.fill("red")
        self.rect = self.image.get_rect(center=(WIDTH//2, 15))

接下來,我們定義一個draw函式,讓小方塊顯示出來。我們呼叫screen點blit函式,括號裡面傳入的是要顯示的圖片名稱self.image,以及圖片要在哪裡顯示

class MushRoom(pygame.sprite.Sprite):
    #...
    def draw(self, screen):
        screen.blit(self.image, self.rect)

2.方塊的顯示

我們現在將小方塊顯示在遊戲視窗,我們在while迴圈外面,生成一個mushroom物件,然後在while迴圈裡面,呼叫mushroom物件的draw函式,繪製出小方塊!我們執行程式看看效果!

#...
player = Player()
# 例項化MushRoom物件
mushroom = MushRoom()

while True:
    #...
    mushroom.draw(screen)

好了,我們看到小方塊已經顯示出來了!

07:蘑菇的前身-蘑菇小方塊的實現#python遊戲程式設計#紅傘傘

這裡的方塊是代表的蘑菇,只顯示出來,還不行,蘑菇要慢慢下落。
所以,在MushRoom類裡面,還需要寫一個update函式,讓小方塊自動往下掉。

class MushRoom(pygame.sprite.Sprite):
    #...
    def update(self):
        self.rect.move_ip(0, self.speed)

這裡,我用了一個新的變數self.speed,所以,在init函式裡面,需要設定speed的初始值為10
while迴圈裡面,我們只需要呼叫mushroom.update函式,小方塊就會往下掉呢。

class MushRoom(pygame.sprite.Sprite):
    def __init__(self):
        #...
        self.speed = 10
while True:
    #...
    mushroom.update()

我們執行遊戲,看下效果。可以看到,小方塊就自動往下掉了。

07:蘑菇的前身-蘑菇小方塊的實現#python遊戲程式設計#紅傘傘

這裡還有一個問題,小方塊掉到螢幕外面後,應該銷燬掉,所以我們在update函式裡面,還要加兩行程式碼,處理這個情況!
小方塊的邊界處理,當小方塊的y座標大於HEIGHT時,就讓小方塊自動消失。

class MushRoom(pygame.sprite.Sprite):
    #...
    def update(self):
        #...
        if self.rect.top >= HEIGHT:  # if小方塊掉到最底部了
            self.kill()  # 就把自己幹掉

這裡我們就不執行遊戲了,執行也看不出來有什麼不同,這個kill函式只是把自身佔用的資源釋放掉了
關注貓姐,下一集我們用定時器這個技術,產生很多下落的蘑菇!

本文所涉及到的程式碼

class MushRoom(pygame.sprite.Sprite):
    def __init__(self):
        super(MushRoom, self).__init__()
        self.image = pygame.Surface((30, 30))
        self.image.fill("red")
        self.rect = self.image.get_rect(center=(WIDTH//2, 15))
        self.speed = 10

    def draw(self, screen):
        screen.blit(self.image, self.rect)

    def update(self):
        self.rect.move_ip(0, self.speed)
        if self.rect.top >= HEIGHT:  # if小方塊掉到最底部了
            self.kill()  # 就把自己幹掉


player = Player()
# 例項化MushRoom物件
mushroom = MushRoom()

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            sys.exit()
    # screen.fill("black")
    screen.blit(bg_image, (0, 0))
    player.update()
    player.move()
    # 繪製小方塊
    mushroom.draw(screen)
    # 更新小方塊
    mushroom.update()
    pygame.display.update()
    clock.tick(FPS)