999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于C語言的跨平臺2D游戲框架設計

2021-08-19 08:25:36蘇雄張宏橋段凌飛曾曉華
現代計算機 2021年21期
關鍵詞:定義管理

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

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

0 引言

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

1 框架設計

1.1 框架模塊

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

其中,物體管理模塊是整個框架的核心,用戶主要通過操作實例完成邏輯。此外,物體與實例的區別在于:前者指某一類對象的模板抽象,后者指動態實例化的可以操作的物體。各模塊的關系如圖1所示。

圖1 框架功能模塊

1.2 執行流程

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

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

圖2 框架初始化流程

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

圖3 執行階段的單幀流程

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

2 框架實現

2.1 框架配置

框架代碼包含3個文件:CSimpleConfig.h為框架配置頭文件;CSimpleEngine.h、CSimpleEngine.c為核心實現。其中上層應用依賴于CSimpleEngine,而CSim?pleEngine依賴于CSimpleConfig。CSimpleConfig.h主要定義了框架的執行環境,具體如表1所示。

表1 CSimpleConfig工程配置

其中,對于聲音、精靈、字體、物體類型的配置,使用枚舉與全局數組的形式進行資源管理。利用枚舉的自增特性,當用戶在CSimpleConfig配置文件插入自定義枚舉時,用于存儲數據的數組也在編譯時自動增加。此外,物體的管理數組分別存放不同類型物體的第一個實例,然后通過實例內部的雙向列表結構進行查找,實現物體歸類與多實例檢索功能。

2.2 框架核心

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

精靈管理模塊處理的精靈數據結構包含:繪制表面、紋理、子圖個數(支持水平序列幀自動生成)、錨點位置、子圖高度、子圖寬度。

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

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

表2 通用模塊部分功能

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

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

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

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

續表

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

3 框架應用

3.1 雙人彈球的設計

本節以雙人彈球設計為例,簡要的介紹框架的使用,其中操作部分使用鍵盤與鼠標進行彈板控制,具體代碼見開源工程。

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

然后,在精靈枚舉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函數注冊上邊定義的精靈資源,將其與資源目錄下相關的圖像文件進行關聯:

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

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

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

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

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

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

最后在程序入口,如main函數中,調用框架入口驅動函數EngineLoop()即可。

3.2 應用框架的編譯

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

圖4 雙人彈球程序

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

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

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

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

圖5 使用C4Droid編譯FlappyBird工程

4 結語

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

猜你喜歡
定義管理
棗前期管理再好,后期管不好,前功盡棄
今日農業(2022年15期)2022-09-20 06:56:20
永遠不要用“起點”定義自己
海峽姐妹(2020年9期)2021-01-04 01:35:44
定義“風格”
加強土木工程造價的控制與管理
如何加強土木工程造價的控制與管理
成功的定義
山東青年(2016年1期)2016-02-28 14:25:25
“這下管理創新了!等7則
雜文月刊(2016年1期)2016-02-11 10:35:51
人本管理在我國國企中的應用
現代企業(2015年8期)2015-02-28 18:54:47
修辭學的重大定義
當代修辭學(2014年3期)2014-01-21 02:30:44
山的定義
公務員文萃(2013年5期)2013-03-11 16:08:37
主站蜘蛛池模板: 国产精品一区二区久久精品无码| 国产91小视频| 日本欧美在线观看| 国产日韩丝袜一二三区| 97超爽成人免费视频在线播放| 国产在线一区视频| 国产成人精品在线1区| 亚洲男人的天堂在线观看| 久久一色本道亚洲| 欧美色伊人| 亚洲毛片在线看| 99久久亚洲精品影院| 久久久久九九精品影院| 人妻91无码色偷偷色噜噜噜| 国产白丝av| 国产91熟女高潮一区二区| 午夜福利免费视频| 免费网站成人亚洲| a免费毛片在线播放| 午夜欧美在线| 亚洲AⅤ永久无码精品毛片| 国产亚洲精久久久久久久91| 狼友av永久网站免费观看| 国产精品专区第1页| 国产69精品久久久久妇女| 欧美日韩国产综合视频在线观看| 色婷婷在线影院| 国产va在线观看免费| 亚洲人成成无码网WWW| 996免费视频国产在线播放| 成人精品在线观看| 日韩欧美中文亚洲高清在线| 欧美福利在线观看| 国产美女精品在线| 国产成人毛片| 一区二区三区国产精品视频| 日韩小视频在线播放| 欧美a级在线| 九色综合视频网| 国产小视频在线高清播放| www.91在线播放| 亚洲—日韩aV在线| www.亚洲一区| 国产在线拍偷自揄拍精品| 无码一区二区三区视频在线播放| 国产在线观看99| 国产粉嫩粉嫩的18在线播放91| 高清免费毛片| 国产真实乱子伦精品视手机观看| 亚洲最大情网站在线观看| 国产白丝av| 国产无码制服丝袜| 国产精品免费露脸视频| 国产欧美日韩视频一区二区三区| 国产成人成人一区二区| 久久精品这里只有精99品| 99re免费视频| 精品欧美一区二区三区久久久| 国产欧美日韩资源在线观看| 黄色一级视频欧美| 91福利在线看| 四虎成人精品| 99久久无色码中文字幕| av在线手机播放| 综合天天色| 99热这里只有精品免费| A级全黄试看30分钟小视频| 国产精品亚洲综合久久小说| 国产97公开成人免费视频| 久久精品国产999大香线焦| 被公侵犯人妻少妇一区二区三区| 国产一区二区三区在线观看免费| 国产成人免费| 2020最新国产精品视频| 波多野结衣在线一区二区| 国产一级精品毛片基地| 久久精品娱乐亚洲领先| 国产欧美又粗又猛又爽老| 国产精品免费久久久久影院无码| 日韩第九页| 国产乱人乱偷精品视频a人人澡| 亚洲综合在线网|