【Python】使用Pygame做一個Flappy bird小遊戲(二)

需要圖片素材,音樂素材的朋友可以到我公衆號【拇指筆記】後臺回覆"FPB"自取

做一個Flappy bird遊戲的第二步就是按鍵檢測。Flappy bird只需要用一個按鍵控制小鳥的飛行就可以了。

1.0 實現效果

在這裏插入圖片描述

1.1 需要的函數

  1. 獲取事件。
pygame.event.get()
  1. 事件類型判斷,這個函數在之前就被用來檢測是否退出程序。這裏我們用它來檢測是否有按鍵被按下。
event.type == KETDOWN
  1. 獲取按下的鍵值,返回一個元組,這個元組的索引就是鍵值,用K_a,K_b…表示
pygame.key.get_pressed()

1.2 檢測空格鍵

首先需要對獲取的事件進行類型判斷,如果類型是KEYDOWN,需要獲取按下的鍵值並則進一步對鍵值進行判斷。

for event in pygame.event.get():	#獲取事件
	if event.typr == KEYDOWN:		#判斷事件類型
		press_keys = pygame.key,get_pressed()	#獲取鍵值
		if press_keys[K_SPACE]:		#對鍵值進行判斷
			...						#如果按下的是空格,則...

這樣,我們就實現了對空格鍵的檢測。

1.3 優化程序

在對小鳥程序進行改寫前,我們需要對之前的程序進行改寫一下,以方便之後的操作。

首先是繪製圖像,歡迎界面的元素不一定全都是遊戲界面中的,所以我們需要將它們分別寫在不同函數中。

def welcome():
    screen.blit(background,(0,0))
    screen.blit(green_base,(base_x,400))
    screen.blit(welcome1,(52,52))

其次是實現小鳥翅膀扇動的功能,爲了讓程序進一步模塊化,我也將他拿出來編寫成了函數。

#換圖
def drawbird(count):
    count +=change_speed*time_passed_seconds
    if 0<=(count)<=50:
        screen.blit(mid_bird,(52,base_y))    
    elif 50<(count)<=100:
        screen.blit(up_bird,(52,base_y))
    elif 100<(count)<=150:
        screen.blit(down_bird,(52,base_y))
    if count>140:
        count -= 140
    return count 

最後是小鳥運動的功能,這一部分在遊戲界面和開始界面是不同的,遊戲界面可以在此基礎上更改。

#開始界面的小鳥、綠磚運動
def updatexy(time_passed_seconds,base_x,base_y,dirx):
    distance_moved = time_passed_seconds * speed
    bird_distance = time_passed_seconds * bird_speed
    base_y = base_y + dirx*bird_distance
    base_x -= distance_moved
    if base_x<-40:
        base_x += 40
    if base_y >235:#base_y+10:
        dirx = -1
    if base_y <215:#base_y-10:
        dirx = 1         
    return base_x,base_y,dirx

這樣,就完成了對之前程序的調整,下一步就開始實現遊戲需要的功能。

在這裏插入圖片描述

1.4 控制小鳥

控制爲了實現控制小鳥功能,我們首先需要進入遊戲界面,其次是讓小鳥對空格鍵做出反應,最後對小鳥的飛行範圍做限制。

1.4.1 製作遊戲界面

遊戲界面與開始界面最大的不同就是遊戲界面少了下面這個圖像,所以我們需要在遊戲界面的元素中去掉它。

在這裏插入圖片描述

def start():
    screen.blit(background,(0,0))
    screen.blit(green_base,(base_x,400))

1.4.2 遊戲界面小鳥的運動

遊戲界面小鳥的運動和開始界面的小鳥運動有所區別。主要是遊戲界面小鳥在不按空格時會不斷向下墜並且飛行範圍爲整個遊戲界面。爲了實現這一功能,我對原來的updatexy()函數做了一些更改。首先是讓小鳥飛行方向一直向下(dirx>0),並且讓向下飛的速度爲原來的兩倍(dirx=2)。其次對小鳥的飛行範圍做出限制,讓小鳥一直處於0~490之間飛行。

def start_updatexy(time_passed_seconds,base_x,base_y,dirx):
    distance_moved = time_passed_seconds * speed
    bird_distance = time_passed_seconds * bird_speed
    base_y = base_y + dirx*bird_distance
    base_x -= distance_moved
    if base_x<-40:
        base_x += 40
    if 490>base_y >20:
        dirx = 2
    elif base_y >490:
        base_y = 490         
    elif base_y <0:
        base_y = 0
    return base_x,base_y,dirx

1.4.3 控制小鳥

最後也是最重要的,小鳥需要被控制,控制的方式就是通過空格鍵。每按一下空格鍵,小鳥就需要向上飛一些。但這個飛的距離,同樣容易收到機器性能和程序運行時間的影響。爲了消除這個影響,我仍然使用上一節提到的基於時間的速度控制,以保證在每一段時間裏,小鳥飛行的距離相同。

基於時間的速度控制:設定一個速度值,並記錄每一次循環運行的時間(時間長的循環飛的距離大些,時時間短的循環飛的距離小一些),這樣就可以保證在同一段時間裏,飛行的距離相同。

def moved(base_y,bird_speed1):
    press_key1 = pygame.key.get_pressed()
    if press_key1[K_SPACE]:
        #base_y -= 2
        bird_distance = time_passed_seconds * bird_speed1
        base_y = base_y - bird_distance
    return base_y

1.5 進入遊戲

上面都是進入遊戲後,需要實現的功能。對於進入遊戲功能的實現,我引入了一個標誌位變量(start_flag)並將他初始化爲0,這樣不僅可以進入遊戲,還可以返回開始界面,當檢測到空格被按下時,該變量被置1。

    if press_keys[K_SPACE]:	#按空格進入遊戲
        start_flag = 1
    if press_keys[K_a]:		#按a退出遊戲
        start_flag = 0
    if start_flag == 1:		#實現遊戲功能
        time_passed = clock.tick()
        time_passed_seconds = time_passed / 1000 
        start()
        base_y = moved(base_y,500)
        count = drawbird(count)   
        base_x,base_y,dirx = start_updatexy(time_passed_seconds,base_x,base_y,dirx)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章