博客剛開,想把最近學習的東西記錄下來,算是一種筆記。最近打算開始學習Python,由於我感受Python是一門頗有意思的語言,很早之前就想學了(礙於懶),它的功能很強大,你能夠用它來作科學運算,或者數字圖像處理,或者任務的自動化,還能夠構建動態網站,不少不少聽起來就頗有意思的實現。關於Python你還能夠找到更多的資料,這裏不一一贅述。html
一說到開始學習一門新的編程語言,不少童鞋可能立刻想到,「嗯,哥去買本書啃啃!」,結果買了本大部頭,全是枯燥的語法知識,看了後面忘了前面,事倍功半。記得之前有位朋友跟我說,想學一門新技術,從作一個項目開始,這句話仍是很值得思考的!(做沉思狀(`・ω・´))因此!入正題了!咱們不如作個小遊戲吧,熟悉熟悉Python的語法,還不怕悶到本身~python
Python的庫是Python至關重要的組成部分,咱們能夠經過這些庫來實現許多的功能。咱們的目標就是經過pygame來實現一個小遊戲!那具體作什麼呢?我已經找到方向了!就是作個PC端的微信飛機大戰~由於這個遊戲的模式簡單,功能明確,界面簡潔,很是符合咱們預期的目標。不過我在這裏要重申一點,這個想法並非由我想出來的,是我在github上找到的,附上地址:PyShootGame (使用的資源也在這裏哦!)。git
最後說明一下,本系列博文使用的是Python 3.3.5 + pygame 1.9.2a0。關於Python 2.x和3.x版本我就不做比較了,語義理解就好。記得Python要跟對應的pygame版本對應好哦~github
首先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.
pygame的文檔仍是很齊全的,當咱們遇到用法問題時,先看看文檔,不少問題就迎刃而解了。ide
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)。反正咱們有個大體的瞭解,用到什麼,再去認真學習相關的東西。
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()
程序運行結果:
雖然漆黑一片,也不見得能幹什麼,但總算是踏出了第一步~
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事件,可是窗口是不會關閉的,由於咱們沒有爲它設置相關的操做。
有了上面的知識,咱們已經大體瞭解程序的框架了,那麼入正題!載入背景圖片~
注意,咱們添加幾條語句便可~(。・ω・。)
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/