亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于C語言的跨平臺(tái)2D游戲框架設(shè)計(jì)

        2021-08-19 08:25:36蘇雄張宏橋段凌飛曾曉華
        現(xiàn)代計(jì)算機(jī) 2021年21期
        關(guān)鍵詞:彈球精靈實(shí)例

        蘇雄,張宏橋,段凌飛,曾曉華

        (湘南學(xué)院電子信息與電氣工程學(xué)院,郴州423000)

        0 引言

        C語言是較為底層的高級語言,由于其標(biāo)準(zhǔn)簡單規(guī)范,在多個(gè)領(lǐng)域均較為流行[1-2]。出于教學(xué)目的,大部分學(xué)生在學(xué)習(xí)完C語言后,不能進(jìn)一步探究,對基本的數(shù)據(jù)結(jié)構(gòu)與算法感覺枯燥。為解決這個(gè)問題,目前已有部分高校以游戲引擎等與現(xiàn)實(shí)緊密結(jié)合的內(nèi)容為導(dǎo)向,提升學(xué)生的編程語言學(xué)習(xí)興趣[3-5]。以此為出發(fā)點(diǎn),本文使用跨平臺(tái)的C語言庫SDL2實(shí)現(xiàn)了一套2D游戲框架CSimpleEngine來激發(fā)學(xué)生進(jìn)一步的學(xué)習(xí)研究的興趣。該框架使用C語言(C99標(biāo)準(zhǔn))實(shí)現(xiàn),依賴于SDL2開源庫,該庫支持音視頻、網(wǎng)絡(luò)等功能的操作,且支持跨平臺(tái)編譯[6]。對于跨平臺(tái)部分,本文使用C4Droid作為跨平臺(tái)編譯器,使用的版本為C4Droid v6.97漢化版,其本身已經(jīng)集成好GCC以及SDL2庫,方便本文設(shè)計(jì)框架的APK編譯。此外,文中所涉及的CSimpleEngine框架與演示工程代碼已開源提交到https://gitee.com/suiwobian/csimple-engine.git。

        1 框架設(shè)計(jì)

        1.1 框架模塊

        框架目前包含通用功能、事件編輯、輸入控制、聲音管理、精靈管理、文字繪制、物體管理七個(gè)模塊。其中,通用功能模塊主要負(fù)責(zé)常用算法的實(shí)現(xiàn),如平面旋轉(zhuǎn)、碰撞位置檢測等通用功能;事件編輯模塊負(fù)責(zé)用戶層邏輯,包括物體事件聲明、定義注冊,是用戶層設(shè)計(jì)的主要工具,出于代碼復(fù)用目的,用戶使用該模塊的宏進(jìn)行操作;輸入控制模塊負(fù)責(zé)用戶層的輸入檢測,如鼠標(biāo)或屏幕的點(diǎn)擊、鍵盤按鍵狀態(tài)等信息的獲取;聲音管理模塊負(fù)責(zé)音效資源的配置與使用,包含音樂與音效兩種類型。精靈管理模塊負(fù)責(zé)圖片載入以及紋理資源顯示;文字繪制模塊負(fù)責(zé)字體文件的載入并利用精靈管理模塊對字體紋理進(jìn)行顯示。

        其中,物體管理模塊是整個(gè)框架的核心,用戶主要通過操作實(shí)例完成邏輯。此外,物體與實(shí)例的區(qū)別在于:前者指某一類對象的模板抽象,后者指動(dòng)態(tài)實(shí)例化的可以操作的物體。各模塊的關(guān)系如圖1所示。

        圖1 框架功能模塊

        1.2 執(zhí)行流程

        CSimpleEngine框架基于SDL2開源庫,主要分為初始化、執(zhí)行、銷毀這三個(gè)階段。

        初始化階段流程如下圖所示:首先調(diào)用SDL_Init函數(shù)進(jìn)行SDL庫的初始化,包含初始化音頻和視頻功能,使用TTF_Init進(jìn)行字體功能初始化,并根據(jù)配置創(chuàng)建全局窗口繪制表面以及渲染器。接著調(diào)用用戶實(shí)現(xiàn)的資源注冊接口,該接口對資源文件與配置文件中定義的資源枚舉量進(jìn)行關(guān)聯(lián),然后調(diào)用用戶定義的物體初始化接口,該接口主要負(fù)責(zé)物體事件的注冊,以及其它自定義的初始化工作。其中,資源注冊接口函數(shù)As?setInit與物體注冊接口函數(shù)ObjectInit只提供接口聲明,具體實(shí)現(xiàn)必須由用戶定義,否則無法通過編譯。

        圖2 框架初始化流程

        初始化完成后,框架進(jìn)入執(zhí)行流程的事件輪詢狀態(tài),直至用戶關(guān)閉窗口或強(qiáng)制退出。首先處理用戶輸入、退出消息等內(nèi)容。然后按配置幀率來執(zhí)行各個(gè)物體實(shí)例事件,事件類型包含創(chuàng)建事件、更新事件、繪制事件、銷毀事件。創(chuàng)建或銷毀事件由用戶在調(diào)用創(chuàng)建或銷毀物體實(shí)例的相關(guān)的函數(shù)時(shí)觸發(fā)回調(diào);更新與繪制事件默認(rèn)情況下由框架通過輪詢模式執(zhí)行,更新事件主要負(fù)責(zé)執(zhí)行邏輯,繪制事件主要負(fù)責(zé)實(shí)例顯示,所有物體實(shí)例更新完畢后再進(jìn)行所有實(shí)例的繪制,繪制順序可自定義。執(zhí)行階段單幀流程如圖3所示。

        圖3 執(zhí)行階段的單幀流程

        框架銷毀階段主要進(jìn)行各類全局與注冊資源的釋放,如調(diào)用函數(shù)釋放字體、SDL等庫、釋放主窗口繪制表面以及渲染器。

        2 框架實(shí)現(xiàn)

        2.1 框架配置

        框架代碼包含3個(gè)文件:CSimpleConfig.h為框架配置頭文件;CSimpleEngine.h、CSimpleEngine.c為核心實(shí)現(xiàn)。其中上層應(yīng)用依賴于CSimpleEngine,而CSim?pleEngine依賴于CSimpleConfig。CSimpleConfig.h主要定義了框架的執(zhí)行環(huán)境,具體如表1所示。

        表1 CSimpleConfig工程配置

        其中,對于聲音、精靈、字體、物體類型的配置,使用枚舉與全局?jǐn)?shù)組的形式進(jìn)行資源管理。利用枚舉的自增特性,當(dāng)用戶在CSimpleConfig配置文件插入自定義枚舉時(shí),用于存儲(chǔ)數(shù)據(jù)的數(shù)組也在編譯時(shí)自動(dòng)增加。此外,物體的管理數(shù)組分別存放不同類型物體的第一個(gè)實(shí)例,然后通過實(shí)例內(nèi)部的雙向列表結(jié)構(gòu)進(jìn)行查找,實(shí)現(xiàn)物體歸類與多實(shí)例檢索功能。

        2.2 框架核心

        該部分由CSimpleEngine.h、CSimpleEngine.c兩個(gè)文件構(gòu)成,為用戶層提供近100個(gè)API。功能按類別分為:通用功能、事件編輯、聲音管理、輸入控制、精靈管理、字體繪制、物體管理。其中,事件編輯與物體管理是應(yīng)用層邏輯實(shí)現(xiàn)的主要工具,事件編輯模塊主要利用了C語言中拼接宏#、可變宏參數(shù)__VAR_ARGS__等技巧實(shí)現(xiàn)。

        精靈管理模塊處理的精靈數(shù)據(jù)結(jié)構(gòu)包含:繪制表面、紋理、子圖個(gè)數(shù)(支持水平序列幀自動(dòng)生成)、錨點(diǎn)位置、子圖高度、子圖寬度。

        物體管理模塊所管理的物體實(shí)例信息包含:四邊形碰撞遮罩、物體位置、物體繪制深度(值越小離屏幕越近)、關(guān)聯(lián)的精靈類型、精靈的子圖號(hào)、精靈播放速度、精靈繪制角度(順時(shí)針為正)、精靈水平與垂直縮放比例、精靈不透明度(取值范圍0~1,0完全透明,1不透明)、物體類型、是否可見、是否活躍、是否使能、用于管理執(zhí)行順序的上一個(gè)和下一個(gè)物體對象指針、用于管理繪制順序的上一個(gè)和下一個(gè)物體對象指針、自定義物體成員變量指針。若物體未定義繪制事件,則默認(rèn)繪制實(shí)例所綁定的精靈,若定義了繪制事件則需要單獨(dú)調(diào)用精靈繪制函數(shù)去顯示。

        各個(gè)模塊的部分核心功能列舉如表2所示。

        表2 通用模塊部分功能

        表3 事件編輯模塊部分功能

        表4 聲音管理模塊部分功能

        表5 輸入控制模塊部分功能

        表6 精靈管理模塊部分功能

        續(xù)表

        表7 物體管理模塊部分功能

        3 框架應(yīng)用

        3.1 雙人彈球的設(shè)計(jì)

        本節(jié)以雙人彈球設(shè)計(jì)為例,簡要的介紹框架的使用,其中操作部分使用鍵盤與鼠標(biāo)進(jìn)行彈板控制,具體代碼見開源工程。

        首先,打開配置文件CSimpleConfig.h進(jìn)行環(huán)境編輯:修改資源文件路徑RESOURCE_DIR為“./resource/PINGPONG/”,里邊包含了彈球與彈板圖片;開發(fā)時(shí)開啟碰撞調(diào)試模式;修改窗口寬ROOM_WIDTH為640,高ROOM_HEIGHT為360;幀率RUN_FPS改為30;默認(rèn)使用自定義繪制順序。

        然后,在精靈枚舉SPRITE_TYPE的SPR_NULL與SPR_NUM之間插入新的枚舉量:彈球精靈SPR_BALL、彈板精靈SPR_BOARD。在物體枚舉OB?JECT_TYPE的OBJ_NULL與OBJ_NUM之間插入彈球OBJ_BALL、障礙OBJ_WALL、彈板OBJ_BOARD。

        基本資源定義完成后,在主邏輯文件main.c的As?setInit接口中使用SpriteTypeReg函數(shù)注冊上邊定義的精靈資源,將其與資源目錄下相關(guān)的圖像文件進(jìn)行關(guān)聯(lián):

        其中,參數(shù)1為定義的資源枚舉,參數(shù)2為資源文件路徑,參數(shù)3為精靈子圖個(gè)數(shù),這里配置為1個(gè),參數(shù)4為精靈旋轉(zhuǎn)中心,即錨點(diǎn)位置,這里均配置為正中心。

        接著為彈球定義創(chuàng)建與更新事件,事件定義宏內(nèi)有默認(rèn)指向當(dāng)前物體實(shí)例的指針obj以及當(dāng)前物體實(shí)例的參數(shù)指針args,編寫邏輯代碼時(shí)注意不要定義重名變量。此外,如果給物體定義成員變量后必須要定義物體的創(chuàng)建事件才能正常初始化。

        彈球邏輯的實(shí)現(xiàn)過程如下:①使用DEFINE_EVENT_ARGS定義彈球的水平與垂直速度;②使用DEFINE_EVENT_CREATE定義彈球的創(chuàng)建事件,設(shè)置初始位置為中心,并給與隨機(jī)速度;③使用DE?FINE_EVENT_STEP定義彈球的更新事件,每幀根據(jù)當(dāng)前速度修改坐標(biāo),如果碰到墻壁則使垂直速度反向,如果碰到彈板則使水平速度反向,如果超過左右邊界則進(jìn)行新的一輪并重置隨機(jī)位置。

        彈板邏輯的實(shí)現(xiàn)過程如下:①使用DEFINE_EVENT_ARGS定義彈板的控制類型,1為鼠標(biāo),0為鍵盤光標(biāo)上下鍵,并在創(chuàng)建事件中初始化為1;②在更新事件中如果讓類型1的實(shí)例跟蹤鼠標(biāo)垂直位置,讓類型0的實(shí)例響應(yīng)鍵盤上下按鍵。

        然后,在ObjectInit接口中使用REGISTER_EVENT_CREATE、REGISTER_EVENT_STEP注冊以上定義好的事件。

        接著創(chuàng)建各個(gè)物體的實(shí)例:使用ObjectCreate創(chuàng)建彈球并綁定精靈圖;然后分別在屏幕上下方向的邊沿外側(cè)創(chuàng)建障礙墻體,無需關(guān)聯(lián)精靈顯示,只需使用ObjectSetMask與ObjectSetScale配置碰撞盒的大小與比例即可;最后使用ObjectCreate創(chuàng)建左右兩個(gè)彈板,綁定精靈并使用OBJ_ARGS宏設(shè)置左邊的彈板為鍵盤控制,右邊為鼠標(biāo)控制。

        最后在程序入口,如main函數(shù)中,調(diào)用框架入口驅(qū)動(dòng)函數(shù)EngineLoop()即可。

        3.2 應(yīng)用框架的編譯

        框架提供了默認(rèn)的Makefile文件,使用gcc編譯器,Windows下可以使用mingw進(jìn)行編譯。注意,工程編譯時(shí)需要添加SDL2的相關(guān)頭文件與依賴庫,圖4為彈球工程編譯后的執(zhí)行效果。

        圖4 雙人彈球程序

        此外,開源代碼的project目錄中附帶了Flappy?Bird的Demo,涵蓋了音效與文字等大部分的使用。為了方便,本文使用Android平臺(tái)上的C4Droid進(jìn)行APK的編譯,本質(zhì)是利用了Android開發(fā)環(huán)境下的Native?Activity,操作流程如下:

        首先,將4個(gè)主要文件CSimpleConfig.h、CSim?pleEngine.h、CSimpleEngine.c、main.c以及工程相關(guān)的資源目錄resource拷貝到手機(jī)上,使用C4Droid打開main.c。

        然后,長按底側(cè)編譯按鈕調(diào)出編譯選項(xiàng),選擇編譯多個(gè)源代碼文件(簡單),在文件路徑中依次填入文件名,并用空格分開:CSimpleConfig.h CSimpleEngine.h CSimpleEngine.c main.c,點(diǎn)擊確定,在主界面選擇編譯,若沒有錯(cuò)誤,則會(huì)提示編譯成功,接著即可運(yùn)行測試。

        最后,生成安裝包,點(diǎn)擊右上角菜單,選擇導(dǎo)出。導(dǎo)出配置應(yīng)用標(biāo)題(英文)、圖標(biāo)路徑、應(yīng)用資源目錄,點(diǎn)擊導(dǎo)出。導(dǎo)出后安裝即可運(yùn)行,編輯操作如圖5所示。

        圖5 使用C4Droid編譯FlappyBird工程

        4 結(jié)語

        本文首先基于SDL2對CSimpleEngine框架進(jìn)行設(shè)計(jì),擴(kuò)展出通用功能、事件編輯、輸入控制、聲音管理、精靈管理、文字繪制、物體管理等模塊,其中物體管理與事件編輯是整個(gè)框架的應(yīng)用核心。然后介紹了框架的驅(qū)動(dòng)流程,包含初始化、執(zhí)行、銷毀這三個(gè)階段,其中執(zhí)行階段使用了事件輪詢模式。接著分析了框架代碼的3個(gè)核心文件:CSimpleConfig.h、CSimpleEngine.h、CSimpleEngine.c,并闡述了它們負(fù)責(zé)的主要功能。最后,使用雙人彈球與FlappyBird的示例代碼分別演示了框架的基本流程及其支持跨平臺(tái)編譯的特性,驗(yàn)證了框架的易用性和跨平臺(tái)性,CSimpleEngine框架可以進(jìn)一步作為日常C語言教學(xué)的課外擴(kuò)展,提升學(xué)生對學(xué)習(xí)的興趣。

        猜你喜歡
        彈球精靈實(shí)例
        彈球裝罐
        烹飪一顆彈球
        冬精靈
        海底精靈國
        歡舞的精靈們
        為什么彈球不能一直滾下去?
        完形填空Ⅱ
        完形填空Ⅰ
        俏美精靈
        cookie world(2010年3期)2010-03-22 07:26:40
        紅色彈球
        海外英語(2006年6期)2006-07-19 07:25:40
        国产大片在线观看三级| 日韩精品中文字幕一区二区| 少妇久久一区二区三区| 日本久久精品中文字幕| 国模无码一区二区三区不卡| 亚洲国产中文在线二区三区免| 久久久久人妻精品一区5555| 国产亚洲一区二区精品| 精品视频一区二区三区日本 | 国产精品老女人亚洲av无| 国产精品久久婷婷六月| 中文字幕乱码在线人妻| 国产精品伦一区二区三级视频| 国产农村乱子伦精品视频| 中文字幕无码家庭乱欲| 在线成人tv天堂中文字幕| 精品黑人一区二区三区久久hd| 国内精品亚洲成av人片| 亚洲av无码一区二区三区鸳鸯影院| 在线观看免费人成视频| 亚洲精品国精品久久99热一| 欧美日本国产亚洲网站免费一区二区 | 免费夜色污私人影院在线观看| 国内精品久久久久国产盗摄| 一本色道88久久加勒比精品| 亚洲一区二区三区,日本| 婷婷五月深深久久精品| 国产成人久久精品一区二区三区 | 八区精品色欲人妻综合网| 98在线视频噜噜噜国产| 亚洲熟妇大图综合色区| 精品一区二区三区牛牛| 无码人妻精品一区二区三区东京热| 国偷自产一区二区免费视频| 欧美在线播放一区二区| 亚洲av高清在线一区二区三区| 丝袜美腿国产一区二区| 亚洲娇小与黑人巨大交| 久久青草免费视频| 福利片免费 亚洲| 超碰青青草手机在线免费观看 |