主頁 >  其他 > 基于Python3-Pygame的乒乓球游戲

基于Python3-Pygame的乒乓球游戲

2021-02-14 13:40:23 其他

游戲界面截圖:

在這里插入圖片描述

按鍵控制:

空格: 暫停/開始
W: 上
S: 下

游戲玩法說明:

開始游戲之后,按鍵盤W/S按鍵控制球拍上下移動,接住球即可繼續游戲,沒接住的話游戲結束,結束后按空格可以重新開始游戲

使用的檔案:

在這里插入圖片描述
圖片和音樂也可以沒有,可跳過, 但是游戲運行后沒音效和圖片,下載音頻和圖片壓縮包,解壓放到代碼相同目錄下,百度網盤 :https://pan.baidu.com/s/12QXF2530ymr_sdXAa-e43g 提取碼: q6cw

介紹完畢,下面開始擼代碼,代碼注釋比較詳細,可以直接復制運行,也可以仔細閱讀學習,

Sprite為我們提供了一個裝載游戲物件的類,比如這里面的球拍和球,而Group則是Sprite的組合,可以輕松的對Group里面的各個sprite進行碰撞檢測、洗掉、繪制,

依賴庫:Pygame

安裝pygame模塊 : pip install pygame
在這里插入圖片描述

兵乓球:ball.py

import pygame

class ball(pygame.sprite.Sprite):
    """
    乒乓球類,存放相關引數
    """
    width = -1  # 寬度
    speedx = -1  # 每秒橫軸移動的像素點
    speedy = -1  # 每秒縱軸移動的像素點

    def __init__(self, color, size, screensize, speed, img=False):
        pygame.sprite.Sprite.__init__(self)
        if img:  # 有圖用圖,忽略大小size設定,大小由圖片大小確定
            try:
                self.image = pygame.image.load(img)
                self.width = self.image.get_size()[0]  # 大小修正
            except Exception as e:  # 圖片檔案發生錯誤用方塊替代
                print("溫馨提示: ", e, ", 請正確配置圖片檔案")
                self.image = pygame.Surface((size, size))
                self.width = size
                self.image.fill(color)
        else:  # 沒圖用方塊替代
            self.image = pygame.Surface((size, size))
            self.width = size
            self.image.fill(color)
        self.rect = self.image.get_rect()  # 位置資料
        (self.WIDTH, self.HEIGHT) = screensize
        (self.speedx, self.speedy) = speed

    def reset(self, speed):
        self.rect.x = 490  # 球資料
        self.rect.y = 80
        (self.speedx, self.speedy) = speed

    def update(self):
        # 上下邊界
        if (((self.rect.y + self.width) > self.HEIGHT) or self.rect.y < 0):
            self.speedy = -self.speedy
        elif (self.rect.x + self.width) > self.WIDTH:  # 右邊界處理
            self.speedx = -self.speedx
        self.rect.x = self.rect.x + self.speedx
        self.rect.y = self.rect.y + self.speedy

乒乓球拍:racket.py

import pygame

class racket(pygame.sprite.Sprite):
    """
    球拍類,存放相關引數
    """
    rkth = 100  # 球拍默認寬度
    rkwh = 10  # 球拍厚度
    rkstep = 0  # 每秒球拍移動的像素個數

    def __init__(self, color, size, speed, img=False):
        pygame.sprite.Sprite.__init__(self)
        if img:  # 有圖用圖,忽略大小size設定,大小由圖片大小確定
            try:
                self.image = pygame.image.load(img)
                self.rkwh = self.image.get_size()[0]  # 大小修正
                self.rkth = self.image.get_size()[1]
            except Exception as e:  # 圖片檔案發生錯誤用方塊替代
                print("溫馨提示: ", e, ", 請正確配置圖片檔案")
                self.image = pygame.Surface(size)
                self.width = size
                self.image.fill(color)
        else:  # 沒圖用方塊替代
            self.image = pygame.Surface(size)
            (self.rkwh, self.rkth) = size
            self.image.fill(color)
        self.rect = self.image.get_rect()  # 位置資料
        self.rkstep = speed

    def reset(self):
        self.rect.y = 100

