首頁 > 軟體

Python圖形化使用者介面與遊戲開發範例詳解

2022-09-02 18:02:44

前言

對於使用過計算機的人,應該對圖形化使用者介面(GUI)應該都不會太陌生,這裡就不在贅述。那麼對於python這樣的動態語言有沒有GUI相關的庫呢?答案是肯定有的,那麼常見的有哪些呢?主要有tkinter、wxPython、PyQt、PyGTK等模組,而tkinter是python預設的模組,沒有功能特別強大的GUI控制元件,所以真的要在python中進行GUI開發,推薦使用wxPython、PyQt、PyGTK等模組。Pyhton還提供了Pygame遊戲開發模組。下面主要介紹tkinter、wxPython、Pygame的使用,廢話不多說直接開始吧,哈哈哈哈哈~

基於tkinter模組的GUI

tkinter是基於Tk工具包的一個模組,而Tk為控制元件的擺放提供了三種佈局管理器,通過佈局管理器可以對控制元件進行定位,這三種佈局管理器分別是:

Placer:開發者提供控制元件的大小和擺放位置

Packer:自動將控制元件填充到合適的位置

Grid:基於網格座標來擺放控制元件

講了這些還是不知道tkinter怎麼使用,那麼我們直接介紹使用tkinter來開發GUI的基本步驟:

匯入tkinter模組中我們需要的東西
建立一個頂層視窗物件並用它來承載整個GUI應用
在頂層視窗物件上新增GUI元件
通過程式碼將這些GUI元件的功能組織起來
進入主事件迴圈(main loop)

基於wxPython模組的GUI

wxPython是一個Python包裝wxWidgets(c++編寫)的一個流行的跨平臺的GUI工具包,可以作為Python的一個擴充套件模組。wxObject類是wxPython API的核心模組,它是所有類的基礎類,包括所有GUI應用程式使用的部件。如wx.Button,wx.StaicText等。

Pygame遊戲開發

Pygame是一個開源的Python模組,專門用於多媒體應用(如電子遊戲)的開發,其中包含對影象、聲音、視訊、事件、碰撞等的支援。Pygame的使用基本步驟:

匯入Pygame模組

先初始化

構建一個視窗

設定標題

讓其保持執行狀態,直到使用者手動關閉

先檢測事件,如果檢測到關閉按鈕那麼就退出

下面從五方面來介紹Pygame的使用:

1.在遊戲視窗中繪圖

我們可以通過Pygame中的draw模組在遊戲視窗中繪製各種圖形,主要包括:線條、矩形、多邊形、圓、橢圓、圓弧等。但最重要想說的不是這個,而是“螢幕座標系”。什麼是螢幕座標系,它就是指將螢幕左上角設定為座標原點‘(0, 0)’,向右是x軸的正向,向下是y軸的正向,在表示位置或者設定尺寸的時候,我們預設的單位都是畫素(畫素概念)。說了那麼多我們舉個例子更實際一些:

import pygame  # 匯入pygame模組
def main():
    # 初始化pygame模組
    pygame.init()
    # 初始化顯示視窗並設定視窗尺寸
    screen = pygame.display.set_mode((888, 666))
    # 設定當前視窗的標題
    pygame.display.set_caption('888666')
    # 設定視窗背景色
    screen.fill((200, 102, 22))
    # 繪製一個圓(引數分別是: 螢幕, 顏色, 圓心位置, 半徑, 0表示填充圓)
    pygame.draw.circle(screen, (255, 0, 0,), (100, 100), 30, 0)
    # 重新整理當前視窗(渲染視窗將繪製的影象呈現出來)
    pygame.display.flip()
    running = True
    # 開啟一個事件迴圈處理髮生的事件
    while running:
        # 從訊息佇列中獲取事件並對事件進行處理
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
 
if __name__ == '__main__':
    main()

2.圖形的處理

如果需要直接載入影象到視窗上,可以使用pygame中image模組的函數來載入影象,再通過之前獲得的視窗物件的`blit`方法渲染影象,程式碼如下:

import pygame
WIN_WIDTH = 800
WIN_HEIGHT = 800
#初始化
pygame.init()
#構建遊戲視窗
chuangkou = pygame.display.set_mode((WIN_WIDTH,WIN_HEIGHT))
#設定遊戲標題
pygame.display.set_caption('圖片')
# 填充背景
chuangkou.fill((255,255,255))
pygame.display.flip()
image = pygame.image.load('./res/ball.png')
# 在視窗上渲染影象
chuangkou.blit(image, (50, 50))
pygame.display.update()   #再次重新整理
 
# 開啟一個事件迴圈處理髮生的事件
while True:
    for x in pygame.event.get():
        if x .type==pygame.QUIT:
            exit()

3.動畫效果

動畫效果其實就是把不連續的圖片連續的播放,只要每秒鐘達到了一定的幀數,那麼就可以做出比較流暢的動畫效果,程式碼如下:

import pygame
WIN_WIDTH = 800
WIN_HEIGHT = 800
#初始化
pygame.init()
#構建遊戲視窗
chuangkou = pygame.display.set_mode((WIN_WIDTH,WIN_HEIGHT))
#設定遊戲標題
pygame.display.set_caption('圖片')
# 填充背景
chuangkou.fill((255,255,255))
pygame.display.flip()
image = pygame.image.load('./res/ball.png')
# 在視窗上渲染影象
chuangkou.blit(image, (50, 50))
pygame.display.update()   #再次重新整理
 
