青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 97, 文章 - 22, 評(píng)論 - 81, 引用 - 0
數(shù)據(jù)加載中……

Pygame游戲開發(fā) 之一

Pygame游戲開發(fā)之一

初涉紅塵

       本人是個(gè)游戲愛好者,同樣是個(gè)游戲開發(fā)愛好者,最近開始學(xué)習(xí)PygamePygame 跨平臺(tái)的 Python模塊(包括Win32UnixMac、Android等等),主要包含圖像和聲音,專為電子游戲設(shè)計(jì)。所有需要的游戲功能和理念都完全簡(jiǎn)化為游戲邏輯本身,這樣就大大提高了開發(fā)效率。

       我學(xué)Pygame之前對(duì)Python可以說(shuō)是一無(wú)所知,所以大致瀏覽了一下《Python核心編程》,但是學(xué)一門語(yǔ)言不能光靠看書,必須親身實(shí)踐??梢哉f(shuō)是一邊做游戲,一邊學(xué)習(xí)的過(guò)程,通過(guò)做游戲來(lái)更好地理解這門語(yǔ)言。Pygame的文檔可以在以下這個(gè)鏈接中找到:http://www.pygame.org/docs/ 基本游戲中需要用到的一些操作它都給你封裝好了,非常方便。

       做游戲之前讓我們先把環(huán)境配好,到Python的官網(wǎng)把Python相關(guān)的軟件下載下來(lái)(http://www.python.org/download),因?yàn)樗强缙脚_(tái)的,所以會(huì)有很多不同平臺(tái)的版本,我下了一個(gè)Windows版的python-2.5.msi,之后執(zhí)行該文件安裝Python,一般是安裝在C:盤下。安裝完畢后,進(jìn)入 開始菜單->Python 2.5->IDLE,就是PythonIDE(集成開發(fā)環(huán)境)了。然后是安裝Pygame模塊,到http://www.pygame.org/download.shtml下載對(duì)應(yīng)平臺(tái)的pygame,安裝即可。

       接下來(lái)就開始我們的“Pygame游戲制作之旅”,和大多數(shù)的游戲制作一樣,程序的框架都是大同小異的,一般就是:

初始化 - (圖像、聲音)

主循環(huán) -

事件處理(鼠標(biāo)、鍵盤)

邏輯層

渲染層

釋放資源

Pygame的初始化非常方便,首先調(diào)用pygame.init(),這個(gè)函數(shù)為所有導(dǎo)入的pygame模塊進(jìn)行初始化,如果初始化失敗,不會(huì)引發(fā)任何的異常。

Pygame中用于顯示的是一個(gè)叫Surface的東西,Surface可以理解成一個(gè)表面,就像畫畫的白紙一樣,任何東西都可以在上面繪制。每個(gè)Surface都有它固定的分辨率(可以理解成白紙的大小,即寬和高)以及像素格式(pixel format)。

調(diào)用pygame.Surface可以創(chuàng)建一個(gè)圖像對(duì)象。起初Surface會(huì)被清空成全黑,唯一需要的參數(shù)是它的大小。其它還有幾個(gè)默認(rèn)的參數(shù):

pygame.Surface((width, height), flags=0, depth=0, masks=None): return Surface
pygame.Surface((width, height), flags=0, Surface): return Surface

像素格式可以通過(guò)傳入位深depth或者一張存在的Surface來(lái)決定,flags參數(shù)是表面的一組位或標(biāo)志,可以傳入以下參數(shù)的任意組合:

HWSURFACE, 在顯存中創(chuàng)建圖像
SRCALPHA,
像素格式有alpha值,即透明度

Surface可以有許多額外的屬性,像alpha層,關(guān)鍵色,源矩形裁剪等。這些功能主要影響Surface是如何粘貼到其它表面的。這里的粘貼不是一般意義上的粘貼,因?yàn)樗恢故窃瓐D拷貝,有可能是進(jìn)行像素的與運(yùn)算、或運(yùn)算等等,我們稱這種操作為blit(位塊傳輸),blit會(huì)盡可能使用硬件加速,如果實(shí)在不行,它們會(huì)使用具有很好優(yōu)化手段的軟件傳輸方法。