主程式:pong.py

#!/usr/bin/env python3
# -*- encoding: utf-8 -*-
'''
@File    :  pong.py
@Desc    :  基于py3-pygame的乒乓球游戲
'''
import sys
import pygame
from pygame.locals import K_SPACE, K_s, K_w
from ball import ball
from racket import racket

MHIT = "music/pong.ogg"  # 擊球聲音檔案路徑
MBEG = "music/maliaobegin.ogg"  # 開始音頻
MFAIL = "music/fail.ogg"  # 游戲失敗音頻
MBAK = "music/maliaorun.ogg"  # 背景音樂音頻

WIDTH = 808
HEIGHT = 640
FPS = 30
CBACK = (153, 255, 0)
CBALL = (245, 245, 220)
CRKT = (200, 0, 0)
CFONT = (0, 0, 0)


def main():
    isload = False  # 音樂是否載入
    isfont = False  # 字體是否存在
    ispause = False  # 是否暫停
    isfail = False
    score = 0  # 分數
    pygame.init()
    screen = pygame.display.set_mode((WIDTH, HEIGHT))
    pygame.display.set_caption('Pong Pygame program')
    clock = pygame.time.Clock()

    bball = ball(CBALL, 20, (WIDTH, HEIGHT), (280 / FPS, 180 / FPS),
                 "img/ball.png")
    bball.rect.x = 490
    bball.rect.y = 80
    rkt = racket(CRKT, (10, 100), 220 / FPS, "img/pingpongbat.png")
    rkt.rect.x = 0
    rkt.rect.y = 100

    ball_list = pygame.sprite.Group()  # 存放小球
    all_list = pygame.sprite.Group()  # 存放全部
    ball_list.add(bball)
    all_list.add(bball)
    all_list.add(rkt)

    pygame.mixer.init()  # 初始化音頻模塊并載入音頻檔案
    try:
        mhit = pygame.mixer.Sound(MHIT)
        mbegin = pygame.mixer.Sound(MBEG)
        mbegin.set_volume(0.2)
        mfail = pygame.mixer.Sound(MFAIL)
        pygame.mixer.music.load(MBAK)
        pygame.mixer.music.set_volume(0.4)
        isload = True
    except Exception as m:
        print("溫馨提示: ", m, ", 請正確配置音頻檔案")
    if isload:  # 載入失敗不會推出,后面不會有音樂罷了
        pygame.mixer.music.play(-1)  # 回圈播放
        mbegin.play()

        # 找不到calibri字體就會使用pygame默認字體,都不支持中文
    try:
        ft = pygame.font.SysFont("calibri", 30)
        ftg = pygame.font.SysFont("calibri", 99)
        isfont = True
    except FileNotFoundError as e:
        print("溫馨提示: ", e, ", 請在電腦上安裝對應的字體")
    while True:
        screen.fill(CBACK)  # 清慷訓面為背景色

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()  # 關閉pygame模塊
                sys.exit(0)  # 關閉程式
            # 空格鍵按下回應,長摁無效
            if event.type == pygame.KEYDOWN and pygame.key.get_pressed(
            )[K_SPACE]:
                ispause = not ispause
                if isfail:
                    isfail = False  # 重新開始,重置資料
                    bball.reset((280 / FPS, 180 / FPS))
                    rkt.reset()
                    score = 0
                    if isload:
                        mbegin.play()

        if (not ispause) and (not isfail):  # 未暫停且未結束的情況下才處理移動
            if (rkt.rect.y - rkt.rkstep >=
                    0) and pygame.key.get_pressed()[K_w]:
                rkt.rect.y = rkt.rect.y - rkt.rkstep
            if (rkt.rect.y + rkt.rkth + rkt.rkstep <=
                    HEIGHT) and pygame.key.get_pressed()[K_s]:
                rkt.rect.y = rkt.rect.y + rkt.rkstep

            bball.update()
            if bball.rect.x < (0.7 * rkt.rkwh):  # 左邊界

                if pygame.sprite.collide_mask(bball, rkt):  # 像素遮罩(碰撞)檢測
                    score = score + 1
                    bball.speedx = -bball.speedx
                    if isload:  # 避免音頻未正確加載導致的程式例外結束
                        mhit.play()
                else:  # 未擊中球拍
                    ispause = True
                    isfail = True
                    if isload:
                        mfail.play()

        if isfail and isfont:
            tover = ftg.render("Game Over", True, CFONT)
            trest = ft.render("Press SPACE to start again", True, CFONT)
            screen.blit(tover, (150, 200))
            screen.blit(trest, (220, 400))
        if ispause and isfont and (not isfail):
            pause = ft.render("Press SPACE to continue", True, CFONT)
            screen.blit(pause, (250, 300))
        if isfont:
            text = ft.render("Score: " + str(score), True, CFONT)
            screen.blit(text, (100, 0))
        all_list.draw(screen)  # 繪制所有的sprite物件
        clock.tick(FPS)  # 以每秒30幀的速率進行繪制
        pygame.display.update()

