Pygame - Python遊戲編程入門(0)

引言

      博客剛開,想把最近學習的東西記錄下來,算是一種筆記。最近打算開始學習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

 

正片開始~

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的文檔仍是很齊全的,當咱們遇到用法問題時,先看看文檔,不少問題就迎刃而解了。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)。反正咱們有個大體的瞭解,用到什麼,再去認真學習相關的東西。

 

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/

 

小結一下:第一次寫博,感受好累(/TДT)/

相關文章
相關標籤/搜索