Pygame中支持三種類型的透明處理:關(guān)鍵色(colorkeys),表面alpha(surface alphas),像素alpha(pixel alphas)。表面alpha能夠和關(guān)鍵色混合使用,但是如果用了像素alpha,就不能和其它兩種進(jìn)行混合使用了。關(guān)鍵色使得某一種顏色成為透明,任何和這個(gè)顏色一樣的像素將不會(huì)被繪制出來(lái)。表面alpha是一個(gè)單一的值,它決定了整張圖片的透明度。這個(gè)值為255表示不透明,0則表示完全透明。

像素alpha儲(chǔ)存了所有像素的alpha值,也就是透明度。在表面上的像素訪問(wèn)是允許的,但是對(duì)于一個(gè)游戲來(lái)說(shuō),這個(gè)速度實(shí)在是太慢了-_-|||(不是一般的慢啊試過(guò)你就知道了)。像素的訪問(wèn)和修改可以通過(guò)get_at() set_at()函數(shù),但是如果需要批量操作,這種方法是不可取的,實(shí)在要做,可以利用pygame.surfarray 模塊,它將Surface看做是很大的高維數(shù)組,操作起來(lái)相當(dāng)快。任何函數(shù)如果要直接訪問(wèn)一個(gè)Surface的某個(gè)像素?cái)?shù)據(jù)的話需要將這個(gè)Surface鎖定,鎖定和解鎖可以調(diào)用lock()unlock()方法。

對(duì)Surface有一定了解之后,我們就可以來(lái)看display了,pygame.displayPygame中用于屏幕顯示的模塊,一旦創(chuàng)建了一個(gè)display,你就可以把它當(dāng)成是常規(guī)的Surface來(lái)使用了。Pygame在進(jìn)行顯示的時(shí)候是采用雙緩沖機(jī)制的,其實(shí)它內(nèi)部有兩個(gè)Surface,每次要繪制時(shí)是在后備緩沖上進(jìn)行繪制,當(dāng)所有東西都繪制完畢后需要手動(dòng)調(diào)用pygame.display.flip()函數(shù),這個(gè)函數(shù)的作用就是將后備緩沖和前臺(tái)緩沖進(jìn)行一次交換,如此一來(lái),先前繪制的東西也就自然而然得顯示到屏幕上來(lái)了(也可以調(diào)用pygame.display.update(),它是對(duì)前一個(gè)翻頁(yè)函數(shù)的優(yōu)化,可以傳入一些矩形,只在傳入的矩形進(jìn)行更新操作)。我們利用以下函數(shù)對(duì)屏幕的Surface進(jìn)行初始化:

pygame.display.set_mode(resolution=(0,0), flags=0, depth=0) : return Surface

resolution表示需要?jiǎng)?chuàng)建的窗口的大小,即分辨率。flags表示一些位或標(biāo)志,一般有以下幾個(gè):

pygame.FULLSCREEN    創(chuàng)建一個(gè)全屏的顯示模式

pygame.DOUBLEBUF     建議和 HWSURFACE OPENGL組合

pygame.HWSURFACE     全屏下硬件加速

pygame.OPENGL           創(chuàng)建一個(gè)opengl 的渲染顯示模式

pygame.RESIZABLE      顯示窗口大小可變

pygame.NOFRAME       顯示窗口沒(méi)有邊框

depth則表示當(dāng)前Surface的位深。

screen = pygame.display.set_mode(SCREENRECT.size,  pygame.FULLSCREEN)

我們可以采用以上語(yǔ)句創(chuàng)建一個(gè)用于全屏顯示的Surface對(duì)象,并且返回給全局變量screen。接下來(lái)我們從文件中讀取一張圖片并且將它顯示到屏幕上來(lái),pygame.image模塊是用于圖像的傳輸?shù)?,它包含了一些讀取和保存圖片的函數(shù),讀取圖片可以采用pygame.image.load

。它的原型是:

pygame.image.load(filename) return Surface

