基于Python的Pygame框架研究_第1頁
基于Python的Pygame框架研究_第2頁
基于Python的Pygame框架研究_第3頁
基于Python的Pygame框架研究_第4頁
基于Python的Pygame框架研究_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、齊齊哈爾大學畢業(yè)設計(論文)齊 齊 哈 爾 大 學 畢業(yè)設計(論文)題 目 基于Python的Pygame框架研究 學 院 計算機與控制工程學院 專業(yè)班級 計本111 學生姓名 王攀拓 指導教師 趙鑫 成 績 2015 年 06 月 19 日摘 要該論文論述了Python語言中Pygame庫的框架結構和一些常用的該庫的API,使用Pygame庫進行2D游戲開發(fā)時需要注意的事項,以及進行2D游戲開發(fā)的常用技巧,站在開發(fā)者的角度,理論系統(tǒng)的講解了Pygame游戲開發(fā)中的使開發(fā)技巧。本論文旨在幫助入門級Pygame游戲開發(fā)者能夠快速的適應和熟悉該框架的開發(fā)規(guī)范,能夠迅速的使用Pygame框架進行相應

2、的游戲開發(fā)。 這個Pygame框架是一個對所有程序員開放的Python庫。Pygame作為Python語言的擴展,它的所有書寫規(guī)范都完全按照Python的語法規(guī)則來進行設計和開發(fā)。而作為一個開放的語言庫,意味著開發(fā)者能夠更多的看到底層代碼的運行原理,甚至修改底層代碼從而對開發(fā)者自身的程序進行優(yōu)化,當然著所有都得建立在開發(fā)者熟悉Python語言的基礎上。本論文站在理論的高度對Python下的Pygame框架進行了全面詳細的介紹和說明,還有更進一步游戲開放方面的技術指導,作為Python入門級的介紹,本論文足以滿足Pygame初學者的學習需求。關鍵字:Pygame;框架;游戲開發(fā);源代碼開放Abs

3、tractThis paper discusses the framework Pygame Python language library and the library some common API, matters need attention when using Pygame library 2D game development, as well as common 2D game development skills, developer's perspective is standed , system theory to explain the Pygame gam

4、e development make development skills. This paper aims to help entry-level Pygame game developers to quickly adapt and become familiar with development specifications of the framework can quickly use Pygame game development framework accordingly.The framework is running under the Python language an

5、opened source runtime. Pygame Python as an extension language, it's all written specifications are fully in accordance with the rules of grammar Python to carry out design and development. The library as an opened language, meaning that developers can see more of the operating principle underlyi

6、ng code, or even modify the underlying code so developers optimize their programs, of course, with all the familiar developer had to build in language Python basis.In this paper, at the height of the theoretical framework for Python Pygame under a comprehensive detailed introduction and description

7、of the game as well as a further opening up of technical guidance, as Python entry-level introduction, this paper is sufficient to meet the learning needs of beginners Pygame .Key words:Pygame;Frame;Game Development; Open sourceI目錄摘 要IAbstractII第1章 緒論111 課題研發(fā)的目的與意義112 可行性分析213 國內外研究現狀3第2章 Pygame基礎42

8、.1 Pygame來自Python42.2 Pygame環(huán)境的要求52.3 Python語法簡介52.4 Pycharm簡介62.6 Pygame環(huán)境搭建6第3章 Pygame模塊93.1 Pygame文件結構93.2 事件103.2.1 事件機制103.2.2 事件處理函數103.2.3 鼠標事件處理113.2.4 鍵盤事件處理123.2.5 事件過濾123.3 圖像123.3.1 色彩像素123.3.2 圖片處理133.3.3 動畫處理133.4 聲音143.5 動作163.5.1 精靈163.5.2 向量173.5.3 碰撞檢測183.6 控制183.6.1 鍵盤控制183.6.2 鼠標

9、控制183.7 游戲地圖19第4章 Pygame進階204.1 AI智能204.1.1 狀態(tài)機204.1.2 AI設計214.2 游戲優(yōu)化21第5章 Pygame開發(fā)思路235.1 設計游戲235.2 開發(fā)進程235.3 開發(fā)思路24結 論25參考文獻26致 謝27第1章 緒論電子游戲自上個世紀誕生以來,以著不可思議的速度發(fā)展著,從最初的按鈕丟硬幣簡單的游戲到如今的模擬的視頻游戲,電子游戲從最初的純娛樂產品到現在的游戲行業(yè),他的生命力越發(fā)的旺盛和持久,甚至游戲行業(yè)可以在美國經濟蕭條的時候力挽狂瀾而成為主要產業(yè)。誠然,所有的游戲開發(fā)都離不開游戲開發(fā)人員的辛勤耕耘,而支撐這些繁榮景象的正式一行行的

