資源簡介 (共46張PPT)Python少兒編程第十章 玩游戲不如自己開發(fā)游戲目錄1.1Python的游戲開發(fā)裝備1.2Pygame大顯身手PART 01Python的游戲開發(fā)裝備Pygame簡介1.1Pygame是一個用于開發(fā)游戲的Python模塊,它是在SDL庫的基礎(chǔ)上開發(fā)的。通過Pygame,用戶可以開發(fā)功能豐富的游戲和多媒體程序。此外,Pygame是一個可移植性很高的模塊,可支持多個操作系統(tǒng),非常適合小游戲的開發(fā)。Pygame是一個由一系列模塊組成的集合包,不同的模塊可以實現(xiàn)游戲中不同的功能, Pygame所有模塊列表如表10-1所示。表10-1 Pygame所有模塊列表Pygame簡介1.1表10-1 Pygame所有模塊列表(續(xù))Pygame第三方庫安裝1.1步驟 1 啟動PyCharm,新建“第10章”項目,然后在菜單欄中選擇“文件”→“設(shè)置”選項,如圖10-1所示。圖10-1 設(shè)置項目Pygame第三方庫安裝1.1步驟 2 打開“設(shè)置”對話框,選擇“項目:第10章”→“Python解釋器”選項,然后在顯示的列表框上方單擊“+”按鈕,如圖10-2所示。圖10-2 選擇安裝項目Pygame第三方庫安裝1.1步驟 3 打開“可用包”對話框,在搜索欄中輸入“pygame”,然后在顯示的列表中選擇“pygame”選項,單擊“安裝包”按鈕,如圖10-3所示。步驟 4 等待安裝,安裝成功后,“可用包”對話框中將顯示“已成功安裝包‘pygame’”,如圖10-4所示。圖10-3 選擇安裝庫 圖10-4 成功安裝Pygame第三方庫安裝1.1步驟 5 關(guān)閉“可用包”對話框,返回“設(shè)置”對話框,在已安裝庫列表中可看到“pygame”,單擊“確定”按鈕即可完成安裝,如圖10-5所示。圖10-5 完成安裝PART 02Pygame大顯身手創(chuàng)建窗口2.1所有游戲都在一個固定的窗口(或屏幕)進行操作,故開發(fā)游戲的第一步就是創(chuàng)建窗口。pygame.display模塊提供了set_mode()方法用于初始化一個窗口,其方法原型如下。set_mode(resolution=(0,0)[, flags=0, depth=0])其中,resolution是一個二元組,表示寬和高,單位為像素;flags用于指定擴展選項,可同時指定多個選項(使用“|”操作符隔開),具體選項如表10-2所示;depth表示顏色深度,如果缺省,系統(tǒng)會自動選擇一個最優(yōu)值。該方法返回一個Surface對象(即Pygame用來表示圖像的對象)。創(chuàng)建窗口2.1表10-2 flags可用的選項創(chuàng)建窗口2.1pygame.image模塊提供了load()方法用于加載圖片,其方法原型如下。load(filename)其中,filename為加載的圖片的名稱(可包含路徑)。該方法返回一個Surface對象。圖片加載完成后,并不是顯示在窗口中,而是轉(zhuǎn)換成一個Surface對象,想要將其在窗口上顯示,須使用pygame.surface模塊中的blit()方法將一個圖像繪制到另一個圖像上,其方法原型如下。blit(source, dest[, area=None, special_flags = 0])其中,source為Surface對象(即顯示的圖片);dest為坐標值,一般為source的左上角坐標;area為圖片繪制的區(qū)域;special_flags用于指定混合模式。加載圖片2.2pygame.image模塊提供了load()方法用于加載圖片,其方法原型如下。load(filename)其中,filename為加載的圖片的名稱(可包含路徑)。該方法返回一個Surface對象。圖片加載完成后,并不是顯示在窗口中,而是轉(zhuǎn)換成一個Surface對象,想要將其在窗口上顯示,須使用pygame.surface模塊中的blit()方法將一個圖像繪制到另一個圖像上,其方法原型如下。blit(source, dest[, area=None, special_flags = 0])其中,source為Surface對象(即顯示的圖片);dest為坐標值,一般為source的左上角坐標;area為圖片繪制的區(qū)域;special_flags用于指定混合模式。加載圖片2.2【例10-1】 創(chuàng)建一個窗口,并加載一張圖片作為背景。【問題分析】 首先,使用import語句導(dǎo)入所需模塊(如pygame、sys);接著,初始化pygame;然后,創(chuàng)建窗口、設(shè)置窗口標題、加載背景圖片、繪制圖形及刷新繪圖;最后,程序進入無限循環(huán),判斷是否獲取退出事件,如果是,則退出程序。【參考代碼】import pygame, sys #導(dǎo)入模塊pygame.init() #初始化pygamescreen = pygame.display.set_mode((400, 200)) #設(shè)置窗口大小pygame.display.set_caption('貪吃蛇') #設(shè)置窗口標題加載圖片2.2【參考代碼】(續(xù))#加載背景圖片background = pygame.image.load('images\\貪吃蛇.jpg')screen.blit(background, (0, 0)) #將背景繪制到窗口的(0,0)位置pygame.display.update() #刷新繪圖while True: #循環(huán)for event in pygame.event.get(): #獲取事件并遍歷if event.type == pygame.QUIT: #如果為退出事件pygame.quit() #退出pygamesys.exit() #退出系統(tǒng)加載圖片2.2【運行結(jié)果】 程序運行結(jié)果如圖10-6所示。圖10-6 例10-1程序運行結(jié)果繪制圖形2.3pygame.draw模塊中常用的方法如表10-3所示。表10-3 pygame.draw模塊中常用的方法繪制圖形2.3表10-3 pygame.draw模塊中常用的方法(續(xù))繪制圖形2.3【例10-2】 繪制多種圖形。【參考代碼】#導(dǎo)入模塊和常量import pygame, sysfrom math import pipygame.init() #初始化pygamescreen = pygame.display.set_mode((520, 250)) #設(shè)置窗口大小pygame.display.set_caption('繪制圖形') #設(shè)置窗口標題#定義顏色BLACK = (0, 0, 0)WHITE = (255, 255, 255)RED = (255, 0, 0)繪制圖形2.3【參考代碼】(續(xù))GREEN = (0, 255, 0)BLUE = (0, 0, 255)screen.fill(WHITE) #設(shè)置背景顏色#繪制一條線pygame.draw.line(screen, RED, [10, 10], [50, 10], 2)#繪制一條抗鋸齒的線pygame.draw.aaline(screen, GREEN, [10, 50], [50, 50], True)#繪制一條折線pygame.draw.lines(screen,BLACK,False,[[75,10],[125,10],[125,50]],5)#繪制一條閉環(huán)折線pygame.draw.lines(screen,BLACK,True,[[150,10],[200,10],[200,50]],5)#繪制一個矩形框繪制圖形2.3【參考代碼】(續(xù))pygame.draw.rect(screen, BLUE, [225, 10, 50, 40], 2)#繪制一個矩形pygame.draw.rect(screen, BLUE, [300, 10, 50, 40])#繪制一個橢圓框pygame.draw.ellipse(screen, RED, [375, 10, 50, 40], 2)#繪制一個橢圓pygame.draw.ellipse(screen, RED, [450, 10, 50, 40])#繪制多邊形(三角形)pygame.draw.polygon(screen,BLACK,[[10,200],[120,100],[150,200]],5)繪制圖形2.3【參考代碼】(續(xù))#繪制多條弧線pygame.draw.arc(screen, BLACK, [200, 90, 150, 125],0,pi/2,2)pygame.draw.arc(screen, GREEN, [200, 90, 150, 125],pi/2,pi,2)pygame.draw.arc(screen, BLUE, [200, 90, 150, 125],pi,3*pi/2,2)pygame.draw.arc(screen, RED, [200, 90, 150, 125],3*pi/2,2*pi,2)#繪制一個圓pygame.draw.circle(screen, BLUE, [450, 150], 60, 2)#刷新繪圖pygame.display.update()while True: #循環(huán)for event in pygame.event.get(): #獲取事件并遍歷if event.type == pygame.QUIT: #如果為退出事件pygame.quit() #退出pygamesys.exit() #退出系統(tǒng)繪制圖形2.3【運行結(jié)果】 程序運行結(jié)果如圖10-7所示。圖10-7 例10-2程序運行結(jié)果設(shè)置動畫效果2.4物體移動的原理很簡單,即在原有坐標的基礎(chǔ)上增加偏移量,再重新繪制圖片,依次一張一張地循環(huán)繪制下去,就可以得到物體移動的效果。此外,需要考慮兩個畫面之間的時間間隔,即經(jīng)過多長時間繪制下一張圖片。pygame.time模塊提供了一個Clock對象,使用其tick()方法可解決上述問題。(1)通過pygame.time.Clock()方法創(chuàng)建對象獲得pygame的時鐘。(2)使用pygame.time.Clock.tick(FPS)方法設(shè)置pygame時鐘的時間間隔。設(shè)置動畫效果2.4【例10-3】 設(shè)置動畫效果示例。【參考代碼】import pygame, sys #導(dǎo)入模塊pygame.init() #初始化pygameFPS = 30 #設(shè)置幀率fpsClock = pygame.time.Clock() #創(chuàng)建時鐘對象screen = pygame.display.set_mode((500, 400)) #設(shè)置窗口大小pygame.display.set_caption('動畫') #設(shè)置窗口標題WHITE = (255, 255, 255) #定義顏色img = pygame.image.load('images\\球.png') #加載圖片imgx, imgy = 10, 10 #初始化圖片的位置direction = 'right' #初始化圖片的移動方向設(shè)置動畫效果2.4【參考代碼】(續(xù))while True: #循環(huán)screen.fill(WHITE) #背景填充為白色if direction == 'right': #如果圖片向右移動imgx += 5 #圖片x坐標加5if imgx == 420: #如果圖片x坐標等于420direction = 'down' #設(shè)置方向為向下elif direction == 'down': #如果圖片向下移動imgy += 5 #圖片y坐標加5if imgy == 320: #如果圖片y坐標等于320direction = 'left' #設(shè)置方向為向左elif direction == 'left': #如果圖片向左移動imgx -= 5 #圖片x坐標減5if imgx == 0: #如果圖片x坐標等于0direction = 'up' #設(shè)置方向為向上設(shè)置動畫效果2.4【參考代碼】(續(xù))elif direction == 'up': #如果圖片向上移動imgy -= 5 #圖片y坐標減5if imgy == 0: #如果圖片y坐標等于0direction = 'right' #設(shè)置方向為向右screen.blit(img, (imgx, imgy)) #繪制圖片for event in pygame.event.get(): #獲取事件并遍歷if event.type == pygame.QUIT: #如果為退出事件pygame.quit() #退出pygamesys.exit() #退出系統(tǒng)pygame.display.update() #刷新繪圖fpsClock.tick(FPS) #設(shè)置時鐘的時間間隔設(shè)置動畫效果2.4【運行結(jié)果】 運行程序,可以看到小球自左往右、自上往下、自右往左、自下往上循環(huán)移動,部分顯示結(jié)果如圖10-8所示。圖10-8 例10-3程序運行結(jié)果播放聲音2.5播放音效使用pygame.mixer模塊,須首先創(chuàng)建一個Sound對象,其語法格式如下。Sound(filename)其中,filename為音頻文件名(可包含路徑)。創(chuàng)建Sound對象后,可使用play()方法播放音效。Sound對象的常用方法如表10-4所示。表10-4 Sound對象的常用方法播放聲音2.5播放背景音樂使用pygame.music模塊,它是pygame.mixer模塊的一個特殊實現(xiàn),使用時須通過pygame.mixer.music調(diào)用其方法。pygame.music模塊的常用方法如表10-5所示。表10-5 pygame.music模塊的常用方法播放聲音2.5【例10-4】 播放聲音示例。【參考代碼】import pygame, sys #導(dǎo)入模塊pygame.init() #初始化pygamescreen = pygame.display.set_mode((400, 300)) #設(shè)置窗口大小pygame.display.set_caption('播放聲音') #設(shè)置窗口標題background = pygame.image.load('images\\煙花.jpg') #加載背景圖片screen.blit(background, (0, 0)) #繪制背景sound = pygame.mixer.Sound('sounds\\燃放煙花.wav') #創(chuàng)建音效對象pygame.display.update() #刷新繪圖播放聲音2.5【參考代碼】(續(xù))#加載背景音樂文件pygame.mixer.music.load('sounds\\新年好.mp3')#播放背景音樂,第一個參數(shù)為播放的次數(shù)(-1表示無限循環(huán)),第二個參數(shù)是設(shè)置播放的起點(單位為秒)pygame.mixer.music.play(-1, 0.0)while True: #循環(huán)sound.play() #播放音效for event in pygame.event.get(): #獲取事件并遍歷if event.type == pygame.QUIT: #如果為退出事件pygame.mixer.music.stop() #停止播放背景音樂pygame.quit() #退出pygamesys.exit() #退出系統(tǒng)播放聲音2.5【運行結(jié)果】 運行程序,出現(xiàn)主界面(見圖10-9),然后直接播放音效和背景音樂。圖10-9 例10-4程序運行結(jié)果顯示文字2.6如果想要將文字顯示到屏幕上,須首先使用pygame.font模塊中的Font()方法創(chuàng)建一個Font對象,其語法格式如下。Font(filename, size)其中,filename為字體文件名稱(一般為“.ttf”格式);size為字體的大小,單位為像素。創(chuàng)建Font對象后,須使用render()方法返回一個Surface對象繪制文本,其語法格式如下。render(text, antialias, color[, background=None])其中,text為要顯示的文字;antialias是個布爾值,表示是否開啟抗鋸齒,當為True時字體比較平滑;color為文字顏色;background為背景顏色。最后還須使用blit()方法顯示文字。顯示文字2.6【例10-5】 顯示文字示例。【參考代碼】import pygame, sys #導(dǎo)入模塊pygame.init() #初始化pygamescreen = pygame.display.set_mode((260, 100)) #設(shè)置窗口大小pygame.display.set_caption('顯示文字') #設(shè)置窗口標題#定義顏色WHITE = (255, 255, 255)RED = (255, 0, 0)GREEN = (0, 255, 0)#創(chuàng)建字體對象font = pygame.font.Font('fonts\\simkai.ttf', 30)顯示文字2.6【參考代碼】(續(xù))#設(shè)置顯示的文字,創(chuàng)建文字對象textSurface = font.render('恭喜你,你贏了!', True, GREEN, RED)screen.fill(WHITE) #背景填充為白色textRect = textSurface.get_rect() #獲取文字對象的recttextRect.center = (130, 50) #設(shè)置文字對象的中心坐標screen.blit(textSurface, textRect) #繪制文字pygame.display.update() #刷新繪圖while True: #循環(huán)for event in pygame.event.get(): #獲取事件并遍歷if event.type == pygame.QUIT: #如果為退出事件pygame.quit() #退出pygamesys.exit() #退出系統(tǒng)顯示文字2.6【運行結(jié)果】 運行程序,窗口中顯示綠色的“恭喜你,你贏了!”文字,其背景色為紅色,如圖10-10所示。圖10-10 例10-5程序運行結(jié)果事件處理2.7Pygame會接收用戶各種操作(如按下或釋放按鍵、移動鼠標、按下或釋放鼠標等)產(chǎn)生的事件。事件隨時可能發(fā)生,Pygame將一系列事件存放在一個事件隊列里,然后通過for循環(huán)取出每一個事件與產(chǎn)生的事件進行比較,如果相等則處理產(chǎn)生的事件。一般可使用pygame.event模塊中的get()方法來獲取所有事件,Pygame中常用的事件如表10-6所示。事件處理2.7表10-6 Pygame中常用的事件事件處理2.7【例10-6】 事件處理示例。【參考代碼】import pygame, sys #導(dǎo)入模塊pygame.init() #初始化pygamescreen = pygame.display.set_mode((400, 300)) #設(shè)置窗口大小pygame.display.set_caption('事件處理') #設(shè)置窗口標題image = pygame.image.load('images\\蝴蝶.png') #加載圖片WHITE = (255, 255, 255) #定義顏色x, y = 200, 150 #初始化圖片位置事件處理2.7【參考代碼】(續(xù))while True: #循環(huán)for event in pygame.event.get(): #獲取事件并遍歷#如果移動鼠標,獲得鼠標當前位置if event.type == pygame.MOUSEMOTION:x = event.pos[0]y = event.pos[1]#如果按下鼠標,輸出鼠標按下位置if event.type == pygame.MOUSEBUTTONDOWN:print('按下鼠標:', event.pos)#如果釋放鼠標,輸出鼠標釋放的位置if event.type == pygame.MOUSEBUTTONUP:print('釋放鼠標:', event.pos)事件處理2.7【參考代碼】(續(xù))#如果按下按鍵if event.type == pygame.KEYDOWN:#如果按鍵為方向鍵,輸出對應(yīng)的方向if event.key == pygame.K_UP:print('上')if event.key == pygame.K_DOWN:print('下')if event.key == pygame.K_LEFT:print('左')if event.key == pygame.K_RIGHT:print('右')事件處理2.7【參考代碼】(續(xù))#如果按鍵為Esc鍵if event.key == pygame.K_ESCAPE:pygame.quit() #退出pygamesys.exit() #退出系統(tǒng)screen.fill(WHITE) #背景填充為白色screen.blit(image, (x, y)) #繪制圖片pygame.display.update() #刷新繪圖事件處理2.7【運行結(jié)果】 運行程序,出現(xiàn)加載圖片的窗口,當鼠標在窗口上移動時,圖片隨著鼠標移動,如圖10-11所示。單擊窗口上的任意位置,輸出鼠標按下和釋放時的坐標;按下“上”“下”“左”“右”方向鍵,輸出相應(yīng)的“上”“下”“左”“右”信息;按下“Esc”鍵,退出程序,如圖10-12所示。圖10-11 窗口界面 圖10-12 輸出信息感謝觀看 展開更多...... 收起↑ 資源預(yù)覽 縮略圖、資源來源于二一教育資源庫