從文件中載入一個(gè)圖像,傳入的是文件名。Pygame將會(huì)自動(dòng)決定圖像的類型(gif 或者 bmp)并且從數(shù)據(jù)中創(chuàng)建一個(gè)新的Surface對(duì)象。返回的Surface對(duì)象將會(huì)包含和文件中的原圖一樣的顏色格式、關(guān)鍵色和alpha通道。你可以返回Surface.convert()來(lái)創(chuàng)建一個(gè)拷貝,它在屏幕上繪制的時(shí)候效率更高。

       對(duì)于alpha通道,像png圖像可以在載入后使用convert_alpha()方法使得圖像的像素具有透明度。Pygame不總是支持所有的圖像文件格式,但是它肯定支持的是標(biāo)準(zhǔn)的BMP文件,可以通過(guò)pygame.image.get_extended來(lái)檢測(cè)它是否支持其他圖像文件,例如png。

       我們可以通過(guò)定義一個(gè)load_image函數(shù)來(lái)將圖像的載入封裝起來(lái),以后用的時(shí)候就會(huì)方便許多了。

def load_image(file) :

    file = os.path.join('data', file)

    try:

        surface = pygame.image.load(file)

    except pygame.error:

        raise SystemExit, 'Can not load image %s' % pygame.get_error()

return surface.convert_alpha()

 

以上是將一個(gè)data文件夾下的名為file的圖像文件讀取并且返回一個(gè)Surface的過(guò)程。

調(diào)用如下:

myImage = load_image(‘hero.png’)

現(xiàn)在我們擁有兩個(gè)Surface:一個(gè)是screen,表示屏幕顯示設(shè)備;另外一個(gè)則是由圖像文件中創(chuàng)建的myImage,如果想要將myImage顯示到屏幕上來(lái),只需要進(jìn)行如下的操作:

       screen.blit(myImage, pos, srcRect, 0)

第一個(gè)參數(shù)是源Surface對(duì)象,pos則是傳送到screen的左上角的位置,是一個(gè)二元組,表示xy坐標(biāo), srcRect表示的是一個(gè)矩形四元組,是將myImagesrcRect這個(gè)矩形的區(qū)域傳送到screen上來(lái),最后一個(gè)參數(shù)則是對(duì)兩張Surface的一個(gè)混合的標(biāo)志,BLEND_ADD表示將兩者的對(duì)應(yīng)點(diǎn)的顏色像素值相加,BLEND_SUB表示相減等等。到此為止,myImage還不能被顯示到屏幕上來(lái),因?yàn)?/span>blit的過(guò)程只是將myImage這個(gè)Surface傳送到后備緩沖中,我們還需要調(diào)用pygame.display.flip()進(jìn)行翻頁(yè)。如此一來(lái),就可以輕松得實(shí)現(xiàn)圖像文件在屏幕的貼圖了。

       大致了解了圖像的顯示之后讓我們來(lái)看下框架代碼的編寫,C++開頭一般都會(huì)包含一些頭文件,Python也類似,PygamePython的一個(gè)模塊,但是如果不進(jìn)行導(dǎo)入是不能用它的東西的,Python中用import進(jìn)行模塊的導(dǎo)入:

import pygame, sys, os.path

sysos.path都是系統(tǒng)模塊,當(dāng)然,自己寫的.py文件也可以作為一個(gè)模塊來(lái)用于導(dǎo)入。

必要模塊導(dǎo)入之后需要檢測(cè)當(dāng)前系統(tǒng)下是否支持除標(biāo)準(zhǔn)BMP以外的圖像文件,可以調(diào)用pygame.image.get_extended()函數(shù)來(lái)檢測(cè),如果返回False則只能使用標(biāo)準(zhǔn)BMP文件了。

Python中有一個(gè)特殊的變量__name__,如果當(dāng)前程序是被當(dāng)成一個(gè)模塊被導(dǎo)入的,那么它的值是模塊名;如果是作為程序執(zhí)行的,則它的值是’__main__’,所以我們需要對(duì)這個(gè)變量進(jìn)行判斷,像這樣:

if __name__ == '__main__' : Go()

以上的Go函數(shù)就好比是C語(yǔ)言中的main()函數(shù),不同的是它可以以任意的名字命名。所有的初始化工作可以放在Go函數(shù)的開頭,我用Initialize函數(shù)將它封裝起來(lái)了。