10、程序代碼,優(yōu)秀的代碼才能生產出令人滿意的游戲。但是作為世界級的前端技術,由于技術的封閉,程序開發(fā)始終只能是少數高端技術員的天下,在保護技術不擴散的同時,也大大的限制了程序開發(fā)的創(chuàng)新和發(fā)展,畢竟智慧藏于群眾。而Python語言的出現,正是有力的打破了程序開發(fā)的技術壁壘,開源的程序語言為更多的項目開發(fā)提供了更多的語言選擇,而開源語言的有點也在這體現,各種方便的接口API和別人書寫好的庫源代碼更好的方便了開發(fā)人員的技術選擇,從而加快了開發(fā)人員的開發(fā)進度,而所有的這一切正是與當今要求速度的市場需求不謀而合。作為開源語言的領軍人物,Python語言正以著勢不可擋的勢頭沖破并領軍整個IT開發(fā)行業(yè)。Pyga

11、me是Python下的一個開源游戲框架,繼承了Python開源、快速的優(yōu)點,還增加了更多的游戲開發(fā)的API,使得2D游戲開發(fā)進度大大的加快。11 課題研發(fā)的目的與意義告訴的經濟發(fā)展給我們帶來的不僅僅是生活水平的提高,增加的生活壓力使得人們在日常上班之余需要更多的娛樂項目來放松自己。無論是傳統(tǒng)的服務行業(yè)還是新興的娛樂行業(yè)都是旨在為大眾提供一種消遣時間放松自己的方式,而電子游戲的出現更是給傳統(tǒng)的消費市場注入了一種前所未有的新鮮活力。從簡單的按鈕游戲到模擬逼真的視頻游戲,不斷提高的游戲開發(fā)技術給人們帶來了越來越豐富的游戲體驗。但是,隨著移動設備的增加和人們加快的生活節(jié)奏,“小輕快”的移動端游戲席卷了

12、整個游戲市場,例如瘋狂的小鳥、飛機大戰(zhàn)等上手速度快、畫面精美的2D游戲引來不少玩家的瘋狂追捧。伴隨著玩家需求的迅速變化以及游戲市場的時間效應,游戲的開發(fā)周期和開發(fā)效率成為眾多游戲開發(fā)者的熱枕對象。Python語言作為一種開源的非編譯語言,強大的可擴展性以及簡單的語法結構迅速的走入了游戲開發(fā)者的視野。而Python下的Pygame開源庫就是這樣一個能夠承載游戲開發(fā)程序員開發(fā)效率的這樣一個開源的可擴展的庫。作為一個開源的游戲開發(fā)庫,Pygame為游戲開1發(fā)工作者提供了很多方便的接口API,借助這些API大大的縮短了開發(fā)周期,減少了游戲的研發(fā)成本。手游搜索量百度搜索量如下圖所示:圖1-1 手游搜索量

13、作為新興的Python開源語言,Python近四年的百度搜索量如下圖所示:圖1-2 python搜索量12 可行性分析Python是一門開源的語言,其對平臺的支持性表現的較為出色,目前市面上流行的windows系列、MAC系列甚至移動設備的Android系統(tǒng)都提供良好的平臺支持。所以對游戲開發(fā)者而言,選擇Python語言來開發(fā)游戲源代碼就不用考慮程序代碼不同平臺的兼容性。Pygame作為Python下的開源庫,不僅良好的繼承Python特有的語言優(yōu)勢,諸如語法簡單、數據類型強大、API操作簡單、面向對象的編碼方式云云,還增加了自己特有的框架優(yōu)勢,提供的像pygame.cdrom光驅模塊能夠直接

14、調用設備光驅從而大大減少了程序開發(fā)人員代碼編寫量。當然,Pygame還有很多的特別方便的模塊函數來提供相應的技術支持。對于玩家來講,一個游戲首當其沖的應該是游戲畫面是否符合他們的口味,而輕量級的Pygame庫對于畫面渲染的支持更是綽綽有余,尤其是針對2D游戲開發(fā)來講,Pygame在這個方面表現的甚至比其他語言表現的更加優(yōu)秀,而這也正是選擇Pygame來進行2D游戲開發(fā)的最有利的技術支持??偵纤?,無論是Pygame庫的技術支持,還是對游戲開發(fā)效率的考慮,Pygame在2D游戲開發(fā)方面都有著無比天然的優(yōu)勢存在,而這些正式本文對于Pygame框架研究的理論和實踐動機。13 國內外研究現狀Pytho

15、n從誕生之初就以其簡單的語法、良好的易讀性、開放的可擴展性吸引了大批的程序員紛紛學習使用,隨之而來的,更多的國外大學機構使用Python來進行計算和授課,甚至許多的知名大學吧Python語言作為程序員入門級別的必學語言。比如說麻省理工學院的計算機科學與編程導論、卡耐基梅隆大學的編程基礎都用Python語言講授,還有很多的科學機構也在采用Python來進行大型的科學計算,眾望所歸,Python語言在科學計算方面表現的非常優(yōu)異。Pygame作為Python的優(yōu)秀的擴展庫之一,也吸引了越來越多的開發(fā)者使用Pygame來進行游戲開發(fā)。隨著Python語言的流行,更多的游戲開發(fā)者將加入Pygame開發(fā)游

