當前位置: 妍妍網 > 碼農

Python升級之路( Lv25) PyGame遊戲開發基礎(下)

2024-03-01碼農

Python系列文章目錄

第二十五章 Pygame遊戲開發基礎(下)


  • Python系列文章目錄

  • 前言

  • 什麽是Pygame

  • 常用模組介紹

  • 事件操作

  • 字型處理

  • 繪制圖形

  • 實作動畫

  • 播放音樂


  • 前言

    大家好, 我是了不起, 歡迎收看我的冒險之旅

    今天我們將學習Pygame, 學習其常用模組, 豐富我們開發能力.

    今日冒險片段上

    在擊敗使徒之後, 所有被控制的人解除了控制, 可是奧菲利亞發現, 她的叔叔審判者馬塞爾仍然沒有找到. 作為地位僅次於奧菲利亞的人, 他的生死存亡也十分重要. 於是眾人開始打聽其下落, 某個被控制的老教徒說到, 在沒有被控制之前, 他是追隨馬塞爾進入到天帷禁地的. 這個地方之所以被稱為禁地的原因, 是因為其是在天帷巨獸的肚子裏面. 因為天帷巨獸十分龐大, 因此肚子內的空間也極大. 審判者馬塞爾藏匿與此, 是為了有朝一日能夠積蓄力量, 然後一舉擊潰羅斯特.
    聽到這裏, 大家放松了一口氣, 於是決定前往禁地, 來將這個好訊息告訴馬塞爾. 但當奧菲利亞當面將訊息告訴審判者馬塞爾時, 馬塞爾的情緒由平靜到激動, 再到低落, 然後變得癲狂. 仿佛失心瘋一樣咆哮著: 為了能夠擊敗羅斯特, 我辛辛苦苦在這裏臥薪嘗膽地準備了五年! 結果卻被你們幾天打敗了? 那誰來見證我的努力? 誰又來承受我失去家園的痛苦? 我不甘心啊! 於是, 馬塞爾召集所屬的信徒們向了不起他們發起攻擊...

    什麽是Pygame

    Pygame 是一組用於編寫視訊遊戲的 Python 模組. 它具有高度的可移植性,幾乎可以在所有平台和作業系統上執行. Pygame 在優秀的 SDL 庫之上添加了功能. 這使我們可以使用 python 語言建立功能齊全的遊戲和多媒體程式. 官網入口

    常用模組介紹

    事件操作

    Pygame 會接受使用者的各種操作(比如按鍵盤,移動滑鼠等). 這些操作會產生對應的事件,例如按鍵盤事件,移動滑鼠事件. 事件在軟體開發中非常重要,Pygame 把一系列的事件存放在一個佇列裏,並逐個進行處理

    1. 事件檢索 使用函式 pygame.event.get()獲取所有的事件,表 1-3 列出了 Pygame 中常用的事件

      事件 參數 產生途徑
      QUIT none 使用者按下關閉按鈕
      ACTIVEEVENT gain, state 啟用或者隱藏
      Pygame KEYDOWN unicode, key, mod 按下鍵
      KEYUP key, mod 放開鍵
      MOUSEMOTION pos, rel, buttons 滑鼠移動
      MOUSEBUTTONUP pos, button 放開滑鼠鍵
      MOUSEBUTTONDOWN pos, button 按下滑鼠鍵
      JOYBUTTONUP joy, button 遊戲手柄放開
      JOYBUTTONDOWN joy, button 遊戲手柄按下
      VIDEORESIZE size, w, h Pygame 視窗縮放
      VIDEOEXPOSE none Pygame 視窗部份公開(expose)
      USEREVENT code 觸發一個使用者事件
    2. 處理滑鼠事件 在 Pygame 框架中,MOUSEMOTION 事件會在滑鼠動作的時候發生,它有如下所 示 3 個參數 buttons: 一個含有 3 個數位的元組,3 個值分別代表左鍵、中鍵和右鍵,1 就表示 按下. pos: 位置 ;
      rel: 代表現在距離上次產生滑鼠事件時的距離.和MOUSEMOTION 類 似 , 常用的滑鼠事件還有 MOUSEBUTTONUP 和 MOUSEBUTTONDOWN 兩個

    3. 處理鍵盤事件 key :按下或者放開的鍵值,是一個數位,在 Pygame 中可以使用 K_xxx 來表示,比如字母 a 就是 K_a,還有 K_SPACE 和 K_RETURN 等 mod :包含了組合鍵資訊,如果 mod&KMOD_CTRL 是真,表示使用者同時按下了 Ctrl 鍵,類似的還有 KMODE_SHIFT 和 KMODE_ALT。 unicode :代表了按下鍵對應的 Unicode 值

    實操程式碼

    import pygame
    pygame.init()
    pygame.display.set_caption("處理鍵盤事件")
    screen = pygame.display.set_mode((600500), 032)
    # 載入圖片
    image = pygame.image.load("img/1.gif") # 需要在當前包下面父類包下面建立資料夾
    # 設定x,y作為初始位置
    x, y = 00
    # 設定各個方向移動
    whileTrue:
    for event in pygame.event.get():
    if event.type == pygame.QUIT: # 結束(處理了框體右上角x)
    exit()
    if event.type == pygame.KEYDOWN: # 按下
    if event.key == pygame.K_LEFT:
    x -= 10
    elif event.key == pygame.K_RIGHT:
    x += 10
    elif event.key == pygame.K_UP:
    y -= 10
    elif event.key == pygame.K_DOWN:
    y += 10
    screen.fill((000)) # 設定背景顏色
    screen.blit(image, (x, y)) # 填充影像
    pygame.display.update() # 重新整理螢幕

    效果展示

    字型處理

    在 Pygame 模組中可以直接呼叫系統字型,或者可以直接使用 TTF 字型.

    為了使用字型, 需要先建立一個 Font 物件:

    font = pygame.font.SysFont(‘arial’,18)

  • 在上述程式碼中,第一個參數是字型名,第二個參數列示大小。

  • 一般來說,「Arial」字型 在很多系統都是存在的,如果找不到,就會使用一個預設字型,這個預設字型和每個作業系統有關 也可以使用 pygame.font.get_fonts()函式來獲取當前系統中所有可用的字型

  • 一旦建立了一個 font 物件,就可以透過如下程式碼使用 render 方法來寫字,並且可以顯 示到螢幕中.

  • COLOR_RED = pygame.Color(25500
    textSurface = font.render(‘Hello Pygame’,True,COLOR_RED)

  • 在上述程式碼中,第一個參數是寫的文字, 第二個參數是布爾值,它控制是否開啟抗鋸齒功能,如果設定為 True 字型會比較平滑,不過相應的速度會有一點點影響;第三個參數是字型的顏色;第四個是背景色,如果你想沒有背景色,那麽可以不加第四個參數

  • 實操程式碼

    import pygame
    pygame.init()
    # 建立視窗
    screen = pygame.display.set_mode((600500), 032)
    pygame.display.set_caption("測試字型處理")
    # 設定字型樣式
    font = pygame.font.SysFont("kaiti"20)
    # 設定字型顏色
    COLOR_RED = pygame.Color(25500)
    # 設定文本內容
    textSurface = font.render('你好世界'True, COLOR_RED)
    # 設定文本初始座標
    x, y = 00
    # 設定各個方向移動
    whileTrue:
    for event in pygame.event.get():
    if event.type == pygame.QUIT: # 結束(處理了框體右上角x)
    exit()
    if event.type == pygame.KEYDOWN: # 按下
    if event.key == pygame.K_LEFT:
    x -= 10
    elif event.key == pygame.K_RIGHT:
    x += 10
    elif event.key == pygame.K_UP:
    y -= 10
    elif event.key == pygame.K_DOWN:
    y += 10
    screen.fill((000)) # 設定背景顏色
    screen.blit(textSurface, (x, y)) # 填充影像
    pygame.display.update() # 重新整理螢幕

    繪制圖形

    Pygame 的座標原點(0,0)點位於左上角,X 軸自左向右,Y 軸自上向下,單位為像素

    繪制圖形的方法下表

    方法名 說明
    pygame.draw.line(Surface, color, start_pos, end_pos, width) 繪制一條線段
    pygame.draw.aaline(Surface, color, start_pos, end_pos, blend) 繪制一條抗鋸齒的線
    pygame.draw.lines(Surface, color, closed, pointlist, width) 繪制一條折線
    pygame.draw.rect(Surface, color, Rect) 繪制一個矩形
    pygame.draw.rect(Surface, color, Rect, width) 繪制一個矩形框
    pygame.draw.ellipse(Surface, color, Rect) 繪制一個橢圓
    pygame.draw.ellipse(Surface, color, Rect, width) 繪制一個多邊形
    pygame.draw.arc(Surface, color, Rect, start_angle, stop_angle, width) 繪制一條弧線
    pygame.draw.circle(Surface, color, Rect, radius) 繪制一個圓

    實操程式碼

    from math import pi
    import pygame
    pygame.init()
    screen = pygame.display.set_mode((400300))
    pygame.display.set_caption(("測試圖形繪制"))
    # 定義顏色
    BLACK = (000)
    WHITE = (255255255)
    RED = (25500)
    GREEN = (02550)
    BLUE = (00255)
    # 背景顏色
    screen.fill(WHITE)
    # 繪制一條線
    pygame.draw.line(screen, GREEN, [00], [5030], 5)
    # 繪制一套抗鋸齒線
    pygame.draw.aaline(screen, GREEN, [050], [5080], True)
    # 繪制一條折現
    pygame.draw.lines(screen, BLACK, False, [[080], [5090], [20080], [22030]], 5)
    # 繪制一個空心矩形
    pygame.draw.rect(screen, BLACK, [75105020], 2)
    # 繪制一個矩形
    pygame.draw.rect(screen, BLACK, [150105020])
    # 繪制一個空心橢圓
    pygame.draw.ellipse(screen, RED, [225105020], 2)
    # 繪制一個橢圓
    pygame.draw.ellipse(screen, RED, [300105020])
    # 繪制多邊形
    pygame.draw.polygon(screen, BLACK, [[100100], [0200], [200200]], 5)
    # 繪制多條弧線
    pygame.draw.arc(screen, BLACK, [21075150125], 0, pi / 22)
    pygame.draw.arc(screen, GREEN, [21075150125], pi / 2, pi, 2)
    pygame.draw.arc(screen, BLUE, [21075150125], pi, 3 * pi / 22)
    pygame.draw.arc(screen, RED, [21075150125], 3 * pi / 22 * pi, 2)
    # 繪制一個圓
    pygame.draw.circle(screen, BLUE, [60250], 40)
    # 主程式迴圈
    whileTrue:
    for event in pygame.event.get():
    if event.type == pygame.QUIT: # 結束(處理了框體右上角x)
    exit()
    # 繪制螢幕內容
    pygame.display.update()

    效果展示

    在這裏插入圖片描述

    實作動畫

    由於人類眼睛的特殊生理結構,當所看畫面的幀率高於 24 的時候,就會認為是連貫的, 此現象稱之為視覺暫留 . 幀率(Frame rate)是用於測量顯示幀數的量度,所謂的測量單位為每秒顯示幀數(Frames per Second,簡稱:FPS). 在我們原有座標系的基礎上添加偏移量,再重新繪制,依次一張一張的迴圈繪制下去, 就會得到我們想要的物體移動的效果

    Pygame 實作動畫主要用到的方法如下表所示

    方法名 說明
    pygame.image.load(filename) 載入一張圖片
    pygame.Surface.blit(source, dest, area=None, special_flags = 0) 將圖片繪制到螢幕相應座標上(後面兩個參數預設, 可以不傳)
    pygame.time.Clock() 獲得 pygame 的時鐘
    pygame.time.Clock.tick(FPS) 設定 pygame 時鐘的間隔時間

    實操程式碼

    import sys
    import pygame
    pygame.init()
    # 設定幀率(螢幕每秒重新整理次數)
    FPS = 60
    # 獲得pygame的時鐘
    fpsClock = pygame.time.Clock()
    # 設定視窗大小
    screen = pygame.display.set_mode((500400), 032)
    pygame.display.set_caption("測試pygame動畫")
    # 定義顏色
    WHITE = (255255255)
    # 載入圖片
    img = pygame.image.load("img/1.gif")
    # 初始化圖片位置
    imgx, imgy = 00
    # 初始化圖片移動方向
    direction = "right"
    # 程式主迴圈
    # 主程式迴圈
    whileTrue:
    for event in pygame.event.get():
    if event.type == pygame.QUIT: # 結束(處理了框體右上角x)
    pygame.quit()
    sys.exit()
    # 每次都要重新繪制背景白色
    screen.fill(WHITE)
    # 判斷移動的方向, 並對相應的座標做加減
    if direction == "right":
    imgx += 5
    if imgx == 380:
    direction = "down"
    elif direction == "down":
    imgy += 5
    if imgy == 300:
    direction = "left"
    elif direction == 'left':
    imgx -= 5
    if imgx == 10:
    direction = 'up'
    elif direction == 'up':
    imgy -= 5
    if imgy == 10:
    direction = 'right'
    # 該方法將用於圖片繪制到相應的座標中
    screen.blit(img, (imgx, imgy))
    # 重新整理螢幕
    pygame.display.update()
    # 設定 pygame 時鐘的間隔時間
    fpsClock.tick(FPS)

    效果展示

    圖片會沿著邊框四周捲動

    播放音樂

    在 Pygame 裏播放音訊有兩個方法,一個用來播放特效聲音,一個用來播放背景音樂:

  • pygame.mixer.Sound(filename) 該方法返回一個 Sound 物件,呼叫它的.play( )方法,即可播放較短的音訊檔(比如玩家受到傷害、收集到金幣等)

  • pygame.mixer.music.load(filename) 該方法用來載入背景音樂,之後呼叫 pygame.mixer.music.play( )方法就可以播放背景音樂(Pygame 只允許在同一個時刻載入一個背景音樂)

  • 實操程式碼

    import sys
    import pygame
    pygame.init()
    # 設定視窗的大小
    screen = pygame.display.set_mode((500400))
    pygame.display.set_caption("測試播放音樂")
    # 定義顏色
    WHITE = (255255255)
    # 設定背景
    screen.fill(WHITE)
    # 載入並播放特效音訊
    sound = pygame.mixer.Sound('img/start.wav')
    sound.play()
    # 載入背景音樂檔
    pygame.mixer.music.load('img/fire.wav')
    # 播放背景音樂,第一個參數為播放的次數(-1 表示無限迴圈),第二個參數是設定播放 的起點(單位為秒)
    pygame.mixer.music.play(-10.0)
    # 主程式迴圈
    whileTrue:
    for event in pygame.event.get():
    if event.type == pygame.QUIT: # 結束(處理了框體右上角x)
    # 停止播放背景音樂
    pygame.mixer.music.stop()
    # 結束pygame
    pygame.quit()
    # 結束系統
    sys.exit()
    # 繪制螢幕內容
    pygame.display.update()

    今日冒險片段下

    眾人也被打了個措手不及, 本來以為能夠和平解決, 結果到現在卻變成了這樣. 因此眾人只好應戰, 但馬塞爾畢竟不是羅斯特. 沒用半天時間便將其打到力竭. 因為是奧菲利亞叔叔的原因, 眾人都沒有下重手, 因此馬塞爾只是昏厥過去. 後續由他們內部自己處理. 經此一役, 了不起也成功的晉升到了lv26.
    在事情都解決之後, 四劍聖和聖騎士們變回到各自的管轄的區域了. 而在走之前了不起了從眾人那裏解到, 在暗精靈聚集的地方出現了黑色噩夢的氣息, 這個氣息很可能和之前了不起在格蘭之森所僵屍王那裏遇到的是一樣的. 為了調查這個情報, 了不起依依不舍的告別了奧菲利亞, 開始前往暗精靈的聚集地....

    Sora最近老火了,Sora 的出現會對短視訊、廣告、遊戲、影視行業等產業格局一定會被重塑,目前 Sora 還沒正式開放註冊,大家看到的使用體驗大部份都來自官網,或者少部份的使用者分享。

    為了避免更多讀者受騙,我們直接給大家整了一個免費的。

    註意是下面【 Python都知道 】公眾號,不是本公眾號,點選下方的公眾號卡片,然後回復【 sora ,即可獲取最新 Sora 的最全資料。


    目前已經分享了,如何申請 Sora 的內測,以及最新關於 Sora 的技術特點,使用教程、變現機遇等等。

    大家如果想領取這份資料,可以點選下方的公眾號卡片,然後回復 sora ,即可獲取最新 Sora 的最全資料。

    需要提醒大家的是,Sora 目前還沒有完全開放,任何市面上付費的一些課程,都請大家謹慎選擇。

    可以確定的是:未來 10-20年,一定是 AI 的大風口、大時代,如果錯過了公眾號、錯過了抖音、錯過了小紅書。

    請一定不要錯過 AI +。

    面對浪潮,恐懼只會讓我們佇立在原地,被巨浪吞噬。

    要去主動適應它,不被恐懼束縛,動起胳膊動起腳,才不會被淘汰。

    註意是下面【 Python都知道 】公眾號,不是本公眾號,點選下方的公眾號卡片,然後回復 【 sora ,即可獲取最新 Sora 的最全資料。