劉碩 王海森 李其偉
摘 ?要: 本文基于Funcode平臺,以“小小饑餓鯊”游戲為例,研究兒童益智類游戲的設(shè)計與開發(fā)方法。代碼采用了C++面向?qū)ο蟪绦蛟O(shè)計方法,結(jié)合平臺提供的事件處理函數(shù)實現(xiàn)游戲的功能,游戲中玩家通過不斷吃掉指定類型的魚來獲得相應(yīng)的生命值,并且在獲得相應(yīng)數(shù)量的生命值后不斷升級。
關(guān)鍵詞: Funcode平臺;游戲開發(fā);軟件設(shè)計;兒童益智
中圖分類號: TP3 ? ?文獻(xiàn)標(biāo)識碼: A ? ?DOI:10.3969/j.issn.1003-6970.2020.08.016
本文著錄格式:劉碩,王海森,李其偉,等. 基于Funcode平臺的兒童益智類游戲設(shè)計與開發(fā)[J]. 軟件,2020,41(08):52-55
【Abstract】: Based on Funcode platform, this paper takes Tiny Hungry Shark as an example to study the design and implement methods of childrens puzzle games. C++ object-oriented programming method is employed and functions of event handling provided by the platform are combined to implement the function of the game. In the game, the player continuously eats the specified type of fish to obtain the corresponding health value, and continuously upgrades after obtaining the corresponding number of health value.
【Key words】: Funcode platform; Game development; Software design; Childrens puzzle
0 ?引言
隨著我國教育改革的不斷深入與發(fā)展,《國家中長期教育改革和發(fā)展規(guī)劃綱要(2010-2020年)》[1]中曾明確指出:要推進(jìn)兒童教育信息化進(jìn)程,促進(jìn)兒童教育領(lǐng)域的教育內(nèi)容、教學(xué)手段和方法現(xiàn)代化。游戲作為兒童的基本活動,由于具有自主性的特點,相較于其他類型的活動更加強調(diào)兒童的自主參與,強調(diào)內(nèi)部動機的引導(dǎo),注重在其內(nèi)部動機的激發(fā)下實現(xiàn)自我成長,是兒童獲得良好發(fā)育的重要方式。本項目開發(fā)的兒童益智類游戲“小小饑餓鯊”,旨在通過對游戲中不同游戲角色種類的判斷以及使用鍵盤進(jìn)行靈活操作等方式訓(xùn)練兒童,提高孩子的判斷能力和反應(yīng)能力,對兒童的早期發(fā)育起到一定促進(jìn)作用。
Funcode[2]是上海銳格軟件有限公司開發(fā)的,支持C、C++、Java、Python等語言的基于游戲和動畫界面的綜合實驗教學(xué)平臺,用于開發(fā)互動式游戲或應(yīng)用系統(tǒng)。Funcode提供了各式素材、API以及相關(guān)頁面布局,簡化了游戲的開發(fā)過程,讓游戲的設(shè)計變得更為簡單及有趣。
1 ?游戲設(shè)計
1.1 ?游戲規(guī)則
游戲玩家所面對的有普通魚以及特殊魚。對于這兩種魚的碰撞規(guī)則是不同的:碰撞到普通魚的話,若該魚的等級比玩家低,那么玩家吃掉普通魚,并獲得一定的生命值;否則,若是該魚的等級高于玩家等級,則普通魚吃掉玩家魚。當(dāng)玩家吃掉足夠的普通魚并達(dá)到相應(yīng)數(shù)量生命值時,即可升級(1-4級)。而對于特殊魚,玩家必然是會被減掉相應(yīng)的生命值。當(dāng)玩家受到的傷害使生命值降低到對應(yīng)等級生命值標(biāo)準(zhǔn)時會被降級。若玩家的生命值變成0或者被普通魚吃掉,玩家失敗,游戲結(jié)束;或者等級4而且生命值達(dá)到5000及以上時,游戲結(jié)束,并判定為玩家獲勝。
1.2 ?游戲界面設(shè)計
色彩常常在兒童的認(rèn)知中起到重要作用。朱敏等[3]在對色彩在兒童APP界面中的作用研究中指出:色彩可以極大地提高對真實世界的還原度,減少兒童的認(rèn)知障礙和學(xué)習(xí)負(fù)擔(dān),并且顏色的使用可以還原事物的固有屬性,使兒童更容易辨識。為此,將游戲界面的整體色調(diào)以及游戲角色本身的顏色設(shè)計為藍(lán)色,而這一色調(diào)與游戲本身的背景“海洋”相呼應(yīng),能夠為玩家?guī)砀玫挠螒驁鼍斑€原,提供更好的沉浸式游戲體驗。
在界面布局設(shè)計中,為了減輕兒童的視覺負(fù)擔(dān),需要將圖標(biāo)盡可能地簡潔突出一些。游戲界面的正中間突出了游戲主角——小小饑餓鯊的游戲形象以及游戲按鍵操作提示,充分符合兒童的心理和認(rèn)知需求,對兒童這一用戶群體非常友好。另外,在界面左上角,設(shè)置有等級和生命值這兩個用戶可見參數(shù)的顯示框,游戲中玩家能夠隨時直觀地看到自己的等級和生命值變化。
1.3 ?游戲難度設(shè)定
方浩等[4]認(rèn)為,如果游戲的難度遠(yuǎn)超過了玩家的真實能力水平,或明顯過于簡單,都可能導(dǎo)致玩家放棄游戲,放棄對APP的繼續(xù)使用。該游戲中,普通魚和特殊魚的屬性設(shè)定是根據(jù)玩家自身等級變化的,即通過判定玩家自身等級來產(chǎn)生具有不同屬性的精靈,因此,游戲的難度會隨著玩家等級的不斷提升逐步遞增,從而保證了游戲的難度與玩家的能力水平相匹配并具有足夠的挑戰(zhàn)性。以下為兩種魚的詳細(xì)屬性設(shè)定:
普通魚的產(chǎn)生:當(dāng)玩家等級為1時,只產(chǎn)生1級和2級的魚,且兩種等級魚產(chǎn)生的概率是不一樣的,1級魚產(chǎn)生的概率為65%,2級魚為35%;當(dāng)玩家等級為2級時,會產(chǎn)生1、2、3共三種等級的魚,等級1概率為30%,等級2為50%,等級3為20%;當(dāng)自身等級不低于4級時,1、2、3、4四種等級的魚的產(chǎn)生概率分別為10%、20%、50%、20%。
特殊魚的產(chǎn)生:玩家為1級的時候,特殊魚傷害值為10;玩家等價為2級的時候,特殊魚傷害值為100;為3級的時候,特殊魚傷害值為 500。同時,該類型魚的刷新時間被設(shè)定為5-10秒/次。
在該游戲中,HP代表生命值,Level代表等級。游戲中的HP和Level變化規(guī)則如表1所示。
1.4 ?游戲的獎勵機制
鄭曉麗等[5]認(rèn)為,要善于利用游戲的機制和元素,?如過關(guān)、成功的聲音、徽章、等級等,讓兒童獲得成就感和快樂感,維持其學(xué)習(xí)動機。因此,筆者設(shè)計了該游戲兩方面的獎勵機制,現(xiàn)作簡要概述:
首先是采用了等級的激勵方法。玩家需要通過不斷吃魚來獲得生命值并在達(dá)到相應(yīng)閾值后升級,從而使玩家能夠不斷地獲得激勵,建立對游戲的主動性,使其更好地專注于游戲本身。其次,采取視覺上的激勵方法。玩家控制的游戲角色本身的模型大小在不同等級時是不同的:在游戲開始玩家等級為1時,其模型大小設(shè)定僅為1/4,并在玩家升級至滿級4級的過程中逐步增大至1。這種視覺上的成就感同樣可以很好的激勵玩家,帶來更好的游戲體驗。
2 ?具體實現(xiàn)
2.1 ?游戲的初始化
Funcode平臺實際是一個小型游戲引擎,對設(shè)計處理流程的細(xì)節(jié)進(jìn)行了封裝,將游戲的運行過程劃分為游戲初始化、游戲運行和游戲結(jié)束三個函數(shù)[2]。在每一關(guān)開始時,該游戲都會進(jìn)行一次初始化,清空上一次游戲的數(shù)據(jù)。GameMainLoop作為主循環(huán)函數(shù),被不停地循環(huán)反復(fù)調(diào)用,引擎每刷新一次屏幕,此函數(shù)即被調(diào)用一次,從而用于游戲的開始、進(jìn)行中以及結(jié)束等狀態(tài)的處理。該函數(shù)中包含了一個判斷游戲狀態(tài)的switch語句,當(dāng)判斷為游戲開始時,即調(diào)用GameInit函數(shù)初始化游戲,清空上一局相關(guān)數(shù)據(jù),并將游戲狀態(tài)設(shè)置為進(jìn)行中,同時創(chuàng)建玩家控制的魚,該魚出生等級為1,生命值為10;不然,若判定為游戲進(jìn)行中,則處置各類游戲邏輯。
2.2 ?存儲結(jié)構(gòu)的實現(xiàn)
因為隨機魚產(chǎn)生的數(shù)量是隨機的,所以需要使用一個如圖2所示的雙鏈表(FishList)來存儲游戲中的魚,從而便于魚的插入和刪除,當(dāng)添加魚時就創(chuàng)建一個新節(jié)點插入到鏈表的最后,遍歷一遍列表找到最后一個節(jié)點,插入到鏈表的末尾。同樣,刪除一個魚的時候是根據(jù)魚的名字進(jìn)行刪除的,遍歷鏈表,找到與刪除魚的名字相同的節(jié)點,從鏈表中移除該節(jié)點,并刪除該魚在地圖中的顯示。在游戲結(jié)束時,則按序刪除鏈表中的每個節(jié)點,釋放內(nèi)存,最后將頭節(jié)點刪除。使用該存儲結(jié)構(gòu)每當(dāng)創(chuàng)建一個魚時,就動態(tài)地申請相應(yīng)的存儲空間,進(jìn)而可以避免不必要的空間浪費。
2.3 ?游戲精靈的產(chǎn)生與控制
精靈是Funcode游戲中的一種術(shù)語,在Funcode平臺,一切游戲資源都稱為精靈,如圖片、動畫、特效、文字、聲音等。所有的精靈都繼承了class CSprite這個在Funcode中已經(jīng)封裝好的基類,在該類中定義了精靈坐標(biāo)、X朝向等屬性。本游戲中的魚也是一種精靈。不論是玩家魚、普通魚還是特殊魚,都繼承了所有魚的基類(class CgameSprite),而這一基類繼承了class CSprite。自定義類的UML圖如圖3所示。當(dāng)魚產(chǎn)生時,創(chuàng)建該魚的對象實例,將該魚添加到存儲鏈表中,給予坐標(biāo)及速度。對于玩家魚,游戲運行初始化時,會產(chǎn)生一個玩家魚的精靈位于屏幕的水平垂直正中心。因為游戲地圖寬高比為2∶1,所以設(shè)定玩家通過鍵盤控制魚移動時,水平速度是垂直速度的兩倍。對于普通魚和特殊魚,其產(chǎn)生的位置是在地圖右側(cè)邊界的外側(cè)產(chǎn)生,然后在邊界右側(cè)看不見的地方開始游出來,因此是在世界的右側(cè)再加一點距離,并且需要將魚的X朝向翻轉(zhuǎn)過來,這樣也可以避免其他魚直接在地圖內(nèi)部創(chuàng)建后直接碰撞到玩家魚。
2.4 ?等級及生命值的實現(xiàn)
所有魚的基類(class CGameSprite)中定義了m_iLevel為魚的等級,m_iHp為生命值。玩家控制的魚(CMyFish)如果m_iLevel大于普通魚(CNormalFish)的m_iLevel,則可以吃掉該普通魚,玩家魚的m_iHp值更新為原來該玩家魚對象中m_iHp值加上該普通魚對象中m_iHp值。玩家魚只要碰到特殊魚(CSpecialFish),必然是被減HP,而不用進(jìn)行等級判斷。減去的HP值,等于該特殊魚對象本身的m_iHp大小。游戲進(jìn)行時,需要通過CGameSprite中定義的SetLevel和SetHp函數(shù)對玩家魚對象中的等級及HP值這兩個數(shù)據(jù)實時更新。
2.5 ?碰撞的處理
(1)精靈與精靈碰撞的處理
在Funcode中提供了精靈與精靈碰撞事件的接口,并傳入發(fā)起碰撞和接受碰撞精靈的名稱,開發(fā)者需寫碰撞事件代碼[6]。在精靈與精靈碰撞事件處理的函數(shù)OnSpriteColSprite中,設(shè)置有兩個參數(shù):字符型參數(shù)“szSrcName”為發(fā)起碰撞的精靈名字,字符型參數(shù)“szTarName”為被碰撞的精靈名字。當(dāng)引擎捕捉到精靈與精靈之間碰撞之后,即調(diào)用OnSpriteColSprite,首先通過Funcode提供的精靈碰撞的接口來比較各個字符串(“wanjiayu”為玩家魚,“putongyu”為普通魚,“teshuyu”為特殊魚),判斷哪兩種魚之間發(fā)生了碰撞,若是玩家魚碰撞到了普通魚或特殊魚,則繼續(xù)找到被碰撞魚的對象實例,然后根據(jù)游戲規(guī)則對玩家HP值和等級的加減進(jìn)行判斷及處理。需要指出的是,碰撞之后,不管是誰吃誰,最終都要將被碰撞魚的對象實例刪除掉。精靈與精靈碰撞的處理流程圖如圖4所示。
(2)精靈與世界邊界碰撞的處理
由于游戲中2種類型的魚都是從右邊游動到左邊,所以需要設(shè)計一個世界邊界。左邊的世界邊界比游戲中的場景要往左些,等魚游出場景,碰到左邊的邊界之后,將其刪除。該處理方式同樣使用了Funcode提供的相關(guān)接口,具體實現(xiàn)方式如下:
在邊界碰撞事件處理的函數(shù)OnSpriteColWorldLimit中,也同樣分別設(shè)置了兩個參數(shù):字符型參數(shù)“szName”為碰撞到邊界的精靈名字,整型參數(shù)“iColSide”為碰撞到的邊界(0為左邊,1為右邊,2上邊,3下邊)。當(dāng)精靈碰撞到邊界時,首先根據(jù)“iColSide”的值來判斷碰撞的是哪一邊界,若其碰撞的邊界為左邊(即“iColSide”的值為0),則繼續(xù)判斷是不是要處理的魚(即名字里包含“putongyu”或“teshuyu”的字符),若是,則將其刪除。精靈與世界邊界碰撞的處理流程圖如圖5所示。
3 ?結(jié)語
在游戲設(shè)計方面,作為一款益智類游戲,其簡潔突出的圖標(biāo)設(shè)計、易上手的按鍵操作、精美的游戲形象、合理的游戲難度設(shè)定以及獎勵機制的設(shè)計等均保證了游戲的趣味性及可玩性,能夠帶來良好的游戲體驗。而在代碼方面,經(jīng)多次修改及測試,運行狀況良好,無明顯bug,并且有著可讀性好、代碼結(jié)構(gòu)清晰等特點。同時,代碼的拓展性良好,可以根據(jù)需求,進(jìn)一步實現(xiàn)如對玩家分?jǐn)?shù)進(jìn)行保存并排名或者通過設(shè)置游戲時間以防沉迷等功能。
參考文獻(xiàn)
[1] 國家中長期教育改革和發(fā)展規(guī)劃綱要(2010-2020年) [EB/OL]. http://old.moe.gov.cn/publicfiles/business/htmlfiles/moe/ info_list/201407/xxgk_171904.html?authkey=gwbux.
[2] 汪紅兵, 姚琳, 張敏, 等. 基于Funcode平臺的軟件課程設(shè)計[J]. 教育教學(xué)論壇, 2016, 31: 253-255.
[3] 朱敏, 羅岱. 色彩在學(xué)齡前兒童App界面設(shè)計中的應(yīng)用探究[J]. 設(shè)計, 2019, 6: 128-129.
[4] 方浩, 張言林, 周婷婷, 等. 學(xué)齡前兒童教育類APP交互設(shè)計研究[J]. 包裝工程, 2016, 37(20): 113-117.
[5] 鄭曉麗, 陳子超. 基于游戲化學(xué)習(xí)的漢語拼音教育軟件設(shè)計[J]. 教育信息技術(shù), 2019, Z2: 109-112.
[6] 陳強, 劉洋. 基于FunCode平臺的“太空星戰(zhàn)”游戲開發(fā)與設(shè)計[J]. 信息與電腦(理論版), 2019, 2: 124-126.