16、戲者的大軍中。相對于國外對Pygame研究的熱火朝天,國內則顯得比較冷淡,甚至市場上都沒有一本完整的介紹Pygame框架的指導書,所有的有關Pygame的資料只能從Pygame的官方網站的文檔里來獲取,但這些遠遠不能夠滿足國內一線游戲開發(fā)人員的開發(fā)需求。本文立足Pygame的官方文檔為技術支持,加上自己對游戲開發(fā)的理解,全面而系統(tǒng)的對Pygame框架進行介紹和講解,從而來填補國內這個方面的就屬空白,希望能對更多的游戲開發(fā)人員更大的啟發(fā)。第2章 Pygame基礎對于任何的開發(fā)游戲而程序員來講,對開發(fā)語言的了解一定要有基本的了解,正所謂兵馬未動糧草先行,本章節(jié)就簡單的介紹一下Pygame相關的開發(fā)

17、需求和Pygame的語言基礎語法。2.1 Pygame來自PythonPython作為現代編程語言的一種,也是一種面向對象的語言,由于它的非編譯性而且更多的是一種解釋性語言,可以很好的包裝進其他的語言種類,具有這樣的性質,我們可以稱它為膠水語言。Python儼然成為一種更高層次的通用解釋型的語言種類,正是由于這些特征,使得它能夠躋身成為目前全世界范圍內最受歡迎的編程語言之一。即使我們更多的稱呼它為腳本語言,但是也是有很多的大型項目采用Python語言來進行架構,比如豆瓣網、Google的后臺等等。Python的特點可以歸類為已下幾個特征:1. 簡單易學:Python的關鍵字較少,結構固定且簡單

18、,語法相對簡單,很快就能學會。2.可讀性強:Python代碼定義的更清晰。3.維護簡單:Python的源代碼維護起來非常方便。4.豐富的標準庫:Python的最吸引人的地方就是平臺兼容性好,可兼容windows和MAC等平臺。5.即時調試:人機的交互是即時展現的,可在控制臺輸入即執(zhí)行。6.黏合性好:多種硬件平臺的Python接口都相同,硬件黏合性表現優(yōu)異。7.易于擴展:程序員可以根據需要來添加任意低層次的庫。8.良好的數據庫支持:目前市面上所有的商業(yè)數據庫都有Python支持的接口。9.支持GUI編程:GUI編程的良好支持可以一直多種平臺。作為一個開源的語言種類,Python被全世界的程序員擴

19、展出了各種各樣的庫,Pygame就是其中之一。Pygame是一種使用SDL(Simple DirectMedia Layer)編寫的游戲庫,即使SDL是采用C語言進行編寫的,不過他也可以采用C+來進行編寫和擴展,正如你所見Pygame就是Python下的一個開源的數據庫。隨著越來越多的優(yōu)秀的程序員加入Pygame的開發(fā),Pygame的完善性會越來越好。2.2 Pygame環(huán)境的要求Pygame作為Python下的一個開源框架,平臺的兼容性非常的好,目前市面上流行的幾乎所有的操作系統(tǒng)都有很好的支持,隨意對平臺要求不是很高。而且,作為一個非編譯的語言種類,對開發(fā)平臺的硬件需求也不會有很大的要求,一

20、般的平臺配置就滿足開發(fā)需求。而本文為方便起見所有的代碼都運行在windows7下的平臺上,其他操作系統(tǒng)例如MAC系統(tǒng)可以參照windows7系統(tǒng)下的操作來進行環(huán)境的配置和搭建。2.3 Python語法簡介Python設計之初就是是為了語言代碼的可讀性高度完美。在語言設計之初就考慮到了這點,語言盡量使用其他種類的語言中常見的單詞語法,標點符號也是采用其他語言的標點,這樣Python代碼結構看起來相當美觀。有別于靜態(tài)語言諸如C語言那樣大量的重復性語句,也不會有特殊的語法出現顯得代碼結構不協(xié)調。Python采用縮進的強制性代碼書寫規(guī)范使得所有Python的程序員養(yǎng)成優(yōu)秀的代碼書寫習慣。采用縮進規(guī)則的

21、好處就是,使用縮進的位置來控制代碼塊的退出和進入 ,而不是其他代碼用特殊符號例如花括號來控制語句塊。Python的控制語句和其他語言基本類似,主要有以下幾種:if語句,當條件成立時運行語句塊。和if配和使用的有else和elif。for語句,作為最重要的遍歷語句,可以使用for語句便利所有的Python數據結構。while語句,當控制條件為true時,代碼塊中的代碼會循環(huán)執(zhí)行。try語句。except,finally配合try語句塊使用以此處理程序代碼中的異常情況class語句。用于定義類型。def語句。可以進行函數或者類型的自定義。pass語句。慈航代碼不執(zhí)行,以空行執(zhí)行。assert語句。

22、調試程序時采用此語句來測試運行條件是否滿足。with語句。在Python2.6新增的語法語句用來把語句塊在一個場景中運行。例如代碼塊對數據進行加密,退出代碼塊后即時進行數據解密。yield語句。迭代器時使用,返回值是一個迭代器的元素。就是從Python2.5以來這個語句變成一個運算符。raise語句。制造一個錯誤。import語句。導入一個模塊或包。from import語句。導入包中的某個模塊或者導入模塊中的某個對象。import as語句。將導入的對象賦值給一個變量。in語句。判斷一個對象是否在一個字符串/列表/元組里。Python語言的表達式和C/C+有許多相同之處。區(qū)別只是很少的一部分

