楊玄燁
(重慶城市科技學(xué)院,重慶 402160)
計算機是現(xiàn)代社會人們生活與工作中不可缺少的重要一部分,在對計算機軟件進行使用時,依照不同的需求,產(chǎn)生不同的高級匯編語言,在各種語言的應(yīng)用中,開發(fā)與設(shè)計各種軟件是工作人員最主要的工作任務(wù)[1]。Python是具有跨平臺性質(zhì)的計算機程序設(shè)計語言,它的腳本程序設(shè)計語言及內(nèi)置代碼庫對多種屬性都有集成,由于其在持續(xù)不斷地更新和加入語言新功能,現(xiàn)已廣泛應(yīng)用于圖形處理、數(shù)學(xué)處理、文本處理、數(shù)據(jù)庫編程、網(wǎng)絡(luò)編程、多媒體應(yīng)用等場合[2]。面向?qū)ο笫瞧渥罱?jīng)典的特征屬性。Python支持面向?qū)ο蟆⒚钍胶秃瘮?shù)式的編程方式,能夠進行內(nèi)存管理,在某些應(yīng)用中,其開發(fā)效率能夠比用C語言開發(fā)提高十幾倍[3]。Python語言在具有高效率的同時也完全面向?qū)ο?,在面向?qū)ο蟮木幊坦こ讨芯哂邢喈?dāng)高的效率,其內(nèi)置語法簡潔并支持動態(tài)輸入,在應(yīng)用程序開發(fā)中,可以具有優(yōu)勢性的高效處理應(yīng)對多種模式的字節(jié)流,實現(xiàn)較快的開發(fā)速度,因而也使其被廣泛運用[4]。Python語言在各種編程以及許多操作系統(tǒng)平臺中均被作為腳本語言,用于精簡應(yīng)用程序以實現(xiàn)有效開發(fā)。本文所研究的是事件精靈組的特點及其技術(shù)運用。
在游戲的制作開發(fā)中,通常把顯示圖像的對象叫作精靈。它包含圖像加載、位置變化、繪制圖像,這原本需要程序員編寫代碼進行控制的Sprite精靈需要有兩個重要的屬性:image(要顯示的圖像)、rect(圖像要顯示在屏幕的位置)。精靈默認(rèn)的update方法,在子類可以重寫此方法,它可以在每次刷新屏幕時,更新精靈位置,而精靈組則是多個事件精靈的集合。精靈組對象update方法的調(diào)用可以自動對組內(nèi)每一個精靈的update方法進行調(diào)用,除此之外,調(diào)用精靈組對象的draw屏幕對象方法可以將組內(nèi)每一個精靈的image繪制在rect位置。
Pygame(www.pygame.org)是Python平臺下的一款著名的2D游戲開發(fā)專用庫,該開發(fā)庫構(gòu)建在著名的跨平臺游戲開發(fā)庫SDL(simple direct media)之上,其中提供了全面的游戲開發(fā)支持模塊,從而可以使游戲開發(fā)的難度大為降低[5]。它的集成包括joystick、camera、event、gfxdraw等功能模塊,它作為基于Python平臺而設(shè)計出的一款優(yōu)秀的代碼集成庫,值得稱道的是它的應(yīng)用不僅適于單一平臺,為了應(yīng)對平臺多元化的需求,Pygame庫還加入了跨平臺的元素。因此,基于Pygame庫所開發(fā)的游戲可以兼容現(xiàn)存市面上各大主流的操作平臺。因它的開發(fā)者在開發(fā)中注重人機交互的效率,所以它的誕生使得Python使用者對于2D游戲開發(fā)的效率和運維更高效,開發(fā)者可以便利地、自由地選取庫內(nèi)已經(jīng)集成的子模塊,其只需把目光投入游戲的核心模塊,將瑣碎的邊枝問題通過子模塊的調(diào)用來解決,這使得開發(fā)的質(zhì)量和速度有了大大的提升。它可以繪制圖形,與游戲桿、游戲手柄、追蹤球進行交互、處理事件與事件、訪問音頻采樣數(shù)據(jù)等,而對于精靈組的應(yīng)用,Python專用庫Pygame提供了兩個類pygame.sprite.Sprite,用于存儲圖像數(shù)據(jù)image和位置rect的對象,而pygame.sprite.Group則是一個組類方法,助益精靈的隊列的出列和入列的效率。
2.1.1 精靈組的功能模塊
精靈組是多個精靈的集成,如圖1,在Pygame庫中有許多便于開發(fā)者開發(fā)的源代碼模塊,精靈組的使用需要通過各個固有方法的使用來進行文檔信息的傳遞:add方法可以向組中增加精靈,在精靈生成之后需要通過add方法傳入游戲主循環(huán)之中;sprites方法可以返回所有精靈列表,這是一個后端操作,它的使用可以便于后端系統(tǒng)讀取精靈和操作信息。同時在游戲設(shè)計中精靈的設(shè)置需預(yù)置image和rect屬性,通過對于image和rect屬性的傳入生成相關(guān)的精靈,在每個精靈生成后都需要派生精靈子類,image屬性可以記錄圖像數(shù)據(jù),rect屬性可以記錄英雄在屏幕上的位置,精靈組的draw方法可以將組中所有精靈的image,繪制到Surface的rect位置,形成屏幕的動態(tài)畫像,而update方法可用于對精靈位置的更新,kill方法可以將精靈從所有組刪除,即代表精靈的死亡(圖2)。精靈組通過各功能模塊的調(diào)用和數(shù)據(jù)傳遞呈現(xiàn)連續(xù)的圖像變化,這是一個密不可分的系統(tǒng)整體。
圖1 精靈組的功能模塊及位置
圖2 精靈組的功能位置
2.1.2 精靈組的位置
在一個游戲運行過程中,本質(zhì)上分為游戲初始化和游戲循環(huán),從游戲初始化開始,需要精靈組和精靈在系統(tǒng)內(nèi)部的自我創(chuàng)建,在其創(chuàng)建之后,精靈組會對游戲的開始界面等設(shè)置進行預(yù)加載,越大的游戲所需要生成創(chuàng)建的精靈越多,同時對文檔讀取需求越多,因此需要的時間就越長,為此游戲廠商為了對加載時間進行可視化表達,通常會在屏幕設(shè)置一個加載進度條以統(tǒng)計加載時間。
游戲循環(huán):update、draw、pygame.display.update的交替循環(huán),它會對于上一模塊所傳遞的數(shù)據(jù)流在后臺進行新圖像的更新、繪寫,同時刪除舊的圖像,毀滅失效的精靈,將新生成的精靈更新到顯示設(shè)備上。經(jīng)研究表明,人體所能接受的極限幀率一般為12幀每秒,因此決定了圖像的刷新速度的幀率遠(yuǎn)遠(yuǎn)大于人體視覺的極限幀率,這樣才可以將動態(tài)圖像反饋至我們視覺。通過這個框架可以形成UI游戲,開發(fā)出2D游戲。
2.1.3 精靈組的運用分析
對于精靈組的設(shè)計需要構(gòu)建一個完整的游戲,精靈組本質(zhì)上是對數(shù)據(jù)的后端處理,它需要有數(shù)據(jù)的傳入和輸出,而對于數(shù)據(jù)文檔的傳遞是游戲運行的核心。如圖3所示,在游戲初始化階段需要先后構(gòu)建GUI游戲窗體,再自動調(diào)用事先預(yù)置Pygame庫游戲時鐘模塊,對游戲運行時間計時。然后是創(chuàng)建精靈、精靈組,用隨機函數(shù)生成各個精靈組,由于現(xiàn)代計算機CPU強大的計算能力,這些行為的加載,需要的時間幾乎可以忽略不計。預(yù)加載完畢后,進入游戲的主循環(huán),先是通過讀取內(nèi)部代碼預(yù)置的刷新率或者是讀取文檔的相關(guān)信息,自我設(shè)置刷新幀率,因為對于游戲界面的更新要求具有超視覺速度,所以FPS最低要求大于12幀每秒,然后是建立事件監(jiān)聽模塊進行人機交互,具體表現(xiàn)為通過讀取系統(tǒng)鍵盤操作數(shù)據(jù),并加與處理以及各個精靈組的生成與死亡,使數(shù)據(jù)被接受后會繼續(xù)傳入下一個模塊。
圖3 精靈組的設(shè)計
碰撞檢測模塊將會對用戶的操作產(chǎn)生一個碰撞評估,根據(jù)評估判斷結(jié)果,精靈組會進行相應(yīng)的圖像處理和更新,形成各個事件,使之以可視化的形式與用戶進行交互,即更新屏幕顯示,并且這個過程是持續(xù)的、高速的,用戶通過對屏幕圖像信息的讀取在大腦中產(chǎn)生事件認(rèn)知。
現(xiàn)今,主流的設(shè)計方式具有兩種,分別是結(jié)構(gòu)化設(shè)計和面向?qū)ο蠡脑O(shè)計。結(jié)構(gòu)化方法著眼于功能,強調(diào)中心模塊化,推出模塊化、自頂向下、逐步求精的高效設(shè)計過程,系統(tǒng)是實現(xiàn)集成化模塊功能的函數(shù)以及過程,體現(xiàn)出結(jié)構(gòu)清晰、可讀性好的特點。面向?qū)ο蠓椒▌t以對象的數(shù)據(jù)為基礎(chǔ)和中心,制定系統(tǒng)框架,因此對于類中的數(shù)據(jù),穩(wěn)定性得到大大提升,對實際物體模型的建立更加全面、深入。在對本實驗方式的選擇上我選擇了更優(yōu)秀的面向?qū)ο蠡姆绞健?/p>
(1)設(shè)計思維:結(jié)構(gòu)化編程比較難于封裝,復(fù)用性上也不如面向?qū)ο缶幊蹋狈U展性,在進行程序設(shè)計的時候只將系統(tǒng)著眼于現(xiàn)有業(yè)務(wù)功能的實現(xiàn),沒有考慮系統(tǒng)將來的業(yè)務(wù)變化情況,除此之外,它靈活性差、違反職能均衡原則。
(2)封裝性:因為其采用結(jié)構(gòu)化程序分析設(shè)計程序時,沒有對軟件系統(tǒng)的設(shè)計和實現(xiàn)進行合理的分工,需要將客觀世界模型分解一個一個功能,每個功能按照順序用以完成一定的數(shù)據(jù)處理,因此結(jié)構(gòu)化編程封裝難度較大。對于私有的方法,較難控制,敏感信息就比較難隱藏。
(3)復(fù)用性:在傳統(tǒng)的結(jié)構(gòu)化程序設(shè)計中,開發(fā)應(yīng)用程序是依據(jù)過程的,數(shù)據(jù)的工程代碼與操作代碼具有獨立性、代碼特異性,難以重用,因此在代碼量過大時,具有維護數(shù)據(jù)和代碼一致性的困難。
(1)設(shè)計思維:從計算機程序工作原理來看,“輸入—運算—輸出”。面向?qū)ο笤诜治鰡栴}時,不同于傳統(tǒng)的面向?qū)ο筮^程,它有著自己獨特的特點:以對象為單位,考慮它的屬性及方法,在分析問題時,面向過程是需要以一個具體的流程(事務(wù)過程)為單位,在開發(fā)中考慮它的實現(xiàn)。
(2)封裝性:面向?qū)ο缶幊痰姆庋b,也就是把客觀事物進行抽象類封裝,使用時可以實列化為多個對象,并且類可以使用protecte、private、public來定義內(nèi)部數(shù)據(jù)的屬性,protected讓可信的類或者對象對數(shù)據(jù)發(fā)出訪問,不可信操作無法訪問,隱藏內(nèi)部信息。
(3)復(fù)用性:面向?qū)ο蠡O(shè)計所擁有的繼承性及封裝性思想形成重用方法,對程序的容錯率有了極大的提升,提高程序運行的效率。
綜上所述,它已經(jīng)廣泛應(yīng)用于實際編程工作中,一方面很好地提高了人們生活、工作以及學(xué)習(xí)的便捷性,另一方面也有效促進了我國社會信息化建設(shè)水平的不斷提升。從整體看,Python最為突出的特點就是簡潔、類庫,將其應(yīng)用到平臺開發(fā)中可以突顯出極大的優(yōu)勢,因此對Python的進一步研究應(yīng)用勢在必行。Python語言的在AI、自動化,程序設(shè)計等各方面領(lǐng)域的優(yōu)勢,亦將在元宇宙得到新應(yīng)用和新擴展,對于基于Python的多元化開發(fā)與設(shè)計,在未來擁有廣闊的前景。