num =1
d = 0 #初始化旋轉的角度
# 開啟一個事件迴圈處理髮生的事件
while True:
    num += 1
    if num % 20 == 0:
        d+=2
        newimage = pygame.transform.rotozoom(image, d, 0.2)
        chuangkou.blit(newimage, (0, 0))
        pygame.display.update()
 
    for x in pygame.event.get():
        if x .type==pygame.QUIT:
            exit()

4.碰撞檢測

在遊戲中會有很多物件出現,而這些物件之間的“碰撞”在所難免,比如炮彈擊中了飛機、箱子撞到了地面等。碰撞檢測在絕大多數的遊戲中都是一個必須得處理的至關重要的問題,pygame的sprite(動畫精靈)模組就提供了對碰撞檢測的支援。通常情況下,我們使用該模組的基礎類別 Sprite 來建立一個子類,從而達到處理精靈的目的。當我們需要管理大量的精靈時,操作它們將變得複雜,此時通過構建精靈容器(group 類)也就是精靈組來統一管理這些精靈。構建方法如下:

group = pygame.sprite.Group() # 建立精靈組

group.add(sprite_one) # 向組內新增一個精靈

此同時pygame.sprite模組也提供了多種檢測精靈是否碰撞的方法,如下所示:

方法說明
pygame.sprite.collide_rect()兩個精靈之間的矩形檢測,即矩形區域是否有交匯,返回一個布林值
pygame.sprite.collide_circle() 兩個精靈之間的圓形檢測,即圓形區域是否有交匯,返回一個布林值
pygame.sprite.collide_mask()兩個精靈之間的畫素蒙版檢測,更為精準的一種檢測方式
pygame.sprite.spritecollide()精靈和精靈組之間的矩形碰撞檢測,一個組內的所有精靈會逐一地對另外一個單個精靈進行碰撞檢測,返回值是一個列表,包含了發生碰撞的所有精靈
pygame.sprite.spritecollideany()精靈和精靈組之間的矩形碰撞檢測,上述函數的變體,當發生碰撞時,返回組內的一個精靈,無碰撞發生時,返回 None
pygame.sprite.groupcollide()檢測在兩個組之間發生碰撞的所有精靈,它返回值是一個字典,將第一組中發生碰撞的精靈作為鍵,第二個組中發生碰撞的精靈作為值

說了那麼多關於pygame.sprite碰撞檢測的函數,下面我們舉個例子來得更直觀一點:

import sys, pygame
from random import *
class MyClass(pygame.sprite.Sprite):
    def __init__(self, image_file, location, speed):
        pygame.sprite.Sprite.__init__(self)        #初始化動畫精靈
        self.image = pygame.image.load(image_file) #載入圖片
        self.rect = self.image.get_rect()          #得到定義影象邊界矩形
        self.rect.left, self.rect.top = location   #設定球的初始位置
        self.speed = speed                         #建立一個速度
    def move(self):
        self.rect = self.rect.move(self.speed)
        if self.rect.left < 0 or self.rect.right > width:
            self.speed[0] = -self.speed[0]
        if self.rect.top < 0 or self.rect.bottom > height:
            self.speed[1] = -self.speed[1]
def animate(group):
    screen.fill([255, 255, 255])
    for ball in group:
        ball.move()
    for ball in group:
        group.remove(ball)      #從組刪除精靈
        #檢查精靈與組的碰撞
        if pygame.sprite.spritecollide(ball, group, False): 
            ball.speed[0] = -ball.speed[0]
            ball.speed[1] = -ball.speed[1]
        group.add(ball)
        screen.blit(ball.image, ball.rect)
    pygame.display.flip()
    pygame.time.delay(20)
#設定視窗大小和顏色    
size = width, height = 640, 480
screen = pygame.display.set_mode(size)
screen.fill([255, 255, 255])
img_file = "beach_ball.png"
clock = pygame.time.Clock()
group = pygame.sprite.Group()   #建立精靈組
#將球增加到列表
for row in range(0, 2):
    for column in range(0, 2):
        location = [column * 180 + 10, row * 180 + 10]
        speed = [choice([-4, 4]), choice([-4, 4])]     #讓每個球變得隨機性
        ball = MyClass(img_file, location, speed)
        group.add(ball)
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
            frame_rate = clock.get_fps()
            print( "frame rate = ", frame_rate)   
    animate(group)   
    clock.tick(30)
pygame.quit()

5.事件處理

其實通過上面的程式碼例子中,細心的人應該注意到有一個pygame.event.get()方法,它就是獲取滑鼠事件,而且通過事件物件的`type`屬性可以判定事件型別,再通過`pos`屬性就可以獲得滑鼠點選的位置。

總結 

這裡只是簡單的介紹pygame的使用,要想了解更多pygame知識,推薦pygame的官方網站,但要求要有一定的英文基礎哈哈哈哈哈~。其實我們學習這些模組,不但要了解怎麼使用他們,更重要的是要掌握物件導向程式設計和事件驅動的思想去解決現實中的問題。

到此這篇關於Python圖形化使用者介面與遊戲開發的文章就介紹到這了,更多相關Python圖形化使用者介面與遊戲開發內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com