23、。主要的大部分算術運算符與C/C+類似。加法或者取正、減法或者取負、乘法、除法、整除、乘方、取補、取模的表示方法使用+, -, *, /, /, *, , %表示。>>, <<表示右移和左移。&, |, 表示二進制的AND, OR, XOR運算。比較兩個值時使用>, <,!=, =,>=, <=, 分別表示大于、小于、不等于、等于、大于等于、小于等于。在這些運算符里面,, |, , &, <<, >>必須在整數中使用。Python的邏輯運算使用and、or、not。Python對于字符串的處理則采用(單引號

24、)和“(雙引號)來表示字符串。Python更為高級的一點,支持對list數據格式的切割,可以保存完整數據或者一部分數據。對函數的遞歸、默認參數、可變參數都有很好的支持,但函數的重載并不支持。對象的方法是指綁定到對象的函數。作為動態(tài)系統(tǒng)的一種,Python作為一種面向對象的語言支持程序員根據需要進行類型的自定義。2.4 Pycharm簡介工欲善其事,必先利其器,Python作為一種開源語言它的IDE編輯器有許許多多,其功能和方便程度也是更有千秋。本文所使用的IDE是Pycharm,它是目前Python界比較流行的一個IDE編輯器,其界面和eclipse高度相似,所以使用起來也不會有太大的違和感。

25、目前Pycharm已經更新到4.5版本,其高度的穩(wěn)定性和友好的使用界面使得它更瘦Python開發(fā)者的青睞。作為一款IDE,Pycharm完整的具備了普通IDE具有的功能。語法高亮、調試、Project管理、自動完成、智能提示、代碼跳轉、版本控制、單元測試。當然,PyCharm還為Django提供了許多的功能模塊內,同時對Google App Engine也提供了很好的支持,更讓程序員們興奮的是,PyCharm對IronPython也有很好的支持。它的安裝和常見的軟件安裝一樣,找到Pycharm官網之后下載相應版本安裝,安裝過程較為簡單,在此就不做贅述。2.6 Pygame環(huán)境搭建作為Pytho

26、n下的語言庫,安裝Pygame之前首先得配置好Python的框架運行環(huán)境。Python的安裝比較簡單下面就進行介紹。本書所有的程序代碼均在win7系統(tǒng)下編寫調試,所以僅列出windows系統(tǒng)下的安裝方法,其他操作系統(tǒng)的安裝方法可參考/,再次就不一一贅述。在Windows操作系統(tǒng)上配置Python環(huán)境。首先,從Python的官方網站找對對應的平臺版本,注意電腦的操作系統(tǒng)是32位或者64位下載最新的2.7.9版本,地址是這個:/ftp/python/2.7.9/python-2.7.9.m

27、si然后,運行下載的MSI安裝包,在選擇安裝組件的一步時,勾上所有的組件:install-python-windows特別要注意選上pip和Add python.exe to Path,接下來按照提示說明一步一步的安裝即可完成安裝。Python默認安裝到C盤目錄下,如有需要請自行調整,控制臺輸入如下代碼即說明Python已經成功安裝,輸出65+46的和:圖2-1安裝成功示例ok,安裝成功,下面需要配置pip的環(huán)境變量,否則,window系統(tǒng)是不認識pip命令的。下圖是pip的安裝路徑:圖2-3文件路徑下面介紹常用的比較方便的安裝方法:第一步:瀏覽器地址欄輸入:第二步:運行cmd值get-pip

28、.py所在目錄,運行代碼:圖2-2安裝pip在python中Scripts目錄下,將這個目錄添加進環(huán)境變量中就能完成環(huán)境配置!下面運行pip安裝python包:C:bak>pip install pygame卸載包:C:bak>pip uninstall pygame第3章 Pygame模塊承載游戲的主題就是游戲的各個模塊,這些模塊正式組成整個游戲程序的骨頭和血肉,只有神企鵝的了解各個模塊的功能和用法,才能使我們的游戲程序設計更加的得心應手。3.1 Pygame文件結構作為一個完整的框架,Pygame有著自己的一個標準的文件結構,當然你也可以有自己的文件結構,但常用的規(guī)范的文件結構