def Go():

    Initialize()

    while True :

        for event in pygame.event.get():

            if event.type == pygame.KEYDOWN :

                if event.key == K_ESCAPE :

                    pygame.quit()

                    sys.exit(0)

            elif event.type == pygame.QUIT :

                pygame.quit()

                sys.exit(0)

        keystatus       =  pygame.key.get_pressed()

              logical()

              render()

        pygame.display.update()

上面這段代碼是Pygame的游戲框架,對(duì)圖像之類的初始化工作被放在Initialize函數(shù)里,之后是游戲的主循環(huán),循環(huán)內(nèi)部首先進(jìn)行的是事件處理,這里的事件是用的Pygame中的pygame.event模塊,Pygame對(duì)事件的組織是通過(guò)事件隊(duì)列的,pygame.event.get()將得到事件隊(duì)列中所有的事件,并且將他們從事件隊(duì)列中移除。每個(gè)事件有一個(gè)事件類型event.type,例如KEYDOWN表示鍵盤上的鍵按下,KEYUP表示鍵抬起等等。

       logical()render()分別是游戲的邏輯層和渲染層,可以在邏輯層中添加一些控件,并且設(shè)置它們的位置以及大小,然后渲染層則負(fù)責(zé)將這些東西顯示到屏幕上來(lái)。(未完待續(xù))

       以上內(nèi)容均為原創(chuàng) 轉(zhuǎn)載請(qǐng)注明出處


 

1-1

posted on 2011-04-23 20:39 英雄哪里出來(lái) 閱讀(11947) 評(píng)論(1)  編輯 收藏 引用 所屬分類: Pygame

評(píng)論

# re: Pygame游戲開發(fā) 之一  回復(fù)  更多評(píng)論   