if __name__ == '__main__':
    main()

玩一局兒:

在這里插入圖片描述

認識Pygame

pygame官方檔案

官方幫助檔案:https://www.pygame.org/docs/英文檔案,可以在頁面直接使用翻譯,

pygame是什么

pygame是跨平臺Python模塊,專門為電子游戲設計,包含影像、聲音等;簡單的說它是別人已經撰寫好的程式,并放在了一個類似庫里,專門給別人使用的,

pygame常用模塊

模塊名功能
pygame.cdrom訪問光驅
pygame.cursors加載光驅
pygame.display訪問顯示設備
pygame.draw繪制形狀、線和點
pygame.event管理事件
pygame.font使用字體
pygame.image加載和存盤圖片
pygame.joystick使用游戲手柄或類似的東西
pygame.key讀取鍵盤按鍵
pygame.mixer聲音
pygame.mouse滑鼠
pygame.movie播放視頻
pygame.music播放音頻
pygame.overlay訪問高級視頻疊加
pygame.rect管理矩形區域
pygame.sndarray操作聲音資料
pygame.sprite操作移動影像
pygame.surface管理影像和螢屏
pygame.surfarray管理點陣影像資料
pygame.time管理時間和幀資訊
pygame.transform縮放和移動影像

pygame的圖形介面

pygame圖形介面

使用pygame.image模塊,可以對影像進行讀取和保存,

使用pygame.image.load讀取影像檔案,

img = pygame.image.load(filename)

可以讀取檔案名為filename的影像檔案,pygame會自動確定檔案的型別(比如GIF或者BMP),一般來說支持JPG、PNG、GIF (non animated)、BMP、PCX、TGA (uncompressed)、TIF、LBM (及PBM)、PBM (及PGM, PPM)、XPM等,它回傳一個包含影像的Surface,Surface的格式和原來的檔案相同(包括顏色格式、透明色和alpha透明),

使用pygame.image.save可以把影像保存到檔案中,
pygame.image.save(img, filename)

這個函式可以把img這個Surface的內容保存為filename指定的影像檔案,檔案格式可以是BMP、TGA、PNG或者JPEG,如果檔案擴展名不認識,默認保存為TGA格式,TGA和BMP格式都是非壓縮的檔案,

還有pygame.image.tostring、pygame.image.fromstring、pygame.image.frombuffer函式可以把影像序列化,即把影像保存在字串中或者從字串中讀取影像,

變換

使用pygame.transform模塊中的函式,可以對影像進行簡單的變換,所有的這些函式都需要一個Surface引數指明要處理的影像,并生成一個新的影像表示處理后的結果,原來的影像不會被改變,

使用pygame.transform.flip可以上下左右顛倒影像,比如

newimg = pygame.transform.flip(img, True, False)

第一個引數指定要翻轉的影像,第二個引數指定是否對影像進行左右顛倒,第三個引數指定是否對影像進行上下顛倒,函式回傳顛倒后的影像,

使用pygame.transform.scale可以對影像進行縮放,比如

newimg = pygame.transform.resize(img, (640, 480))

第一個引數指定要縮放的影像,第二個引數指定縮放后的影像大小,函式回傳縮放后的影像,

使用pygame.transform.rotate可以對影像進行旋轉,比如

