基於Python3-Pygame的乒乓球遊戲

遊戲界面截圖:

在這裏插入圖片描述

按鍵控制:

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

遊戲玩法說明:

開始遊戲以後,按鍵盤W/S按鍵控制球拍上下移動,接住球便可繼續遊戲,沒接住的話遊戲結束。結束後按空格能夠從新開始遊戲ide

使用的文件:

在這裏插入圖片描述
圖片和音樂也能夠沒有,可跳過, 可是遊戲運行後沒音效和圖片。下載音頻和圖片壓縮包,解壓放到代碼相同目錄下,百度網盤 :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 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

乒乓球拍: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 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

主程序: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() 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131

玩一局兒:

在這裏插入圖片描述

認識Pygame

pygame官方文檔

官方幫助文檔https://www.pygame.org/docs/英文文檔,能夠在頁面直接使用翻譯。ui

pygame是什麼

pygame是跨平臺Python模塊,專門爲電子遊戲設計,包含圖像、聲音等;簡單的說它是別人已經編寫好的程序,並放在了一個相似庫裏,專門給別人使用的。spa

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))

 

參考資料:

植物大戰殭屍破解版: http://www.pvzbaike.com/archives/pvz_pojie/

相關文章
相關標籤/搜索