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

隨筆 - 97, 文章 - 22, 評論 - 81, 引用 - 0
數據加載中……

Pygame游戲開發 之一

Pygame游戲開發之一

初涉紅塵

       本人是個游戲愛好者,同樣是個游戲開發愛好者,最近開始學習PygamePygame 跨平臺的 Python模塊(包括Win32UnixMacAndroid等等),主要包含圖像和聲音,專為電子游戲設計。所有需要的游戲功能和理念都完全簡化為游戲邏輯本身,這樣就大大提高了開發效率。

       我學Pygame之前對Python可以說是一無所知,所以大致瀏覽了一下《Python核心編程》,但是學一門語言不能光靠看書,必須親身實踐。可以說是一邊做游戲,一邊學習的過程,通過做游戲來更好地理解這門語言。Pygame的文檔可以在以下這個鏈接中找到:http://www.pygame.org/docs/ 基本游戲中需要用到的一些操作它都給你封裝好了,非常方便。

       做游戲之前讓我們先把環境配好,到Python的官網把Python相關的軟件下載下來(http://www.python.org/download),因為它是跨平臺的,所以會有很多不同平臺的版本,我下了一個Windows版的python-2.5.msi,之后執行該文件安裝Python,一般是安裝在C:盤下。安裝完畢后,進入 開始菜單->Python 2.5->IDLE,就是PythonIDE(集成開發環境)了。然后是安裝Pygame模塊,到http://www.pygame.org/download.shtml下載對應平臺的pygame,安裝即可。

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

初始化 - (圖像、聲音)

主循環 -

事件處理(鼠標、鍵盤)

邏輯層

渲染層

釋放資源

Pygame的初始化非常方便,首先調用pygame.init(),這個函數為所有導入的pygame模塊進行初始化,如果初始化失敗,不會引發任何的異常。

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

調用pygame.Surface可以創建一個圖像對象。起初Surface會被清空成全黑,唯一需要的參數是它的大小。其它還有幾個默認的參數:

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

像素格式可以通過傳入位深depth或者一張存在的Surface來決定,flags參數是表面的一組位或標志,可以傳入以下參數的任意組合:

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

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

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

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

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

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

resolution表示需要創建的窗口的大小,即分辨率。flags表示一些位或標志,一般有以下幾個:

pygame.FULLSCREEN    創建一個全屏的顯示模式

pygame.DOUBLEBUF     建議和 HWSURFACE OPENGL組合

pygame.HWSURFACE     全屏下硬件加速

pygame.OPENGL           創建一個opengl 的渲染顯示模式

pygame.RESIZABLE      顯示窗口大小可變

pygame.NOFRAME       顯示窗口沒有邊框

depth則表示當前Surface的位深。

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

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

。它的原型是:

pygame.image.load(filename) return Surface

從文件中載入一個圖像,傳入的是文件名。Pygame將會自動決定圖像的類型(gif 或者 bmp)并且從數據中創建一個新的Surface對象。返回的Surface對象將會包含和文件中的原圖一樣的顏色格式、關鍵色和alpha通道。你可以返回Surface.convert()來創建一個拷貝,它在屏幕上繪制的時候效率更高。

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

       我們可以通過定義一個load_image函數來將圖像的載入封裝起來,以后用的時候就會方便許多了。

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()

 

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

調用如下:

myImage = load_image(‘hero.png’)

現在我們擁有兩個Surface:一個是screen,表示屏幕顯示設備;另外一個則是由圖像文件中創建的myImage,如果想要將myImage顯示到屏幕上來,只需要進行如下的操作:

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

第一個參數是源Surface對象,pos則是傳送到screen的左上角的位置,是一個二元組,表示xy坐標, srcRect表示的是一個矩形四元組,是將myImagesrcRect這個矩形的區域傳送到screen上來,最后一個參數則是對兩張Surface的一個混合的標志,BLEND_ADD表示將兩者的對應點的顏色像素值相加,BLEND_SUB表示相減等等。到此為止,myImage還不能被顯示到屏幕上來,因為blit的過程只是將myImage這個Surface傳送到后備緩沖中,我們還需要調用pygame.display.flip()進行翻頁。如此一來,就可以輕松得實現圖像文件在屏幕的貼圖了。

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

import pygame, sys, os.path

sysos.path都是系統模塊,當然,自己寫的.py文件也可以作為一個模塊來用于導入。

必要模塊導入之后需要檢測當前系統下是否支持除標準BMP以外的圖像文件,可以調用pygame.image.get_extended()函數來檢測,如果返回False則只能使用標準BMP文件了。

Python中有一個特殊的變量__name__,如果當前程序是被當成一個模塊被導入的,那么它的值是模塊名;如果是作為程序執行的,則它的值是’__main__’,所以我們需要對這個變量進行判斷,像這樣:

if __name__ == '__main__' : Go()

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

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的游戲框架,對圖像之類的初始化工作被放在Initialize函數里,之后是游戲的主循環,循環內部首先進行的是事件處理,這里的事件是用的Pygame中的pygame.event模塊,Pygame對事件的組織是通過事件隊列的,pygame.event.get()將得到事件隊列中所有的事件,并且將他們從事件隊列中移除。每個事件有一個事件類型event.type,例如KEYDOWN表示鍵盤上的鍵按下,KEYUP表示鍵抬起等等。

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

       以上內容均為原創 轉載請注明出處


 

1-1

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

評論

# re: Pygame游戲開發 之一  回復  更多評論   

持續關注
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>
            欧美黄网免费在线观看| 亚洲一区欧美激情| 麻豆精品精华液| 久久久久久电影| 亚洲国产欧美精品| 亚洲观看高清完整版在线观看| 久久亚洲捆绑美女| 亚洲理伦在线| 亚洲欧美精品suv| …久久精品99久久香蕉国产| 亚洲第一毛片| 欧美无砖砖区免费| 久久久人人人| 欧美激情视频一区二区三区免费| 亚洲一二三区在线观看| 亚洲综合色婷婷| 亚洲国产欧美另类丝袜| 亚洲视频综合| 在线观看成人小视频| 国产精品99久久不卡二区| 精品成人免费| 亚洲视频电影在线| 亚洲精品麻豆| 性久久久久久久| 久久爱另类一区二区小说| 午夜免费在线观看精品视频| 久久av在线看| 欧美激情bt| 欧美一区二区三区四区在线| 免费日韩一区二区| 欧美综合77777色婷婷| 欧美大片免费观看| 欧美亚洲一区二区在线观看| 欧美成人午夜免费视在线看片| 亚洲欧美制服另类日韩| 欧美激情第五页| 男女av一区三区二区色多| 国产精品网站在线观看| 亚洲激情图片小说视频| 国产日韩一级二级三级| 亚洲乱码久久| 亚洲日产国产精品| 久久综合九九| 美女视频黄 久久| 国产日韩精品一区二区三区在线| 91久久中文| 亚洲精品永久免费| 另类激情亚洲| 老牛嫩草一区二区三区日本| 国产欧美欧洲在线观看| 亚洲四色影视在线观看| 亚洲视频电影在线| 欧美精品在线一区二区| 亚洲人成在线观看| 日韩亚洲欧美精品| 欧美精品www在线观看| 欧美激情第4页| 亚洲国产视频一区二区| 免费亚洲一区二区| 欧美国产视频日韩| 91久久久久久久久| 免费观看一区| 91久久精品国产91久久性色tv| 亚洲国产精品激情在线观看| 久久久亚洲综合| 亚洲福利国产| 日韩亚洲欧美成人| 欧美三级韩国三级日本三斤| 中国av一区| 久久久久久夜精品精品免费| 国产一级一区二区| 久久久无码精品亚洲日韩按摩| 噜噜噜91成人网| 91久久在线视频| 欧美日韩中文字幕| 亚洲尤物视频在线| 久久人人九九| 亚洲三级电影全部在线观看高清 | 99视频一区| 欧美日韩一区二区在线观看| 亚洲午夜精品一区二区三区他趣| 亚洲欧美影院| 伊大人香蕉综合8在线视| 久久夜色精品国产| 亚洲伦伦在线| 久久精品导航| 亚洲精品国产精品乱码不99按摩| 欧美精品一区二区三区蜜臀 | 久久午夜精品一区二区| 一区二区三区四区五区精品| 国产精品美女www爽爽爽| 欧美一级午夜免费电影| 欧美大片免费观看| 在线综合亚洲欧美在线视频| 国产欧美精品国产国产专区| 久久一区视频| 亚洲一区二区三区在线观看视频 | 亚洲综合99| 影音先锋中文字幕一区| 欧美三级乱码| 久久美女性网| 亚洲一区二区三区高清不卡| 欧美国产日产韩国视频| 欧美在线观看网站| 99国产精品久久久久久久久久| 国产日韩欧美中文在线播放| 欧美精品久久久久久久免费观看| 亚洲免费在线精品一区| 91久久国产综合久久蜜月精品| 午夜视频在线观看一区二区| 亚洲全黄一级网站| 国产在线精品自拍| 国产精品福利网站| 欧美精品成人91久久久久久久| 久久精品国产69国产精品亚洲| 一区二区国产在线观看| 欧美华人在线视频| 久久久久久久久久久久久久一区| 一区二区三区欧美| 亚洲精品网址在线观看| 国产综合视频| 国产欧美日韩中文字幕在线| 欧美午夜不卡影院在线观看完整版免费 | 亚洲国产一区二区a毛片| 国产欧美一区二区视频| 国产精品高潮呻吟久久av无限| 欧美ed2k| 欧美激情2020午夜免费观看| 久久男人av资源网站| 欧美一区二区三区在线免费观看| 中文国产成人精品久久一| 日韩图片一区| aa日韩免费精品视频一| 亚洲伦理在线观看| 99热免费精品| 一区二区精品| 亚洲一区日本| 亚洲欧美另类在线观看| 亚洲专区免费| 羞羞视频在线观看欧美| 欧美一级精品大片| 久久国内精品视频| 久久男女视频| 欧美电影资源| 欧美日韩不卡视频| 欧美午夜国产| 国产美女精品视频免费观看| 国产欧美日韩另类一区| 国产色综合网| 在线欧美亚洲| 99精品国产福利在线观看免费| 一本色道久久| 午夜精品区一区二区三| 久久久久久久综合色一本| 老司机aⅴ在线精品导航| 美女网站在线免费欧美精品| 亚洲国产精品激情在线观看 | 亚洲欧美日韩区| 欧美在线二区| 欧美黄色免费网站| 亚洲美女诱惑| 国产精品欧美日韩一区二区| 美日韩在线观看| 欧美日本不卡| 国产欧美日韩精品专区| 亚洲国产精品美女| 亚洲私人影院| 久久综合精品国产一区二区三区| 欧美二区在线| 一区二区三区高清不卡| 欧美在线免费| 欧美精品黄色| 国产日韩综合| 亚洲美女精品成人在线视频| 亚洲欧美日韩精品久久久| 久久视频在线免费观看| 亚洲卡通欧美制服中文| 欧美在线视频二区| 欧美日韩国产综合网 | 黄色小说综合网站| 一本色道久久综合亚洲精品小说| 欧美一区二区三区日韩视频| 欧美激情视频一区二区三区免费| 一本色道久久综合亚洲精品按摩 | 国产日韩一区二区| 日韩视频在线观看免费| 久久久久91| 一区二区av在线| 免费在线成人av| 国内精品久久久久影院色| 亚洲午夜久久久久久久久电影网| 欧美a级在线| 久久av红桃一区二区小说| 欧美日韩在线不卡一区| 亚洲国产另类久久精品| 久久久久久免费| 午夜精品久久久99热福利| 欧美日韩国产三级| 亚洲国产日韩欧美在线动漫| 久久这里有精品15一区二区三区 |