newimg = pygame.transform.rotate(img, 30.0)

第一個引數指定要旋轉的影像,第二個引數指定旋轉的角度數,正值為逆時針旋轉,負值是順時針旋轉,函式回傳旋轉后的影像,旋轉后的影像可能比原來的影像大,才能夠容納原來的整個影像,空出來的部分會補上透明色或者原來影像的左上角點的顏色,

使用pygame.transform.rotozoom可以對影像進行縮放并旋轉,比如

newimg = pygame.transform.rotozoom(img, 30.0, 2.0)

第一個引數指定要處理的影像,第二個引數指定旋轉的角度數,第三個引數指定縮放的比例,回傳處理后的影像,這個函式和前面兩個函式不一樣,這個函式會對影像進行濾波處理,影像效果會更好,但是速度會慢很多,

使用pygame.transform.scale2x可以對影像進行快速的兩倍大小的放大,比如

newimg = pygame.transform.scale2x(img)

使用pygame.transform.chop可以對影像進行裁減,比如

newimg = pygame.transform.chop(img, (100, 100, 200, 200))

第一個引數指定要裁減的影像,第二個引數指定要保留的影像的區域,回傳裁減后留下的影像,

對surface的控制

像素格式

pygame里的Surface是用來表示影像的物件,Surface有一定的大小和像素格式,在創建的時候,可以指定,

pygame.Surface((width, height), flags=0, depth=0, masks=None): return Surfacepygame.Surface((width, height), flags=0, Surface): return Surface

如果是8bit像素格式的Surface,它還會用一個調色板映射到24位元顏色,像素格式可以通過指定像素深度或者已有的Surface來控制,flags標志位引數是其他一些Surface選項的集合,你可以指定如下的標志

HWSURFACE, 在視頻記憶體中創建影像 SRCALPHA, 像素格式中會包含一個alpha通道這些引數都僅僅是一個請求,在實際中可能并不能實作,高級用戶可以組合一組顏色屏蔽位,masks是4個整數的集合,表示像素里的哪個位用來表示一種顏色,一般的Surface不需要masks引數,

8bit的Surface有一個調色板,把8bit的整數映射到RGB彩色,通過下面函式可以對調色板進行設定:

Surface.set_at(index, RGB): return NoneSurface.set_palette([RGB, RGB, RGB, …]): return None

通過下面的函式可以獲得當前的調色板:

Surface.get_palette(): return [RGB, RGB, RGB, …]Surface.get_palette_at(index): return RGB

不同像素型別的Surface之間的blit操作是很慢的,所以一般在blit之前要先通過Surface.convert對影像進行像素格式的變換,Surface.convert有多種不同的用法

Surface.convert(Surface): return SurfaceSurface.convert(depth, flags=0): return SurfaceSurface.convert(masks, flags=0): return SurfaceSurface.convert(): return Surface

新的像素格式可以由現存其它Surface確定,也可以由depth,flags或者masks決定,這些引數和pygame.Surface的引數類似,

如果沒有引數,新的Surface會和display Surface的像素格式一樣,這是畫圖最快的格式,轉換所有需要多次blit的Surface是一個好主意,

轉換出來的Surface不會有像素alpha,如果原來的Surface里面有,他們會被去掉,參看Surface.convert_alpha來保留或者創建每像素alpha,

如果Surface是有alpha通道的,并且需要保留這個資訊,則需要使用Surface.convert_alpha:

Surface.convert_alpha(Surface): return SurfaceSurface.convert_alpha(): return Surface

塊復制

一個影像復制到另一個上面,這是游戲中最常用的操作,由blit函式來實作

Surface.blit(source, dest, area=None, special_flags = 0): return Rect

畫的位置可以由dest引數指定,dest可以是一對坐標值,表示源Surface的左上角在這個Surface上的坐標,dest也可以是一個矩形,矩形的左上角作為blit的位置,而矩形的大小不影響blit,

有一個可選的area矩形引數,可以用來指定只畫源Surface的一部分,

一個可選的special_flags引數,可以是BLEND_ADD、BLEND_SUB、BLEND_MULT、BLEND_MIN、BLEND_MAX,將來也可能有其它特殊標記添加進來,

