1. 程式人生 > >python編程學習--Pygame - Python遊戲編程入門(0)---轉載

python編程學習--Pygame - Python遊戲編程入門(0)---轉載

sprite 遊戲編程 lag 編程 blank 比較 eve 輸出 docs

原文地址: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)---轉載