游戲界面截圖:

按鍵控制:
空格: 暫停/開始
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
標籤:其他
