03:遊戲主角動起來啦!#python遊戲開發#紅傘傘

貓姐_遊戲程式設計發表於2022-04-22

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

xa

0.前言

hello,小夥伴們!我是帶你們一起寫遊戲的貓姐。
今天我們接著做小朋友吃蘑菇的小遊戲!
上一集我們做了一個小方塊,並顯示到了遊戲視窗,可別小看這個小方塊呀,它就是遊戲主角的真身!今天我們接著來寫程式碼,實現通過鍵盤的方向鍵,控制小方塊的移動,效果是這樣的。

小方塊顯示

1.定義一個move函式

我們在Player類裡面,定義一個move函式,通過pygame.keyget_pressed函式來獲取使用者的鍵盤輸入,它會返回一個,由布林型別值組成的序列,賦值給key_pressed。你們自己,可以將這個變數列印出來,看下到底是什麼東東!

class Player(pygame.sprite.Sprite):
    def __init__(self):
        super(Player, self).__init__()
        self.image = pygame.Surface((60, 30))
        self.image.fill("white")
        self.rect = self.image.get_rect(left=WIDTH//2, top=HEIGHT//2)

    def move(self):
        key_pressed = pygame.key.get_pressed()

2.接下來的工作安排

我們現在要做的工作是:
當按下鍵盤的左箭頭時,方塊向左移10個畫素
當按下右箭頭時,方塊向右移10個畫素
同理上下兩個方向鍵,也是做相同的處理。
我們通過判斷key_pressed,很容易知道使用者是否按了方向鍵。

class Player(pygame.sprite.Sprite):
    def __init__(self):
        super(Player, self).__init__()
        self.image = pygame.Surface((60, 30))
        self.image.fill("white")
        self.rect = self.image.get_rect(left=WIDTH//2, top=HEIGHT//2)

    def move(self):
        key_pressed = pygame.key.get_pressed()
        if key_pressed[K_UP]:
            self.rect.move_ip(0, -10)
        
        if key_pressed[K_LEFT]:
            self.rect.move_ip(-10, 0)

如果key_pressed的鍵是K_UP,也就是按下了鍵盤的向上箭頭,則呼叫小方塊的self.rect.move_ip函式,讓小方塊向上移動10個畫素。
move_ip函式的括號裡,第一個0表示的是x,即x不動,第二個數為-10,表示的是y,讓方塊向上移10個畫素。
它是根據我們的座標系來定的,遊戲視窗的座標系是這樣的,原點在左頂點,為(0,0),向右走,x為正,向下走,y為正!
同理,當按下向左的箭頭,則呼叫方塊的self.rect.move_ip函式,括號裡面傳入的是(-10,0);
大家思考一下,方塊向下,向右走的程式碼該怎麼寫呢?程式碼是這樣的:

#...
def move(self):
    key_pressed = pygame.key.get_pressed()
    #...
    if key_pressed[K_DOWN]:
        self.rect.move_ip(0, 10)
    #...
    if key_pressed[K_RIGHT]:
        self.rect.move_ip(10, 0)

最後,在while迴圈裡面,我們還需要呼叫player.move函式,我們的小方塊才能動得起來呢!

while True:
    for event in pygame.event.get():0
        if event.type == QUIT:
            sys.exit()
    player.update()
    player.move()
    pygame.display.update()

好了,現在我們把程式執行起來,看看效果吧。
當按方向鍵時,完了,又出問題了。程式並沒有按照我的意思動起來。

這是因為,每經過一次while迴圈,都需要進行螢幕重新整理。在while迴圈裡面,還要新增一行程式碼:

screen.fill("black")

再次執行程式:

3.設定螢幕的重新整理頻率

我們可以看到,當按鍵盤的上下左右鍵時,方塊跑得很快,這是什麼原因呢?是因為,我們沒有控制螢幕的重新整理頻率,也就是幀速率。
我加三行程式碼,解決這個問題:

pygame.init()
WIDTH = 600
HEIGHT = 800
# 設定幀速率大小
FPS = 30
# 建立Clock物件
clock = pygame.time.Clock()
screen = pygame.display.set_mode((WIDTH, HEIGHT))

然後在while迴圈裡面,pygame.display.update更新語句的下面,呼叫clock.tick(FPS),就可以來控制螢幕的重新整理頻率了。

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            sys.exit()
    screen.fill("black")
    for sprite in all_sprites:
        sprite.move()
        sprite.update()
    pygame.display.update()
    # 控制螢幕的重新整理頻率
    clock.tick(FPS)

我們再執行程式,看看效果!當我們按鍵盤的上下左右箭頭時,方塊也能正常的移動了,是不是很神奇。

小方塊移動

不知道大家有沒有發現一個問題,當方塊上下左右移動時,方塊會跑到視窗外面去,你知道怎麼解決這個問題嗎?
關注貓姐,下一集我們來處理這個bug!

相關文章