函式回傳的矩形表示受影響的像素的區域,不包括目標Surface以外的像素,也不包括剪切區域以外的像素,

透明

pygame支持三種型別 的透明:透明色(colorkey),Surface alpha和每像素alpha,Surface alpha可以和透明色(colorkey)混合使用,但是有像素alpha的影像不能夠使用其它模式,透明色(colorkey)讓一種顏色值透明,任 何和這個顏色相同的像素都不會被畫出來,Surface alpha值是單獨一個值用來改變整個影像的透明度,Surface alpha值是255表示不透明,值是0表示全透明,而每像素alpha是不一樣的,它為每個像素保存了一個透明值,這種方法允許精確的控制透明效果,但 是這種方法也是最慢的,每像素alpha不能和其它方法混用,

要設定透明色,使用Surface.set_colorkey函式:

Surface.set_colorkey(Color, flags=0): return NoneSurface.set_colorkey(None): return None

當 把這個Surface blit到令一個Surface時候,和這個透明色顏色相同的像素會變成透明,color引數可以是RGB顏色或者是一個映射的整數,如果傳送的是 None,則Surface會沒有透明色,如果是有每像素透明的Surface,透明色會被忽略,透明色可以和Surface alpha混合使用,可選的flags引數可以是pygame.RLEACCEL,用來在沒有加速的時候提供更好的性能,設定了RLEACCEL的 Surface作為源Surface blit更快,但是修改Surface的內容會更慢,

Surface的當前透明色可以通過Surface.get_colorkey獲得:

Surface.get_colorkey(): return RGB or None

如果沒有透明色,則函式回傳None,

要設定Surface的alpha值,可以通過Surface.set_alpha來實作:

Surface.set_alpha(value, flags=0): return NoneSurface.set_alpha(None): return None

透明值value可以取0到255之間的值,0是完全透明,255是完全不透明,如果value是None,則Surface就沒有alpha透明了,

Surface當前的alpha值可以通過Surface.get_alpha獲得:

Surface.get_alpha(): return int_value or None

如果沒有alpha透明,則這個函式回傳None,

每像素在繪圖的時侯可以通過顏色元組的第四個引數指定,

剪切區域

每個Surface包含一個剪切區域,默認情況下,剪切區域是整個Surface,如果改變了剪切區域,所有的畫圖操作都會限制在一個比較小的范圍之內,

通過Surface.set_clip可以設定剪切區域:

Surface.set_clip(rect): return NoneSurface.set_clip(None): return None

如果引數是None,則整個Surface都可以修改,剪切區域總是在Surface本身的區域只內的,如果剪切區域比Surface的區域大,則會自動縮小到Surface區域之內,

要獲得Surface的當前剪切區域,可以通過Surface.get_clip:

Surface.get_clip(): return Rect

一個Surface總是回傳一個有效的矩形,不會超過影像的邊界范圍,如果Surface設定了None作為剪切區域,則Surface會回傳整個Surface的區域,

鎖定

對于硬體加速的Surface,它有可能被存在顯示記憶體中,要訪問這些Surface上面的像素,就必須先通過Surface.lock對像素進行鎖定:

Surface.lock(): return None

鎖定完后,可以對Surface上的像素進行操作,操作完成后,應該及時解鎖:

Surface.unlock(): return None

一個Surface是否要先鎖定再操作,可以通過Surface.mustlock來判斷:

Surface.mustlock(): return bool

這個函式回傳Ture則需要鎖定,否則不需要鎖定,一個Surface當前的鎖定狀態可以通過Surface.get_locked來獲得:

Surface.get_locked(): return bool

這個函式回傳True表示已經鎖定了,False表示沒有鎖定,

實際上,pygame中所有需要鎖定Surface才能操作的函式都會自動地對Surface鎖定和解鎖,一般情況下不需要呼叫lock和unlock函 數,但是如果在一段代碼中需要反復對Surface上的像素進行操作,則每次都進行鎖定和解鎖會非常的慢,所以可以在這一串操作開始的時候進行鎖定,這一 串操作結束后解鎖,避免重復的鎖定解鎖操作,

繪圖

