python自己制作节奏大师游戏_使用pygame制作一个简单的游戏
翻譯自Will McGugan的《Beginning Game?Development with?Python and Pygame –From Novice to Professional》,有興趣的朋友可以搜一下,有英文版的PDF可以下載。其實(shí)也不是翻譯,把精華摘出來,共同學(xué)習(xí)。
看這個(gè)系列需要有Python的基礎(chǔ)知識(shí),雖然一開始想寫一篇Python概要的,實(shí)在是很龐雜,而且有那么多好的Python基礎(chǔ)教程,自己就不多插一腳了吧。入門的話,有Python入門,詳盡的話,可以看看Python核心編程或者Python編程金典,然后IBM上的“可愛的Python”系列也很不錯(cuò),可以擴(kuò)展一下思維。
OK,讓我們開始吧~
Pygame的歷史
Pygame是一個(gè)利用SDL庫的寫就的游戲庫,SDL呢,全名Simple DirectMedia Layer,是一位叫做Sam Lantinga的大牛寫的,據(jù)說他為了讓Loki(致力于向Linux上移植Windows的游戲的一家大好人公司,可惜已經(jīng)倒閉,唉好人不長命啊……)更有效的工作,創(chuàng)造了這個(gè)東東。
SDL是用C寫的,不過它也可以使用C++進(jìn)行開發(fā),當(dāng)然還有很多其它的語言,Pygame就是Python中使用它的一個(gè)庫。Pygame已經(jīng)存在很多時(shí)間了,許多優(yōu)秀的程序員加入其中,把Pygame做得越來越好。
安裝Pygame
你可以從www.pygame.org下載Pygame,選擇合適你的操作系統(tǒng)和合適的版本,然后安裝就可以了(什么,你連Python都沒有?您可能是不適合看這個(gè)系列了,不過如果執(zhí)意要學(xué),很好!快去www.python.org下載吧!)。
一旦你安裝好,你可以用下面的方法確認(rèn)下有沒有安裝成功:
Python
>>> import pygame
>>> print pygame.ver
1.9.1release
1
2
3
>>>importpygame
>>>printpygame.ver
1.9.1release
你的版本可能和我不同,這沒關(guān)系。我所翻譯的這本書上的版本還是1.7.1的……所以如果有些過時(shí)的不合時(shí)宜的東西,千萬不要客氣請(qǐng)指出來!
若說為什么要介紹這么一個(gè)“過時(shí)”的東西,真正的知識(shí)是不會(huì)過時(shí)的,只有技術(shù)才會(huì)。這里主要是依靠Pygame來介紹的游戲開發(fā)的方方面面,并不是說咱就可以靠這個(gè)做出什么偉大的游戲了(當(dāng)然也不是說不可以)!
另外說一下,就產(chǎn)品而言,Pygame更致力于2D游戲的開發(fā),也就是說,你可以用Pygame寫一個(gè)植物大戰(zhàn)僵尸,但是寫一個(gè)魔獸世界則相當(dāng)困難……請(qǐng)不要做出鄙夷的目光,底層的東西永遠(yuǎn)是相通的,而且對(duì)于新手而言,從簡(jiǎn)單的2D入手才是正途。
使用Pygame
Pygame有很多的模塊,下面是一張一覽表:
模塊名
功能
pygame.cdrom
訪問光驅(qū)
pygame.cursors
加載光標(biāo)
pygame.display
訪問顯示設(shè)備
pygame.draw
繪制形狀、線和點(diǎn)
pygame.event
管理事件
pygame.font
使用字體
pygame.image
加載和存儲(chǔ)圖片
pygame.joystick
使用游戲手柄或者 類似的東西
pygame.key
讀取鍵盤按鍵
pygame.mixer
聲音
pygame.mouse
鼠標(biāo)
pygame.movie
播放視頻
pygame.music
播放音頻
pygame.overlay
訪問高級(jí)視頻疊加
pygame
就是我們?cè)趯W(xué)的這個(gè)東西了……
pygame.rect
管理矩形區(qū)域
pygame.sndarray
操作聲音數(shù)據(jù)
pygame.sprite
操作移動(dòng)圖像
pygame.surface
管理圖像和屏幕
pygame.surfarray
管理點(diǎn)陣圖像數(shù)據(jù)
pygame.time
管理時(shí)間和幀信息
pygame.transform
縮放和移動(dòng)圖像
有些模塊可能在某些平臺(tái)上不存在,你可以用None來測(cè)試一下。
Python
if pygame.font is None:
print "The font module is not available!"
exit()
1
2
3
ifpygame.fontisNone:
print"The font module is not available!"
exit()
新的Hello World
學(xué)程序一開始我們總會(huì)寫一個(gè)Hello world程序,但那只是在屏幕上寫了兩個(gè)字,現(xiàn)在我們來點(diǎn)更帥的!寫好以后會(huì)是這樣的效果:
Python
#!/usr/bin/env python
background_image_filename = 'sushiplate.jpg'
mouse_image_filename = 'fugu.png'
#指定圖像文件名稱
import pygame
#導(dǎo)入pygame庫
from pygame.locals import *
#導(dǎo)入一些常用的函數(shù)和常量
from sys import exit
#向sys模塊借一個(gè)exit函數(shù)用來退出程序
pygame.init()
#初始化pygame,為使用硬件做準(zhǔn)備
screen = pygame.display.set_mode((640, 480), 0, 32)
#創(chuàng)建了一個(gè)窗口
pygame.display.set_caption("Hello, World!")
#設(shè)置窗口標(biāo)題
background = pygame.image.load(background_image_filename).convert()
mouse_cursor = pygame.image.load(mouse_image_filename).convert_alpha()
#加載并轉(zhuǎn)換圖像
while True:
#游戲主循環(huán)
for event in pygame.event.get():
if event.type == QUIT:
#接收到退出事件后退出程序
exit()
screen.blit(background, (0,0))
#將背景圖畫上去
x, y = pygame.mouse.get_pos()
#獲得鼠標(biāo)位置
x-= mouse_cursor.get_width() / 2
y-= mouse_cursor.get_height() / 2
#計(jì)算光標(biāo)的左上角位置
screen.blit(mouse_cursor, (x, y))
#把光標(biāo)畫上去
pygame.display.update()
#刷新一下畫面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/usr/bin/env python
background_image_filename='sushiplate.jpg'
mouse_image_filename
='fugu.png'
#指定圖像文件名稱
importpygame
#導(dǎo)入pygame庫
frompygame.localsimport*
#導(dǎo)入一些常用的函數(shù)和常量
fromsysimportexit
#向sys模塊借一個(gè)exit函數(shù)用來退出程序
pygame.init()
#初始化pygame,為使用硬件做準(zhǔn)備
screen=pygame.display.set_mode((640,480),0,32)
#創(chuàng)建了一個(gè)窗口
pygame.display.set_caption("Hello,
World!")
#設(shè)置窗口標(biāo)題
background=pygame.image.load(background_image_filename).convert()
mouse_cursor=pygame.image.load(mouse_image_filename).convert_alpha()
#加載并轉(zhuǎn)換圖像
whileTrue:
#游戲主循環(huán)
foreventinpygame.event.get():
ifevent.type==QUIT:
#接收到退出事件后退出程序
exit()
screen.blit(background,(0,0))
#將背景圖畫上去
x,y=pygame.mouse.get_pos()
#獲得鼠標(biāo)位置
x-=mouse_cursor.get_width()/2
y-=mouse_cursor.get_height()/2
#計(jì)算光標(biāo)的左上角位置
screen.blit(mouse_cursor,(x,y))
#把光標(biāo)畫上去
pygame.display.update()
#刷新一下畫面
這個(gè)程序需要兩張圖片,你可以在這篇文章最后的地方找到下載地址,雖然你也可以隨便找兩張。為了達(dá)到最佳效果,背景的 sushiplate.jpg應(yīng)要有640×480的分辨率,而光標(biāo)的fugu.png大約應(yīng)為80×80,而且要有Alpha通道(如果你不知道這是 什么,還是下載吧……)。
注意:代碼中的注釋我使用的是中文,如果執(zhí)行報(bào)錯(cuò),可以直接刪除。
游戲中我已經(jīng)為每一行寫了注釋,另外如果打算學(xué)習(xí),強(qiáng)烈建議自己動(dòng)手輸入一遍而不是復(fù)制粘貼!
稍微講解一下比較重要的幾個(gè)部分:
set_mode會(huì)返回一個(gè)Surface對(duì)象,代表了在桌面上出現(xiàn)的那個(gè)窗口,三個(gè)參數(shù)第一個(gè)為元祖,代表分 辨率(必須);第二個(gè)是一個(gè)標(biāo)志位,具體意思見下表,如果不用什么特性,就指定0;第三個(gè)為色深。
標(biāo)志位
功能
FULLSCREEN
創(chuàng)建一個(gè)全屏窗口
DOUBLEBUF
創(chuàng)建一個(gè)“雙緩沖”窗口,建議在HWSURFACE或者OPENGL時(shí)使用
HWSURFACE
創(chuàng)建一個(gè)硬件加速的窗口,必須和FULLSCREEN同時(shí)使用
OPENGL
創(chuàng)建一個(gè)OPENGL渲染的窗口
RESIZABLE
創(chuàng)建一個(gè)可以改變大小的窗口
NOFRAME
創(chuàng)建一個(gè)沒有邊框的窗口
convert函數(shù)是將圖像數(shù)據(jù)都轉(zhuǎn)化為Surface對(duì)象,每次加載完圖像以后就應(yīng)該做這件事件(事實(shí)上因?yàn)?它太常用了,如果你不寫pygame也會(huì)幫你做);convert_alpha相比convert,保留了Alpha 通道信息(可以簡(jiǎn)單理解為透明的部分),這樣我們的光標(biāo)才可以是不規(guī)則的形狀。
游戲的主循環(huán)是一個(gè)無限循環(huán),直到用戶跳出。在這個(gè)主循環(huán)里做的事情就是不停地畫背景和更新光標(biāo)位置,雖然背景是不動(dòng)的,我們還是需要每次都畫它, 否則鼠標(biāo)覆蓋過的位置就不能恢復(fù)正常了。
blit是個(gè)重要函數(shù),第一個(gè)參數(shù)為一個(gè)Surface對(duì)象,第二個(gè)為左上角位置。畫完以后一定記得用update更新一下,否則畫面一片漆黑。
這是一個(gè)最最大概的Pygame程序的印象,接下來我們會(huì)學(xué)習(xí)更多深層次的東西,并且把各條語句都真正讀懂。
總結(jié)
以上是生活随笔為你收集整理的python自己制作节奏大师游戏_使用pygame制作一个简单的游戏的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大话移动通信pdf_移动通信是怎么实现的
- 下一篇: python使用ddt_python使用