python編程學習--Pygame - Python遊戲編程入門(0)---轉載
原文地址:https://www.cnblogs.com/wuzhanpeng/p/4261015.html
引言
博客剛開,想把最近學習的東西記錄下來,算是一種筆記。最近打算開始學習Python,因為我感覺Python是一門很有意思的語言,很早以前就想學了(礙於懶),它的功能很強大,你可以用它來做科學運算,或者數字圖像處理,或者任務的自動化,還可以構建動態網站,很多很多聽起來就很有意思的實現。關於Python你還可以找到更多的資料,這裏不一一贅述。
一說到開始學習一門新的編程語言,很多童鞋可能馬上想到,“嗯,哥去買本書啃啃!”,結果買了本大部頭,全是枯燥的語法知識,看了後面忘了前面,事倍功半。記得以前有位朋友跟我說,想學一門新技術,從做一個項目開始,這句話還是很值得思考的!(作沈思狀(`?ω?´))所以!入正題了!我們不如做個小遊戲吧,熟悉熟悉Python的語法,還不怕悶到自己~
Python的庫是Python相當重要的組成部分,我們可以通過這些庫來實現許多的功能。我們的目標就是通過pygame來實現一個小遊戲!那具體做什麽呢?我已經找到方向了!就是做個PC端的微信飛機大戰~因為這個遊戲的模式簡單,功能明確,界面簡潔,非常符合我們預期的目標。不過我在這裏要重申一點,這個想法並不是由我想出來的,是我在github上找到的,附上地址:PyShootGame (使用的資源也在這裏哦!)。
最後說明一下,本系列博文使用的是Python 3.3.5 + pygame 1.9.2a0。關於Python 2.x和3.x版本我就不作比較了,語義理解就好。記得Python要跟對應的pygame版本對應好哦~
正片開始~
1. 準備工作
1.1 pygame的安裝
首先Python你得有吧,pygame最簡單的辦法當然是從官網下載啦(附上:www.pygame.org/download.shtml)。但現在問題又來了,官網上給的pygame版本好像只有for Python 2.5/2.6/2.7/3.1/3.2了,如果你的Python版本大於3.2那咋辦呢?stack overflow上一位大哥說了句“The main Pygame page seems to be rarely updated.”,眾人仿佛明白了什麽,然後大哥笑笑,“去這下載吧(附上:bitbucket.org/pygame/pygame/downloads)”。這裏的版本好像更新得比官網上勤快(僅僅是...好像)。版本號上面都寫得很清楚,各取所需就好~
最後我們來確認下自己是否正確安裝~
>>> import pygame >>> print(pygame.ver) 1.9.2a0
如果沒有報錯,應該是安裝好了~
如果報錯找不到模塊,很可能是安裝版本的問題了。
The specified module could not be found.
1.2 pygame文檔的路徑
pygame的文檔還是很齊全的,當我們遇到用法問題時,先看看文檔,很多問題就迎刃而解了。
Pygame Documentation:%你的Python安裝路徑%/python/Lib/site-packages/pygame/docs/index.html
(不同版本的Python和pygame的文檔位置可能不一樣,我這裏只是貼出自己的路徑,大家參考參考,庫裝好後在自己的Python安裝路徑下找找就是了;如果覺得麻煩,還有在線文檔,附上:www.pygame.org/docs/)
那pygame中有哪些模塊呢,docs中也已給出:
模塊 | 簡介 |
pygame.BufferProxy | An array protocol view of surface pixels |
pygame.cdrom | How to access and control the CD audio devices. |
pygame.Color | Color representation. |
pygame.cursors | Loading and compiling cursor images. |
pygame.display | Configure the display surface. |
pygame.draw | Drawing simple shapes like lines and ellipses to surfaces. |
pygame.event | Manage the incoming events from various input devices and the windowing platform. |
pygame.examples | Various programs demonstrating the use of individual pyame modules. |
pygame.font | Loading and rendering Truetype fonts. |
pygame.freetype | Enhanced Pygame module for loading and rendering font faces. |
pygame.gfxdraw | Anti-aliasing draw functions. |
pygame.image | Loading, saving, and transferring of surfaces. |
pygame.joystick | Manage the joystick devices. |
pygame.key | Manage the keyboard device. |
pygame.locals | Pygame constants. |
pygame.mixer | Load and play sounds |
pygame.mouse | Manage the mouse device and display. |
pygame.movie | Video playback from MPEG movies. |
pygame.mixer.music | Play streaming music tracks. |
pygame.Overlay | Access advanced video overlays. |
pygame | Top level functions to manage Pygame. |
pygame.PixelArray | Manipulate image pixel data. |
pygame.Rect | Flexible container for a rectangle. |
pygame.scrap | Native clipboard access. |
pygame.sndarray | Manipulate sound sample data. |
pygame.sprite | Higher level objects to represent game images. |
pygame.Surface | Objects for images and the screen. |
pygame.surfarray | Manipulate image pixel data. |
pygame.tests | Test Pygame. |
pygame.time | Manage timing and framerate. |
pygame.transform | Resize and move images. |
簡介裏都是很直觀的介紹,這裏不多解釋。模塊裏面提供比較直接的操作(只是相對的),像貼一幅圖像;也提供抽象層次比較高的操作,像精靈模塊(sprite)。反正我們有個大致的了解,用到什麽,再去認真學習相關的東西。
2. 我們的第一個任務——添加遊戲背景
2.1 在載入背景前,我們得先有個window吧?動手吧~
1 import pygame # 導入pygame庫 2 from pygame.locals import * # 導入pygame庫中的一些常量 3 from sys import exit # 導入sys庫中的exit函數 4 5 # 定義窗口的分辨率 6 SCREEN_WIDTH = 480 7 SCREEN_HEIGHT = 640 8 9 # 初始化遊戲 10 pygame.init() # 初始化pygame 11 screen = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT]) # 初始化一個用於顯示的窗口 12 pygame.display.set_caption(‘This is my first pygame-program‘) # 設置窗口標題 13 14 #事件循環(main loop) 15 while True: 16 17 # 處理遊戲退出 18 # 從消息隊列中循環取 19 for event in pygame.event.get(): 20 if event.type == pygame.QUIT: 21 pygame.quit() 22 exit()
程序運行結果:
雖然漆黑一片,也不見得能幹什麽,但總算是踏出了第一步~
2.2 接下來要對程序中幾個部分進行著重解釋:
line 2:pygame.locals模塊裏面包含了很多pygame需要用到的常量,例如set_mode裏面窗口的標誌(flags)、消息事件(event)的類型等等。另外,程序想使用pygame.locals模塊裏面pygame的常量的話,只能使用“from pygame.locals import *”。
line 3:Python簡潔性的一個體現就是,你需要用什麽功能,就導入什麽功能。這裏我們需要用到exit函數來關閉窗口,從sys庫中導入便是。
line 5:背景圖片的分辨率實際是480*800,但我電腦屏幕分辨率只有1280*800,所以我暫時把它改“矮”了。
line 10:pygame.init()將會初始化所有導入的pygame模塊。不過當某一模塊發生錯誤時,這個函數並不會拋出異常,相對地,init()會返回一個元組,包括成功初始化的模塊的數量以及發生錯誤的模塊的數量。在這個例子中,輸出init()返回的信息可以看到,
>>> ================================ RESTART ================================ >>> (6, 0)
如果你願意的話也可以手動的逐個模塊初始化,這樣就可以捕捉到拋出的異常了。
line 11:set_mode()函數將會創建一個顯示面板(surface),它有三個參數,第一個是surface的分辨率,也就是窗口的大小,以元組的形式輸入(width, height) ,如果沒有輸入或者設置為(0, 0)的話,系統將會把surface的分辨率設置成當前屏幕分辨率(pygame uses sdl version 1.2.10 or above);第二個是標誌位(flags),也就是選定surface的顯示模式,見下列表:
#pygame.FULLSCREEN create a fullscreen display #pygame.DOUBLEBUF recommended for HWSURFACE or OPENGL #pygame.HWSURFACE hardware accelerated, only in FULLSCREEN #pygame.OPENGL create an OpenGL renderable display #pygame.RESIZABLE display window should be sizeable #pygame.NOFRAME display window will have no border or controls
第三個參數是位深(depth),即用多少位來表現顏色,文檔建議不需要設置此參數,系統會選擇最優值。
line 15:在我們主程序中,我們需要一個事件的循環(loop)來不斷地檢測交互過程中用戶的操作。pygame.event.get()方法可以從事件隊列得到所有事件的一個列表,我們使用一個循環不斷地檢測每一個事件,一旦我們找到quit事件,我們就退出遊戲關閉窗口。還有一點值得我們思考,如果我們不設置退出操作,我們的黑窗口又會變成怎樣呢?結果是,我們點擊窗口右上角的紅色叉叉時,程序依然可以檢測到quit事件,但是窗口是不會關閉的,因為我們沒有為它設置相關的操作。
2.3 正式載入背景
有了上面的知識,我們已經大致了解程序的框架了,那麽入正題!載入背景圖片~
註意,我們添加幾條語句即可~(??ω??)
import pygame # 導入pygame庫 from pygame.locals import * # 導入pygame庫中的一些常量 from sys import exit # 導入sys庫中的exit函數 # 定義窗口的分辨率 SCREEN_WIDTH = 480 SCREEN_HEIGHT = 640 # 初始化遊戲 pygame.init() # 初始化pygame screen = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT]) # 初始化窗口 pygame.display.set_caption(‘This is my first pygame-program‘) # 設置窗口標題 # 載入背景圖 background = pygame.image.load(‘resources/image/background.png‘) # new # 事件循環(main loop) while True: # 繪制背景 screen.blit(background, (0, 0)) # new # 更新屏幕 pygame.display.update() # new # 處理遊戲退出 # 從消息隊列中循環取 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit()
程序運行結果:
我們在原來的程序上增加了3條語句。第一句是載入背景圖片的,resources文件夾要跟你的py文件放在一起哦;第二句用來繪制圖像,surface.blit()算是很常用的函數了,第一個參數是圖像資源,第二個參數決定圖像放置的位置(左上角的坐標);第三個語句是更新屏幕,就是把繪制好的背景給“刷”上去。在這裏多說一點,關於pygame.display.flip()和pygame.display.update(),文檔上說,update更像是flip的優化版本,主要區別是flip是屏幕的整體刷新(entire),而update是局部刷新(portion)。最後來思考一個問題,假如我們把後面兩條新語句移到while循環上面會怎樣?在這個demo中不會有明顯影響,但當以後我們在屏幕中加入其它圖像元素後,一執行update操作,背景圖就沒有了。
※有位博主用心的把pygame的模塊簡介翻譯了一下,附上地址:eyehere.net/2011/python-pygame-novice-professional-1/
原文地址:https://www.cnblogs.com/wuzhanpeng/p/4261015.html
python編程學習--Pygame - Python遊戲編程入門(0)---轉載