持續(xù)關(guān)注
2011-04-24 12:56 | zhaoyg
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            老色鬼精品视频在线观看播放 | 久久久噜噜噜久久中文字免| 在线观看日韩国产| 亚洲二区在线观看| 欧美国产日韩一区二区在线观看 | 久久这里只有| 久久精品人人爽| 99在线精品视频| 亚洲资源在线观看| 久久久五月天| 国产精品一香蕉国产线看观看| 一区二区av在线| 午夜久久福利| 欧美亚洲视频| 亚洲人体1000| 亚洲免费高清视频| 亚洲美女视频| 亚洲综合社区| 久久精品一级爱片| 在线免费精品视频| 亚洲日产国产精品| 欧美一级久久| 亚洲午夜精品在线| 亚洲韩国日本中文字幕| 欧美一级日韩一级| 伊人久久噜噜噜躁狠狠躁| 亚洲综合丁香| 亚洲大胆视频| 久久久亚洲精品一区二区三区 | 99re8这里有精品热视频免费 | 欧美激情综合五月色丁香| 欧美激情va永久在线播放| 欧美视频精品在线| 艳女tv在线观看国产一区| 国产一区二区三区久久久| 久久久99久久精品女同性 | 一本综合久久| 亚洲免费一级电影| 欧美一区二区在线观看| 欧美一区二区视频在线观看| 亚洲精品乱码久久久久久黑人| 久久亚洲综合色一区二区三区| 欧美v国产在线一区二区三区| 免费观看日韩av| 欧美亚洲一级| 欧美一区二区精品在线| 亚洲色无码播放| 久久综合综合久久综合| 欧美日韩精品一区视频| 国内自拍视频一区二区三区| 最近中文字幕mv在线一区二区三区四区| 99v久久综合狠狠综合久久| 亚洲欧洲日本一区二区三区| 亚洲免费伊人电影在线观看av| 一本不卡影院| 美女免费视频一区| 亚洲视频你懂的| 欧美成人性生活| 国产欧美一区二区三区在线看蜜臀 | 亚洲美女性视频| 久久精品99国产精品日本| 欧美激情偷拍| 一区二区三区在线不卡| 亚洲欧美精品在线| 亚洲高清中文字幕| 性xx色xx综合久久久xx| 欧美视频在线观看一区| 亚洲成色777777在线观看影院| 亚洲一区二区在线免费观看| 亚洲激情影院| 这里只有视频精品| 欧美日产在线观看| 亚洲国产精品电影| 理论片一区二区在线| 亚洲精品国产精品久久清纯直播| 久久久久久久999精品视频| 国产精品久久久久久久久久久久久久 | 99精品欧美一区二区三区综合在线 | 免费视频久久| 欧美一区二区三区四区夜夜大片| 久久国产精品电影| 欧美一区二区三区喷汁尤物| 欧美 日韩 国产一区二区在线视频 | 欧美在线观看一二区| 亚洲欧洲午夜| 乱码第一页成人| 久久综合色天天久久综合图片| 欧美亚男人的天堂| 国产亚洲福利| 欧美亚洲一区在线| 羞羞色国产精品| 国产欧美日韩亚洲| 香蕉久久a毛片| 久久免费黄色| 99av国产精品欲麻豆| 欧美日韩国产小视频在线观看| 欧美激情按摩| 日韩一区二区免费高清| 国产精品久久久久久久久久直播 | 99亚洲一区二区| 国产精品美女诱惑| 欧美人交a欧美精品| 久热爱精品视频线路一| 美女性感视频久久久| 欧美国产欧美亚州国产日韩mv天天看完整| 亚洲经典一区| 亚洲一区久久久| 久久免费视频在线| 欧美极品aⅴ影院| 国产精品高潮呻吟| 韩日视频一区| 亚洲深夜av| 麻豆av一区二区三区久久| 欧美激情一区二区三区在线视频观看 | 亚洲一区二区免费看| 99天天综合性| 久久精品五月| 91久久嫩草影院一区二区| 亚洲一区二区三区视频| 久久午夜国产精品| 国产精品日韩久久久| 亚洲精品国产精品国产自| 欧美在线观看视频| 日韩手机在线导航| 亚洲欧美综合国产精品一区| 亚洲午夜小视频| 国产精品伦一区| 在线不卡中文字幕| 亚洲天堂免费观看| 日韩一二在线观看| 香蕉成人久久| 欧美激情精品久久久久久黑人| 欧美国产日韩一区| 国产日韩综合一区二区性色av| 国产精品久久久一区麻豆最新章节 | 中文欧美字幕免费| 亚洲欧美经典视频| 亚洲第一在线| 一区二区三区日韩精品| 久久精品视频在线播放| 欧美日韩在线播放一区二区| 国产精品久久久久永久免费观看| 在线观看免费视频综合| 亚洲欧美成aⅴ人在线观看| 免费91麻豆精品国产自产在线观看| 久久综合导航| 久久亚洲国产精品日日av夜夜| 国产精品av一区二区| 日韩视频永久免费| 亚洲动漫精品| 欧美黄色视屏| 亚洲精品在线观| 久久久一区二区| 亚洲欧美日韩一区二区| 欧美在线不卡| 亚洲欧美日韩成人| 一区二区亚洲精品国产| 国产精品视频免费观看| 久久综合色8888| 亚洲欧美另类在线| 免费成人你懂的| 亚洲精品国产精品国自产观看 | 欧美99久久| 99热免费精品在线观看| 中国成人在线视频| 亚洲综合999| 久久久不卡网国产精品一区| 蜜臀久久99精品久久久画质超高清 | 欧美成人在线免费视频| 亚洲自拍偷拍网址| 亚洲激情二区| 欧美黄污视频| 亚洲黄色高清| 亚洲一区二区三区精品在线| 欧美亚洲视频在线观看| 欧美在线亚洲| 国产精品久久久久9999吃药| 久久艳片www.17c.com| 欧美日韩中字| 亚洲欧美另类国产| 亚洲国产视频一区| 久久精品国产99精品国产亚洲性色 | 欧美v日韩v国产v| 欧美日韩精品久久| 久久视频在线视频| 国产精品久久久久久久久久直播 | 久久精品在这里| 亚洲特级毛片| 蜜乳av另类精品一区二区| 欧美一区二区大片| 99精品国产福利在线观看免费| 中文网丁香综合网| 日韩一区二区电影网| 久久夜色精品国产欧美乱| 久久久免费观看视频| 国产日韩欧美中文| 欧美呦呦网站| 免费h精品视频在线播放| 亚洲国产婷婷综合在线精品| 久久九九国产|