除了可以把事先畫好的圖片blit到Surface上以外,還可以在Surface上自行在Surface上繪制一些簡單的圖形,比如點、線、方、圓等,這個功能主要由pygame.draw模塊完成,

首先匯入pygame.draw模塊,

import pygame.draw

如果已經用了import pygame,則pygame.draw模塊也被自動匯入了,

然后準備好要在上面繪制圖形的Surface,比如

surface = pygame.display.set_mode((640, 480))

畫矩形

接下來就可以在surface上面繪制想要的圖形了,比如說畫矩形可以使用pygame.draw.rect函式:

pygame.draw.rect(surface, (0,0,255), (100, 200, 100, 100))

第一個引數指定在哪個Surface上畫矩形,第二個引數是矩形的顏色,第三個引數是矩形的位置和大小,

顏 色的引數一般是一個由紅綠藍三種顏色值構成的三元組,0是最暗的,255是最亮的,比如(0,0,255)是純藍色,(255,0,0)是純紅色, (0,0,0)是黑色,(255,255,255)是白色等等,有時候也可以使用RGBA四元組來表示顏色,如果Surface包含alpha,四元組中 alpha值會被直接寫入到Surface里面,畫圖函式并不會進行透明的繪畫,顏色引數也可以是一個整數,是映射到Surface里的像素值,其他繪圖 函式里面的顏色引數也是一樣的,

矩形引數由四個值構成的元組,分別是矩形左上角的x、y坐標,矩形的寬和高,

默認情況下,畫出來的矩形是實心的(中間填充了指定的顏色),如果要畫一個只有邊框的矩形,可以指定一個可選的引數width,比如

pygame.draw.rect(surface, (0,0,255), (100, 200, 100, 100), 2)

可以在螢屏上畫一個邊框是2個像素粗的矩形,中間是透明的,如果不指定這個width引數,或者width指定為0,則畫出來的矩形就是實心的,其他有些繪圖函式里面也有類似的引數,功能也是相似的,

pygame.draw.rect函式回傳一個矩形,表示螢屏上被修改的像素的區域范圍,其它繪圖函式也都有這樣的回傳值,

畫多邊形

用pygame.draw.polygon可以在Surface上畫一個多邊形,比如

pygame.draw.polygon(surface, (255,0,0), [(100, 100),(200, 100),(250,186.6),(200,273.2),(100, 273.2),(50,186.6)])

第三個引數pointlist引數是多邊形頂點的串列,可選的第四個width引數是多邊形的邊的粗細,如果width是0或者被忽略,多邊形是被填充的,

pygame.draw.polygon(surface, (0,255,0), [(100, 100),(200, 100),(250,186.6),(200,273.2),(100, 273.2),(50,186.6)],1)

畫圓

pygame.draw.circle在Surface上畫一個圓形,

pygame.draw.circle(surface, (255,255,0), (100, 100), 50)

第三個引數pos是圓的圓心,第四個引數radius是半徑大小,可選的第五個引數width是圓邊的粗細,如果width預設或者是0圓會被填充,

畫橢圓

pygame.draw.ellipse在矩形區域中畫一個橢圓的形狀,比如

pygame.draw.ellipse(surface, (0,255,255), (200, 200, 200, 100))

第三個引數指定的矩形區域是橢圓填充的區域,可選的第四個引數width是邊的粗細,如果width預設或者是0,橢圓會被填充,

畫弧線

pygame.draw.arc畫橢圓的一段,比如

pygame.draw.arc(surface, (0,255,0), (200, 200, 200, 100), 3.14159/3, 3.14159*2/3)

在Surface上畫一個橢圓狀的弧線,第三個引數rect指定橢圓填充的矩形,接下來兩個角度引數指定起始和終止的角度(以弧度為單位),朝右為0度,可選的第六個引數width是弧線的粗細,默認值是1,

畫線段

pygame.draw.line函式可以畫一條直線段,比如

pygame.draw.line(surface, (255,0,255), (100, 100), (200, 200))

第三個引數指定起點,第四個引數指定終點,可選的第五個引數width指定線的寬度,默認是1,線段終點沒有箭頭,寬的線段終點是方形的,

畫連續的線段