29、可以加快你的開發(fā)進程使得更多的時間用在代碼的開發(fā)和實現上。一個典型的pygame腳本結構如下:run_game.pylib/image/*font/*sound/*sound.pydata/util.pymenu.pygame.py圖3-1 文件結構圖Pygame的源代碼被統(tǒng)一存放在lib目錄下,用于聲音、圖像等相關模塊的源代碼。至于data就是存放整個游戲的資源文件,例如圖像、聲音等文件放在這個文件夾里。當然,所有的這些都是為了給一個更好的開發(fā)規(guī)范,完全可以按照自己的喜好來進行文件的結構設計,本文的所使用的文件結構就以它為模板來進行程序的設計與開發(fā)。3.2 事件許多的高級程序的設計語言都支持

30、事件機制,因為模擬現實世界的最重要的特征就是游戲開發(fā)者在游戲設計過程中一項重要的任務,更多的事件機制來增加人機交互的親密度,使得游戲更加的人性化和友好。事件機制就是很好的一例。我們需要事件來來增加我們的游戲友好度。3.2.1 事件機制正如哲學所訴說的那樣,世界中最普遍就是事物之間的聯(lián)系,所有的事物聯(lián)系在一起才組成了這個現實的世界。無論是個體的狀態(tài)改變還是移動亦或是某個時間的進展過程中的具體某一個階段均可以引發(fā)一個事件,任何一個事件的產生都會引發(fā)另外的事件發(fā)生,而這些都會在人的大腦皮層中反應,從而進一步的影響你做出的決策。不管怎么說,所有的反應都會決定我們最終做出一個實質性的決定。下圖示例了反應

31、的流程機制:事件源響應器響應者事件引發(fā)通知觸發(fā)圖3-2 事件的流程3.2.2 事件處理函數Pygame中使用處理所有的事件的方法是pygame.event.get(),但這是一個開放的方法,就好比敞開大門允許所有的人隨意進出。Pygame在處理這種情況時又給出了pygame.event.wait()方法來控制進出,顧名思義,此方法就是等到一個事件發(fā)生后再繼續(xù)下去,就像限流一樣,有門票的一個跟一個才能進入,因為游戲往往是需要動態(tài)運作的;而另外一個方法pygame.event.poll()在這個方面做的鼻前兩者更好,他會根據現有的事件來返回給程序一個真實的事件,也可以是什么都沒有。下表是一個常用事

32、件集:表3-1事件監(jiān)聽函數及功能對應表事件參數事件監(jiān)聽用戶按下關閉按鈕noneQUITPygame被激活或者隱藏gain, stateATIVEEVENT鍵盤被按下unicode, key, modKEYDOWN鍵盤被放開key, modKEYUP鼠標移動pos, rel, buttonsMOUSEMOTION鼠標按下pos, buttonMOUSEBUTTONDOWN鼠標放開pos, buttonMOUSEBUTTONUP游戲手柄(Joystick or pad)移動joy, axis, valueJOYAXISMOTION游戲球(Joy ball)?移動joy, axis, valueJO

33、YBALLMOTION游戲手柄(Joystick)?移動joy, axis, valueJOYHATMOTION游戲手柄按下joy, buttonJOYBUTTONDOWN游戲手柄放開joy, buttonJOYBUTTONUPPygame窗口縮放size, w, hVIDEORESIZEPygame窗口部分公開(expose)?noneVIDEOEXPOSE觸發(fā)了一個用戶事件codeUSEREVENT3.2.3 鼠標事件處理MOUSEMOTION監(jiān)聽鼠標移動事件,當檢測到鼠標移動時觸發(fā)此方法,其中有三個參數:buttons 這個參數包含了三個數字的數組,這三個值分別表示右鍵、左鍵、中間的鍵,

34、如果是1就表示按下,反之為0。pos 當然就是鼠標的位置了。rel 表示此時距離上次鼠標發(fā)生時間時的像素距離。和MOUSEMOTION類似的,我們還有MOUSEBUTTONDOWN觸發(fā)鼠標按下事件MOUSEBUTTONUP觸發(fā)鼠標彈起事件,看名字就明白是什么意思了。更多時候考慮的是鼠標的點擊即按下和彈起,所以這個方法并不常用。它們的參數為:button 沒有s,看清楚得,表示操作的某一個按鍵。pos 同上3.2.4 鍵盤事件處理鍵盤和游戲手柄的事件比較類似,為KEYDOWN來處理鍵盤按下的操作和KEYUP處理鍵盤彈起的操作,使用方法和鼠標的事件監(jiān)聽完全一樣。3.2.5 事件過濾通常來講大部分的

35、事件并不是我們需要處理的,就像是我們并不歡迎所有人的造訪,無論處于什么樣的原因。所以需要一個方法來幫我們排除掉我們不感興趣的事件,當然你也可以選擇不處理這些事件,但這樣的以來就顯得不夠友好,在Pygame中過濾事件采用pygame.event.set_blocked(KEYDOWN,KEYUP)來設置某個按鍵的按下和彈起事件不被監(jiān)聽,反之,pygame.event.set_allowed()來設置那些事件是被我們允許的。3.3 圖像任何一款電子游戲吸引你去玩的永遠是畫面做的是否精良,是否符合你的口味,完美的貫徹了“以貌取人”的方法。所以更多的游戲開發(fā)者把精力都用在了圖像的處理上。對于圖像的處理

36、Pygame擁有自己獨自的一套接口方法。對于圖像,Pygame也有自己的分析和理解。3.3.1 色彩像素無論是電腦游戲還是手機游戲,都是像圖像化靠攏的,盡可能的通過圖像的變化來反映游戲的變化,通常來講游戲開發(fā)者的大部分力氣都會利用在開發(fā)游戲圖像上,并以此來提高游戲的畫面感,而圖像的效果是游戲開發(fā)的永恒話題。本節(jié)主要講述圖像中最基礎的組成元素之像素。針對像素就不得不提到分辨率,尺寸為1280*1024的顯示器,他就有1310720個像素快,通常來講,32位RGB的操作系統(tǒng),每個像素能夠顯示出16.7百萬種不同的顏色。對于色彩來講就是簡單的由像素的組合排列來實現顏色的各種變化。函數格式color(

37、255,255,255),括號中間參數為設置的RGB顏色的數值格式。可以使0255的任意值,(0,0,0)為黑色,(255,255,255)為白色。3.3.2 圖片處理對于圖片的處理共有兩種圖片的加載和圖片的儲存。從文件加載源的圖像。您可以通過其中一個文件名或者一個Python類文件對象。pygame的會自動判斷圖像類型(例如,GIF或位圖),并創(chuàng)建一個從數據的新的表面對象。在某些情況下,將需要知道文件擴展名(例如,GIF圖像應該以“.gif注意”)。假如傳遞的是一個源文件對象,可能會考慮到文件的名字來表示namehint參數。在Pygame中,使用pygame.image.load()來加載

38、圖像,只要把文件的名字作為參數傳入進去,這個方法返回的就是一個完整的圖像接口。同時這個接口靠兼容了所有的圖像格式,這就有效的把這些不同給隱藏了起來。作為接口,可以任意的對這個接口對象進行任意的圖像操作,例如涂畫、剪切、復制等種種。不得不說,屏幕也是一個接口對象,pygame.display.set_mode就返回了屏幕的接口對象。對于個別的不怎么流行的圖像格式,例如BMP,至少得是壓縮過。作為判斷圖像格式的方法,pygame.image.get_extended()的返回值就可以有效的反應此圖片能否被加載。在此建議使用os.path.join()來測試圖像的兼容性。Pygame中保存圖像的方法

39、是save(Surface,filename),這將為您節(jié)省表面無論作為PNG、BMG、TGA亦或是JPG的圖像,遇到無法識別的圖像格式,則Pygame默認格式為TGA。包括TGA和BMP在內沒有壓縮的文件格式,PNG,JPEG保存新的圖片。3.3.3 動畫處理動畫就是有無數的靜態(tài)圖片不停地進行重新加載而產生動的效果,而作為動畫,其中重要的參數就是動畫的幀,幀就算是動畫的最關鍵的參數,可以理解為單位時間內加載的圖片數量,當然幀率越高,產生的動畫就越細致,動畫的效果更佳充足。Pygame中對于動畫的處理也有自己的處理方法。也就是說,我們所設計的動畫都是在時間軸上進行運轉的,只需要知道上一個畫面到

40、現在經歷的時間時多少,我們就能決定回執(zhí)下一幅畫是否開始。Pygame.time模塊中有一個Clock的接口對象,使得這些變得容易了許多:clock = pygame.time.Clock()time_passed = clock.tick()time_passed = clock.tick(30)代碼第一行就是進行Clock初始化,然后就是獲得上次使用這個函數的時間(以毫秒計時),第三行是控制動畫最重要的,就是幀率,把它放到每一個循環(huán)當中,tick中的參數就是最大幀率,這樣一來,游戲運行的時候不會消耗掉機器的CPU資源。但這僅僅是最大的幀率,用戶并不能看到這些數字,更多的時候會出現用戶的性能不

41、好,又或者是這個動畫本身實現的太過復雜,實際情況下的幀率并不能達到這個幀率,我們需要一種更有效的手段來控制我們的動畫效果。解決這個問題的方法就是使用一個叫做精靈(sprite)的對象來承載動畫的主題,通常來講所有的游戲都會用到這個對象來承載圖像本體,這樣的話,所有的動畫都會照常實現,只是實現的時間會有所不同這就是玩家們所說的游戲的流暢度。3.4 聲音作為一種存儲數據的格式,聲音和圖片劇透差不多的性質。所以在對聲音的處理方面,Pygame對于聲音的處理和圖片大致相同。考慮的方面也是兩個,一個是聲音的加載,一個是聲音的存儲。下面就是Pygame聲音的相應操作。對于聲音的處理有以下的幾種處理對象:表

42、3-2 Sound對象對應表實現功能方法名聲音淡出,可接受一個數字(毫秒)作為淡出時間fadeout獲得音頻文件長度,以秒計get_length文件播放次數get_num_channels獲取音頻的音量(0.0 1.0)get_volume開始播放,返回一個Channel對象,失敗則返回Noneplay設置音量大小set_volume停止播放stopPygame.mixer.music是播放MP3和OGG格式的音頻文件,和圖像的加載方法類似,加載音頻的方法就是pygame.music.load(),然后使用pygame.music.play播放音頻文件,這里并不需要類似Music的對象或者類,

43、因為大部分情況下,同一時間上只需要播放一個音頻就行。不放的時候就用stop()方法來停止就好了,當然很自然有類似錄影機上的pause()和unpause()方法。表3-3 Channels對象對應表功能方法名淡出fadeout如果正在播放,返回trueget_busy獲取播放完畢時要做的event,沒有則為Noneget_endevent獲取隊列中的聲音,沒有則為Noneget_queue類似get_volume暫停播放pause類似play將一個Sound對象加入隊列,在當前聲音播放完畢后播放queue設置播放完畢時要做的eventset_endevent類似set_volume立刻停止播放

44、stop繼續(xù)播放unpause對于聲音的處理不僅僅是用sound來進行簡單的加載和播放,在實際的游戲程序開發(fā)過程中,我們需要花樣繁多的聲音變換來增加游戲的趣味性,比如聲音的疊加或者是聲音的淡入淡出,聲音的詳細控制,比如即時的聲音的音量控制,或者即時的播放控制等等,這都需要更加高級方便的聲音控制接口來進行處理這些來自于聲音的資源.當然Pygame庫也不例外,它提供了諸多的音樂操作的jiekouAPI,通過這些API不僅可以減少游戲開發(fā)者的開發(fā)難度,同時這樣一來也為游戲開發(fā)者能夠開發(fā)出更加多姿多彩的游戲程序提供了更多的可能性,下表就是Pygame為游戲開發(fā)者提供的Music接口API:表3-4 M

45、usic對象對應表功能方法名淡出fadeout獲取音頻播放狀態(tài)get_endevent獲取聲音音量get_volume加載一個音樂文件load暫停pause播放play從新開始重新播放rewind設置音頻set_endevent設置聲音大小set_volume立刻停止播放stop繼續(xù)播放unpause獲得當前播放的位置,毫秒計get_pos3.5 動作對一個游戲來講,所有物體都要進行運動,無論是敵人還是玩家所控制的主角都需要在整個游戲世界的地圖進行移動,而這些移動就是Pygame需要處理的元素的動作。動作的組成兩部分,一個是動作的本體也就是誰在運動,還有一個就是做什么動作,無論是直線、斜線甚至

46、翻轉都是包括在動作之中,Pygame對于動作的處理給出了很好的接口支持。3.5.1 精靈首先得認識到動作的本體,在游戲中,精靈就是作為本體出現,他更多的是一張圖片,也可以是Pygame繪制的一個圖形,甚至是一個點。精靈(sprite)就是上面所說的動作的本體,既然是所有的游戲必須的,sprite就作為Pygame中一個公共的類,而他其中的常用方法也有很多。對于游戲來講,sprite也是游戲開發(fā)所特有的一個類,我們首先對sprite這類進行研究。Pygame中sprite類有很多的處理方法來滿足開發(fā)者的開發(fā)需求。pygame.sprite.Sprite是Pygame庫中的一個基本的類,所以在使用

47、類的時候只需要繼承這個類就行。Sprite只要包括了以下幾個變量:Self.image負責顯示的內容。示例:self.image=pygame.Surface(x,y)顯示一個大小為XY的矩形,self.image=pygame.image.load(filename)通過加載一張文件名為filename的圖片來表示一個界面中的精靈。self.image.fill(color),對圖片進行染色。示例:self.image=pygame.Surface(x,y)self.image.fill(255,0,0) ,用RGB的模式對圖片進行染色。Self.rect精靈顯示位置。通常來講,第一步sel

48、f.rect=self.image.get_rect()獲取image的大小,第二步設置self.rect設置顯示的矩形位置,具體的用self.rect.topleft(topright、bottomleft、bottomright)設置不規(guī)則圖形的角的顯示位置。除此之外還有self.rect.top、self.rect.bottom、self.rect.right、self.rect.left來對下上右左進行顯示。self.update 判定精靈的動作成功。Sprite.add 添加精靈到group中。Sprite.remove 刪除group中的精靈Sprite.kill 刪除group中

49、的所有精靈Sprite.alive 判斷group中的精靈是否存在上面關于精靈說了很多,但是對于精靈的優(yōu)點還有很多,prgame.sprite有著碰撞和層的概念在里面。層是為了解決Ggroup的次序問題而引入的,所以精靈的位置并不能確定,真需要的話,可以使用orderupdates或者layerupdates,具體的不在此贅述,因為等到用這兩種方法解決的問題,太過深奧并不符合本文的創(chuàng)作初衷。3.5.2 向量向量作為我們高中的數學知識,相信大家都很熟悉。而之所作為Pygame中的處理動作的基礎標記,是因為在2D游戲開發(fā)中,游戲世界中物體的位置確定主要有像個參數決定,橫向位置X和縱向位置Y,而向量

50、的表示剛好符合這一點(X,Y),這樣一個向量數組就完整準確的描述了游戲畫面中的物體位置。至于對物體位置的改變,只要改X,Y參數的變化,就能實現對游戲世界中物體的位置進行操作。3.5.3 碰撞檢測游戲世界中最重要的一項功能就是物體的碰撞,以此來檢測產生相應的時間從而使得游戲的可玩性更加的豐富和有趣。同時碰撞檢測也是游戲中不可避免的現象處理。對于碰撞的檢測,有很多種方法。具體的可以想象,任何的精靈模塊發(fā)生碰撞的話,必定會有模塊的線段相交。那么只需要判斷線段是否相交來判斷模塊是否相撞。如果有就可以完全return true。上節(jié)講到的向量就是為了處理本節(jié)的碰撞檢測,像素級別的碰撞檢測就是對相同向量位

51、置上的精靈進行判定,如果重疊則為碰撞反之沒有碰撞。在Pygame中就是計算(X,Y)的值來判斷精靈的種類。3.6 控制對于所有的游戲來講,鼠標和鍵盤是游戲的主要輸入設備。鍵盤是用來控制方向和大部分的動作操作,鼠標則控制位置從而豐富了操作的數量和游戲體驗。當然,相比較游戲手柄而言,鍵盤和鼠標并不是為了游戲而設計專門的。3.6.1 鍵盤控制在本文的前幾章中有提到過鍵盤的事件監(jiān)聽,同樣的翻譯成控制的話就是通過鍵盤來控制,當pygame.event.get()獲得所有的事件,當返回值是KEYDOWN時,這個方法就會判斷按下的鍵的種類。這里提一下pygame的pygame.key.get_pressed

52、()是用來獲取所有的按鍵的鍵值,進而返回一個包含所有鍵值的元祖,元祖的值就是對應鍵就是按鍵按下與否。3.6.2 鼠標控制對于鼠標來講,主要有兩個控制游戲的因素,其中一個是鼠標停留的位置,可以使用pygame.mouse.get_pos可獲得,一個是鼠標的按鍵操作,這個鍵盤類似。當然我們可以用鼠標來控制方向,比如說在3D游戲中視角的切換可以通過鼠標來控制。注意,在這個時候我們不能獲取鼠標的位置來控制視角的切換,因為鼠標可能移出有效窗口的外部,不過我們可以對比此時鼠標相對上一幀的位移量來對視角進行控制。更多的時候鍵盤和鼠標是結合起來一起用的,這樣的組合會產生更多的操作可能,也能更好的控制游戲,增強

53、游戲體驗。3.7 游戲地圖大部分的游戲類型中,游戲地圖都是主要的組成部分,所以優(yōu)秀的地圖就需要重點來設計, 更直白的說,地圖就是有一個二維數組組成的,需要做的就是快速的吧二維數組顯示到游戲主屏幕上。假設自己設計的游戲地圖不是特別的大,這時候就可以把完整的整個的地圖 畫在一張圖上,反之,如果游戲的地圖非常的大,一個畫面并不能展現出來,那么地圖的繪制和顯示就會顯得非常困難,這時候另外一項技術就有用武之地了,圖塊(Tile)。所謂Tile,是一種將地圖中公共的圖像元素單獨的提取出來,而完整的地圖就是以上的這些圖塊拿組成的,這樣一來,我們繪制地圖的任務量就大大的減少了,只需要把地圖分割成一個

54、個小塊,然后將地圖上對應的圖像內容填充到相應的地圖塊中。之前將sprite的時候,講到為了實現動畫的效果,我們把每一張圖片進行編號,然后在需要的時候對相應的編號進行一次的播放以此來實現動畫的效果,同樣的道理在實現地圖的時候我們也可以這樣實現,甚至某種意義上講地圖也是動畫的一種只是它是在讀地圖的時候進行圖片加載。我們把每一個圖塊進行編號,然后在需要載入地圖的時候現在入地圖格子,也就是一個以二維數組保存的地圖信息,最后在每一個格子上面加載我們需要的地圖圖塊從而實現地圖的加載。第4章 Pygame進階以上三個章節(jié)是把所有關于Pygame的基礎框架知識進行的大概的描述,一般的簡單的游戲功能都能夠實現,

55、換句話說能夠滿足一般的游戲設計者的需求。但是對于更深層次或者更高級具有更高級玩法的游戲設計上面的框架遠遠不能夠滿足設計者的需求。人機交互和更優(yōu)的游戲體驗才能使得游戲更加的吸引玩家的長久注意力,而這兩項也是那些著名的歐系能夠經久不衰的原因。4.1 AI智能游戲需要的更多的是人機的交互,而這些都需要一項技術來進行相應的技術支持,那就是AI智能的引入。這里的AI智能并不是真正的智能機器人的那種意思,只是增加了更多的人機交互的機會提供了更好的人機交互的體驗。4.1.1 狀態(tài)機在之前的章節(jié)我們提到過狀態(tài)機的相關知識,這節(jié)為了更好的了解它,我們首先要知道什么是狀態(tài)機。有限狀態(tài)機的定義又稱有限狀態(tài)自動機,用來表示幾個狀態(tài)和狀態(tài)相應的轉換關系的數學模型,下圖就是上章節(jié)提到的敵人的狀態(tài)機:玩家消失搜索怪守地圖攻擊驅逐玩家發(fā)現玩家圖4-1 狀態(tài)機狀態(tài)機主要就是在描述兩個問題,一個是我現在正在做什么,下一步我要做什么。而促使這兩個狀態(tài)進行轉化的條件就是狀態(tài)機運行的動力之源,包括狀態(tài)機的載入和退出。正式不同狀態(tài)的之間的動態(tài)相互轉換組成了狀態(tài)機的基本運行機制。4.1.2 AI設計誠然,我們設計AI的初衷并不是為了可以再系統(tǒng)上進行作弊的敵人來破壞游戲的平衡性,相反而是說這樣一個作弊的敵人可以滿足玩家對游戲的挑戰(zhàn)性需求 。但是,過于強大的AI會適得其反。相比較大部分的游戲

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論