<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Pygame搭建遊戲視窗主要為如下幾步
在使用Pygame程式設計之前,我們要對程式進行初始化,程式碼如下
pygame.init()
該程式碼是整個程式的第一句程式碼,它的作用是自動檢測Pygame軟體包是否正常,並完成包括display(顯示卡模組),font(字型模組),mixer(聲音模組),cursors(遊標控制模組)等的模組的初始化
Surface是Pygame程式設計的視窗介面,類似畫布,影象和文字可以顯示在Surface上,建立方式主要有以下方式
(1)建立Surface物件:
#也可以叫做screen物件,本質上是一個Surface物件 screen = pygame.display.set_mode(400,400)
(2)建立一個帶文字的Surface物件:
#建立一個包含文字的Surface物件 text = f.render("小馬哥不馬虎",True,(255,255,255),(0,0,0)) #通過blit方法將其繪製出來,textRect表示位置座標 screen.blit(text,textRect)
(3)建立一個包含影象的Surface物件:
surface_image = pygame.image.load("圖片路徑")
一個好的遊戲少不了遊戲與人的互動,通過事件,人按自己的想法對遊戲進行互動
如下是一個關閉遊戲的簡單互動:
#所有get()獲取事件 for event in pygame.event.get(): #判斷事件型別 if event.type == pygame.QUIT: pygame.quit()
程式碼:
while True: for event in pymage.event.get(): if event.type == pygame.QUIT: pymage.quit() sys.exit() #更新並繪製螢幕內容 pygame.display.flip()
Pygame使用pygame.display顯示模組中的方法建立遊戲的主視窗:
格式:
screen = pygame.display.set_mode(size=(),flags=0)
·size:用來設定視窗的大小
·flags:功能標誌位,表示建立的主視窗樣式,flags引數如下:
flags引數
標誌位 | 功能 |
pygame.FULLSCREEN | 建立一個全螢幕視窗 |
pygame.HWSURFACE | 建立一個硬體加速視窗,必須和FULLSCREEN同時使用 |
pygame.OPENGL | 建立一個OPENGL渲染視窗 |
pygame.RESIZABLE | 建立一個可以改變大小的視窗 |
pygame.DOUBLEBUF | 建立一個雙緩衝視窗,建議在HWSURFACE或OPENGL時使用 |
pygame.NOFRAME | 建立一個沒有邊框的視窗 |
程式碼:
scrren.blit(source,dest,area=None,special_flage=0)
·source:表示要貼上的Surface物件
·dest:主視窗一個標識的座標位置
·area:接受一個Rect物件,預設為None,如果提供該引數則相當於摳圖操作,即在螢幕的指定位置顯示想要的內容
·special_flags:可選引數,用於指定對應位置顏色的混合方式
screen = pygame.display.set_mode(400,400)
screen.fill((156,156,156))
pygame.display.set.caption('小馬哥不馬虎')
pygame.display.flip()
方法名稱 | 說明 |
pygame.display.get_surface() | 獲取當前顯示的Surface物件 |
pygame.display.flip() | 更新整個待顯示的Surface物件到螢幕上 |
pygame.display.update() | 更新部分軟體介面顯示 |
pygame.display.lnfo() | 產生一個VideInfo物件,包含了顯示介面的相關資訊 |
pygame.display.set_icon() | 設定左上角的遊戲圖示,圖示尺寸大小為32*32 |
pygame.display.iconify() | 將顯示的主視窗即Surface物件最小化,或者隱藏 |
pygame.display.get_active() | 當前顯示介面顯示在螢幕上時返回True,如果視窗被隱藏和最小化時則返回False |
語法格式:
Surface=pygame.Surface(size=(width,height),flags,depth)
·size:表示Surface物件的矩形區域大小
·flage:功能標誌位,有兩個可選引數值HWSURFACE和SPCALPHA,前者代表將建立的Surface物件存放於視訊記憶體中,後者表示讓影象的每一個畫素包含一個alpha通道
·depth:指定畫素的顏色深度,預設為自適應模式,由Pygame自動調節
程式碼範例:
import pygame import sys pygame.init() #設定主視窗 screen = pygame.display.set_mode((400,400)) screen.fill('blue') #設定視窗標題 pygame.display.set_caption('小馬哥不馬虎') #建立一個影象 face = pygame.Surface((60,60),flags=pygame.HWSURFACE) #填充影象 face.fill(color='pink') while True: for event in pygame.event.get(): if event.type==pygame.QUIT: pygame.quit() sys.exit() #將影象新增到主螢幕上 screen.blit(face,(100,100)) #更新螢幕內容 pygame.display.flip()
效果:
語法格式:
pygame.image.load('圖片路徑').convert()
程式碼範例:
import pygame import sys pygame.init() #設定主視窗 screen = pygame.display.set_mode((400,400)) screen.fill('white') #設定視窗標題 pygame.display.set_caption('小馬哥不馬虎') #載入圖片 image_surface = pygame.image.load('C:/Users/myun/Pictures/不知火舞.jpg') image_surface.fill((0,0,255),rect=(100,100,100,50),special_flags=0) image_surface.scroll(100,60) #移動圖片 while True: for event in pygame.event.get(): if event.type==pygame.QUIT: pygame.quit() sys.exit() #將影象新增到主螢幕上 screen.blit(image_surface,(0,0)) #更新螢幕內容 pygame.display.flip()
效果圖:
Surface模組處理影象方法:
方法 | 說明 |
pygame.Surface.blit() | 將一個影象繪製到另一個影象上 |
pygame.Surface.convert() | 修改影象的格式 |
pygame.Surface.fill() | 使用純色填充Surface影象 |
pygame.Surface.scroll() | 複製並移動Surface物件 |
pygame.Surface.set_alpha() | 設定整個影象的透明度 |
pygame.Surface.get_at() | 獲取一個畫素的顏色值 |
pygame.Surface.set_at() | 設定一個畫素的顏色值 |
pygame.Surface.get_palette() | 獲取Surface物件8位元索引的調色盤 |
pygame.Surface.map_rgb() | 將一個RGBA顏色轉換為對映的顏色值 |
pygame.Surface.set_clip() | 設定該Surface物件的剪下區域 |
pygame.Surface.subsurface() | 根據父物件建立一個新的子Surface物件 |
pygame.Surface.get_offset() | 獲取子Surface物件在父物件中的偏移量 |
pygame.Surface.get_size() | 獲取Surface物件的大小 |
Transform方法
方法 | 說明 |
pygame.transform.scale() | 將圖片縮放至指定的大小,並返回一個新的Surface物件 |
pygame.transform.rotate() | 將圖片旋轉至指定角度 |
pygame.transform.rotozoom() | 以角度旋轉影象,同時將影象縮小或放大至指定的倍數 |
1.遊戲暫停
Pygame.time模組提供以下常用方法
方法 | 說明 |
pygam.time.get_ticks() | 以毫秒為單位獲取時間 |
pygame.time.wait() | 使程式暫停一段時間 |
pygame.time.set_time() | 建立一個定時器,即每隔一段時間就去執行一些動作 |
pygame.time.Clock() | 建立一個時間物件來幫助我們確定遊戲要以多大的幀數執行 |
程式碼範例:
import pygame pygame.init() screen =pygame.display.set_mode((500,400)) pygame.display.set_caption('時間設定') #獲取時間 t=pygame.time.get_ticks() #暫停遊戲3000毫秒 t1=pygame.time.wait(3000) print(t1) image_surface=pygame.image.load('C:/Users/myun/Pictures/不知火舞.jpg') while True: for event in pygame.event.get(): if event.type==pygame.QUIT: exit() screen.blit(image_surface,(0,0)) pygame.display.update()
效果:三秒後載入圖片
Clock()方法可以實現對遊戲幀數的設定
方法 | 說明 |
pygame.time.Clock.tick() | 更新clock物件 |
pygame.time.Clock.get_time() | 獲取上一個tick中的時間 |
pygame.time.Clock.get_fps() | 計算clock物件的幀數 |
程式碼範例:
import pygame pygame.init() screen =pygame.display.set_mode((500,400)) pygame.display.set_caption('時間設定') #獲取時間 t=pygame.time.get_ticks() #暫停遊戲3000毫秒 t1=pygame.time.wait(3000) print(t1) image_surface=pygame.image.load('C:/Users/myun/Pictures/不知火舞.jpg') #建立時間物件 clock = pygame.time.Clock() while True: #通過時間物件指定迴圈幀數,每秒迴圈60次 clock.tick(60) for event in pygame.event.get(): if event.type==pygame.QUIT: exit() screen.blit(image_surface,(0,0)) pygame.display.update()
注:遊戲幀數中在動態圖時才顯現出來
Rect()方法建立一個指定位置,指定大小的矩形區域
語法格式:
Rect=pygame.Rect(left,top,width,height)
程式碼範例:
import pygame pygame.init() screen = pygame.display.set_mode((500,300)) pygame.display.set_caption('小馬哥不馬虎') image_surface = pygame.image.load("C:/Users/myun/Pictures/bg.jpg") rect1 = pygame.Rect(50,50,100,100) # 在原圖的基礎上建立一個新的子圖(surface物件) image_child= image_surface.subsurface(rect1) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: exit() #在螢幕上顯示子圖的區域 screen.blit(image_child,rect1) pygame.display.update()
效果:在圖片上擷取了一個和Rect1同樣大小的矩形區域
Rect對其他常用方法:
方法 | 說明 |
pygame.Rect.copy() | 複製矩形 |
pygame.Rect.move() | 移動矩形區域,接受一個列表引數 |
pygame.Rect.move_ip() | 移動矩形(無返回) |
pygame.Rect.inflate() | 增大或縮小矩形 |
pygame.Rect.clamp() | 將矩形移動到另一個矩形內 |
pygame.Rect.union() | 返回兩個矩形合併後的矩形 |
pygame.Rect.fit() | 按橫縱比調整矩形或移動矩形 |
pygame.Rect.contains() | 測試一個矩形是否在另個矩陣內 |
pygame.Rect.collidepoint() | 測試點是否在矩形中 |
pygame.Rect.colliderect() | 測試兩個矩形是否重疊 |
通過事件型別,可以有序的,逐一的處理使用者的操作
事件
事件型別 | 描述 | 成員屬性 |
QOUIT | 使用者按下視窗的關閉按鈕 | none |
ATIVEEVENT | Pygame被啟用或者隱藏 | gain,state |
KEYDOWN | 鍵盤按下 | unicode,key,mod |
KEYUP | 鍵盤釋放 | key,mod |
MOUSEMOTION | 滑鼠移動 | pos,rel,button |
MOUSEBUTTONDOWN | 滑鼠按下 | pos,button |
MOUSEBUTTONUP | 滑鼠放開 | pos,button |
JOYAXISMOTION | 遊戲手柄(Joystick or pad)移動 | joy,axis,value |
JOYBALLMOTION | 遊戲球(Joy ball)移動 | joy,axis,value |
JOYHATMOTION | 遊戲手柄(Joystick)移動 | joy,axis,value |
JOYBUTTONDOWN | 遊戲手柄按下 | joy,button |
JOYBUTTONUP | 遊戲手柄放開 | joy,button |
VIDEORESIZE | pygame視窗縮放 | size,w,h |
VIDEOEXPOSE | Pygame視窗部分公開 | none |
USEREVENT | 觸發一個使用者事件 | 事件程式碼 |
Pygam.event模組提供了處理事件的常用方法,如下:
方法 | 說明 |
pygame.event.get() | 從事件佇列獲取一個事件,並在事件佇列中刪除該事件 |
pygame.event.wait() | 阻塞直至事件發生才會繼續執行,若沒有事件發生將一直處於阻塞狀態 |
pygame.event.set_blocked() | 控制哪些事件禁止進入佇列,如果引數值為None,則表示禁止所有事件進入 |
pygame.event.pump() | 呼叫該方法後,Pygame會自動處理事件佇列 |
pygame.event.poll() | 會根據實際情況返回一個真實的事件,或者一個None |
pygame.event.peek() | 檢測某類事件是否在佇列中 |
pygame.event.clear() | 從佇列中清除所有的事件 |
pygame.event.get_blocked() | 檢測某一型別的事件是否被禁止進入佇列 |
pygame.event.post() | 放置一個新的事件在佇列中 |
pygame.event.Event() | 建立一個使用者自定義的事件 |
pygame.event.set_allowed() | 控制哪些事件允許進入佇列 |
鍵盤事件通過一個key屬性,通過該屬性可以獲取鍵盤的按鍵,如下是鍵盤按鍵的常數:
常數名 | 描述 |
K_BACKSPACE | 退格鍵(Backspace) |
K_TAB | 製表鍵(Tab) |
K_CLEAR | 清除鍵(Clear) |
K_RETURN | 確認鍵(Enter) |
K_PAUSE | 暫停鍵(Pause) |
K_ESCAPE | 退出鍵(Escape) |
K_SPACE | 空格鍵(Space) |
K_0~K_9 | 0~9 |
K_a~k_z | a~z |
K_DELETE | 刪除鍵(delete) |
K_KP0~K_KP9 | 小鍵盤的0~9 |
K_F1~K_F15 | F1~F15 |
K_UP | 向上箭頭 |
K_DOWN | 向下箭頭 |
K_RIGHT | 向右箭頭 |
K_LEFT | 向左箭頭 |
KMOD_ALT | 同時按下Alt鍵 |
事件 | 說明 |
MOUSEMOTION | 滑鼠按下 |
MOUSEBUTTONDOWN | 滑鼠釋放 |
MOUDEBUTTONUP | 滑鼠釋放 |
import pygame from random import randint # 初始化程式 pygame.init() screen = pygame.display.set_mode((450,400)) # 更新顯示 pygame.display.flip() while True: #等待事件發生 event = pygame.event.wait() if event.type == pygame.QUIT: exit("成功退出") if event.type == pygame.MOUSEBUTTONDOWN: # pos 獲取滑鼠當前位置 print('滑鼠按下',event.pos) mx,my = event.pos # 呼叫 pygame.draw 模組畫圓 pygame.draw.circle(screen,(255,255,0),(mx,my),50) # 處理完,更新顯示 pygame.display.update() if event.type == pygame.MOUSEBUTTONUP: print('滑鼠彈起') pass if event.type == pygame.MOUSEMOTION: print('滑鼠移動') mx, my = event.pos # 隨機生成 RGB 顏色值 r = randint(0,255) g = randint(0,255) b = randint(0,255) pygame.draw.circle(screen, (r,g,b,),(mx, my), 50) # 處理完,更新顯示 pygame.display.update()
語法格式:
pygame.draw.rect(surface,color,rect,width)
·surface:指主視窗
·color:該引數用於圖形著色
·rect:繪製圖形的位置和大小
·width:可選引數,指定邊框的寬度,預設為0,表示填充該矩形區域
注:當width>0時,表示線框的寬度,而width<0時,此時不會繪製任何圖形
語法格式:
pygame.draw.polygon(surface,color,points,width)
其餘引數與上面相同,points表示組成多邊形的多個(x,y)座標
語法格式:
pygame.circle(surface,color,pos,radius,width=0)
·pos:該引數用來指定圓心的位置
·radius:用來指定圓的半徑
語法格式:
pygame.draw.ellipse(surface,Rect,width=0)
語法格式:
pygame.draw.arc(Surface,color,Rect,start_angle,stop_angle,width=1)
·start_angle:該段該段圓弧的起始角度
·stop_angle:終止角度
語法格式:
一條直線:
pygame.draw.line(surface,color,start_pos,end_pos,width=1)
·start_pos和end_pos:表示線段的起始位置和結束位置(x,y)
·width=1:表示直線的寬度,預設為1
一條消除鋸齒的平滑線:
pygame.aaline(surface,color,start_pos,end_pos,blend=1)
多條直線:
pygame.line(surface,color,closed,pointlist,width=1)
·pointlist:參數列,包含了一些列點座標的列表
·closed:布林引數,如果設定為True,表示直線的第一個端點和直線的最後一個端點要首尾相連
多條抗鋸齒直線:
pygame.draw.aalines(surface,color,closed,pointlist,blend=1)
繪圖方法總彙:
pygame.draw模組繪圖方法
方法 | 說明 |
pygame.draw.rect() | 繪製矩陣 |
pygame.draw.polygon() | 繪製多邊形 |
pygame.draw.circle() | 根據圓心和半徑繪製圓形 |
pygame.draw.ellipse() | 繪製一個橢圓形 |
pygame.draw.arc() | 繪製弧線 |
pygame.draw.line() | 繪製線段 |
pygame.draw.ines() | 繪製多條連續的線段 |
pygame.draw.aaline() | 繪製一條平滑的線段(抗鋸齒) |
pygame.draw.aalines() | 繪製多條連續的線段 |
程式碼範例:
import pygame from math import pi #初始化 pygame.init() # 設定主螢幕大小 size = (500, 450) screen = pygame.display.set_mode(size) # 設定一個控制主迴圈的變數 done = False #建立時鐘物件 clock = pygame.time.Clock() while not done: # 設定遊戲的fps clock.tick(10) for event in pygame.event.get(): if event.type == pygame.QUIT: done = True # 若檢測到關閉視窗,則將done置為True # 繪製一條寬度為 3 的紅色對角線 pygame.draw.line(screen, (0, 255, 0), [0, 0], (500, 450), 3) # 繪製多條藍色的直線(連續直線,非抗鋸齒),False 表示首尾不相連 pygame.draw.lines(screen, (0, 0, 255), False, [[0, 80], [50, 90], [200, 80], [220, 30]], 1) # 繪製一個灰色的矩形區域,以灰色填充區域 pygame.draw.rect(screen, (155, 155, 155), (75, 10, 50, 20), 0) # 繪製一個線框寬度為2的矩形區域 pygame.draw.rect(screen, (0, 0, 0), [150, 10, 50, 20],2) # 繪製一個橢圓形,其線寬為2 pygame.draw.ellipse(screen, (255, 0, 0), (225, 10, 50, 20), 2) # 繪製一個實心的紅色橢圓形 pygame.draw.ellipse(screen, (255, 0, 0), (300, 10, 50, 20)) # 繪製一個綠色邊框(寬度為2)三角形 pygame.draw.polygon(screen, (100, 200, 45), [[100, 100], [0, 200], [200, 200]], 2) # 繪製一個藍色實心的圓形,其中[60,250]表示圓心的位置,40為半徑,width預設為0 pygame.draw.circle(screen, (0, 0, 255), [60, 250], 40) # 繪製一個圓弧,其中0表示弧線的開始位置,pi/2表示弧線的結束位置,2表示線寬 pygame.draw.arc(screen, (255, 10, 0), (210, 75, 150, 125), 0, pi / 2, 2) # 重新整理顯示螢幕 pygame.display.flip() # 點選關閉,退出pygame程式 pygame.quit()
效果圖:
font模組可以繪製字型
·pygame.font.Font(filename,size):獲取字型
·pygame.font.Font.render(text,antialias,color,background=None):顯示字型
·get_rect():獲取座標物件
範例:
import pygame,sys from pygame.locals import * pygame.init() surface = pygame.display.set_mode((500, 400), 0, 32) pygame.display.set_caption("文字繪製") surface.fill((255, 255, 255)) # 獲取字型物件,可以獲取系統自帶的,也可以自定義字型 fonts = pygame.font.get_fonts() fonts = 'fonts/ARBERKLEY.ttf' basicFont = pygame.font.SysFont(fonts, 50) # surface物件 text = basicFont.render('這是一串字元', True, (255,255,255), (0,255,0)) # 設定文字位置 textRect = text.get_rect() textRectObj.center = (250, 200) # 將渲染的surface物件更新到螢幕上 surface.blit(text,textRect) # 程式主迴圈 while True: # 獲取事件 for event in pygame.event.get(): # 判斷事件是否為退出事件 if event.type == QUIT: # 退出pygame pygame.quit() # 退出系統 sys.exit() # 繪製螢幕內容 pygame.display.update()
mixer音訊模組
·pygame.mixer.Sound(filename):播放特效音
·pygame.mixer.music.load(filename):載入背景音樂
程式碼範例:
import pygame, sys from pygame.locals import * # 初始化pygame pygame.init() # 設定視窗的大小,單位為畫素 screen = pygame.display.set_mode((500, 400)) # 設定視窗的標題 pygame.display.set_caption('音訊播放') # 設定背景 screen.fill((255, 255, 255)) # 載入並播放一個特效音訊檔 sound = pygame.mixer.Sound('C:/Users/myun/Music/狙擊槍.wav') sound.play() # 載入背景音樂檔案 pygame.mixer.music.load('C:/Users/myun/Music/Oh The Larceny - Light That Fire.mp3') # 播放背景音樂,第一個引數為播放的次數(-1表示無限迴圈),第二個引數是設定播放的起點(單位為秒) pygame.mixer.music.play(-1, 0.0) # 程式主迴圈 while True: # 獲取事件 for event in pygame.event.get(): # 判斷事件是否為退出事件 if event.type == QUIT: # 停止播放背景音樂 pygame.mixer.music.stop() # 退出pygame pygame.quit() # 退出系統 sys.exit() # 繪製螢幕內容 pygame.display.update()
到此這篇關於python遊戲庫pygame經典教學的文章就介紹到這了,更多相關python遊戲庫pygame內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45