pygame.draw.lines畫多條連續的線段,比如

pygame.draw.lines(surface, (255,255,255), False, [(100, 100), (200, 200), (300, 200), (200, 100)])

第四個引數pointlist是一系列點的串列,如果第三個引數是True,則在最后一點和第一點之間會畫一條線段,可選的第五個引數表示線的寬度,默認為1,這個函式不會畫終點箭頭和中間連接頭,線段有尖銳的拐角,粗的線段會有不太好看的拐角,

畫抗鋸齒的線段

pygame.draw.aaline畫抗鋸齒的線段,

pygame.draw.aaline(surface, (255,255,0), (200, 100), (300, 200))

這個函式的用法和畫線段的函式差不多,只是畫出來的線段有抗鋸齒效果,看上去比較光滑,有一個可選的第五個引數blend,如果blend是True,則陰影部分是和原始像素混合而不是直接覆寫的,這個函式接受浮點數作為點的坐標,

pygame.draw.aalines可以畫多條連續的抗鋸齒線段,

pygame.draw.aalines(surface, (0,0, 255), False, [(100, 100), (200, 200), (300, 100), (200, 0)])

如果第三個引數如果是True,則在第一個點和最后一點之間會畫一條直線,有一個可選的第五個引數blend,如果blend引數是True,則陰影部分是和原始像素混合而不是直接覆寫的,這個函式接受浮點數作為點的坐標,

點操作

畫點的方法和其它方法不太一樣,用Surface.set_at方法完成畫點的操作,比如:

surface.set_at((100, 100), (255,255,255))

第一個引數是點的坐標,第二個引數是顏色,在游戲和實時模擬中,一次取得和設定一個像素是很慢的,

除了可以在Surface上畫點,還可以用Surface.get_at讀取Surface上像素的值,比如

color = surface.get_at((100, 100))

這個函式回傳給定點的顏色值,

填充區域

Surface.fill方法可以用一種顏色填充一個矩形區域,比如

surface.fill((255,0,0), (100, 200, 100, 100))

第一個引數指定要填充的顏色,第二個引數指定填充的矩形區域,如果沒有給定第二個引數,整個Surface會被填充,第二個引數會限制備填充的區域,這個函式會回傳受影響的Surface區域,

寫字

相對于在Surface上畫圖,在Surface上寫文字要復雜得多,

首先需要匯入pygame.font模塊并初始化,

import pygame.fontpygame.font.init()

選擇字體

然后用pygame.font.get_fonts獲取可用的字體的串列,

pygame.font.get_fonts()

它回傳一個字體名字的串列,

然后再用字體名字串列中的一個名字可以創建一個字體物件,

font = pygame.font.SysFont(“monospace”, 12)

第一個引數指定字體的名字,第二個引數指定字體的大小,可選的第三個引數bold指定是否粗體,默認不是粗題,可選的地四個引數italic指定是否斜體,默認不是斜體,

如果是要使用自己給的字體檔案,可以這樣創建字體物件

font = pygame.font.Font("/usr/share/fonts/truetype/arphic/uming.ttf", 12)

第一個引數指定要載入的字體檔案的完整路徑,第二個引數指定字體的大小,

創建文字Surface

使用字體物件的Font.render函式可以創建一個Surface,里面包含寫出來的文字,比如

font_surface = font.render(“Hello world!”, False, (255,0,0))

第 一個引數是要寫的文字,文字只能包含一行,換行符不會被畫出來,第二個引數指定是否使用抗鋸齒效果,如果是True字符會有光滑的邊緣,第三個引數是字體 的顏色,可選的第四個引數background用來指定文字背景的顏色,如果沒有指定background,背景是透明的,回傳創建的Surface,它 上面包含了畫出來的文字,它的大小是能容納這些字的最小的大小,

要在已有的Surface上寫字,只能先創建一個只包含文字的Surface,然后把它blit到已有的Surface上,比如:surface.blit(font_surface, (100, 100))

在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/259556.html

標籤:其他

上一篇:Leetcode刷題 2021.02.12

下一篇:【寒假每日一題】棋盤挑戰(個人練習)詳細題解+推導證明(第十六天)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more