已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
C語言課程設(shè)計-黃金礦工一、實驗內(nèi)容玩家通過鍵盤的按鍵控制礦工抓取金塊,將鉤子碰觸到的金塊抓取過來。要求如下:1. 游戲的初始界面如下圖(一),單機鍵盤上的空格鍵進入游戲,進入后界面如圖(二),金塊的總數(shù)是20,大小位置是隨機的。2. 在沒有抓取狀態(tài)下,鉤子左右擺動,此時礦工的是靜止的。當(dāng)鉤子擺動到一定角度,玩家可以單擊鍵盤上的上下左右鍵中的下方向鍵控制礦工伸出長鉤,抓取金子,此時礦工是向下?lián)u動轉(zhuǎn)軸。獲取到金子往回拉后,礦工是不斷轉(zhuǎn)動轉(zhuǎn)軸,知道金子拉動到鉤子初始處,礦工恢復(fù)靜止,鉤子繼續(xù)左右搖擺,直到玩家再次單擊向下方向鍵。3. 伸出的鉤子如果碰觸到金子,則鉤子和金子一起往回拉,回收的速度根據(jù)抓取到的金子的大小變化而變化,金子越大,回拉的速度越慢,反之亦然。如果鉤子沒有碰觸到金子,而是碰觸到左右和下的邊界,則鉤子保持原來的速度往回收。4. 抓取到的金子拉回到轉(zhuǎn)軸處消失,此時金子數(shù)目減少一個。如果玩家將所有金子抓取完,游戲返回到如圖(一)的初始界面。圖(一)圖(二)二、實驗指南實驗一 開始實驗【實驗任務(wù)】步驟一、打開FunCode,創(chuàng)建一個的C語言項目;步驟二、導(dǎo)入Goldman模板。【實驗思路】按實驗指導(dǎo)完成?!緦嶒炛笇?dǎo)】1、 打開FunCode,點擊“項目”菜單,選擇“創(chuàng)建C語言工程”注意:工程名名稱要求字母開頭,只能包含字母和數(shù)字,且名字中間不能有空格。2、 點擊菜單“項目”中的“導(dǎo)入地圖模塊”,如圖一。跳出一個對話框,選中“Goldman”模板,點擊“導(dǎo)入到工程”按鈕,如圖二。 圖 一 圖 二3、 導(dǎo)入成功后的,界面如下圖所示:實驗二 單擊空格鍵,開始游戲【實驗內(nèi)容】步驟、啟動游戲顯示“空格開始”,單擊空格鍵進入游戲初始界面?!緦嶒炈悸贰肯到y(tǒng)會自動響應(yīng)dOnKeyDown函數(shù)來響應(yīng)鍵盤按下消息,這部分代碼實現(xiàn)在main.cpp里。我們要做的就是通過在main.cpp的dOnKeyDown函數(shù)里實現(xiàn)我們的代碼。當(dāng)用戶單擊鍵盤上的空格鍵之后,設(shè)置GameBegin即“空格開始”精靈不可見?!緦嶒炛笇?dǎo)】1、 首先游戲會有不同的游戲狀態(tài),我們設(shè)置全局變量g_iGameState,分別用游戲狀0 表示游戲結(jié)束等待開始狀態(tài);游戲狀態(tài)1表示按下空格鍵開始,初始化游戲;游戲狀態(tài)2表示游戲進行中;2、 有了以上游戲狀態(tài)的定義,我們就可以將游戲的主流程寫出來;由于游戲是一直進行的,所以一下要寫在while循環(huán)當(dāng)中:switch( g_iGameState )/ 初始化游戲,清空上一局相關(guān)數(shù)據(jù)case 1:GameInit();g_iGameState=2; / 初始化之后,將游戲狀態(tài)設(shè)置為進行中break;/ 游戲進行中,處理各種游戲邏輯case 2:/ 金子數(shù)量大于0的時候,繼續(xù)游戲if( g_iGoldCount 0 )GameRun( fTimeDelta );else/ 游戲結(jié)束。調(diào)用游戲結(jié)數(shù)函數(shù)并把游戲狀態(tài)修改為結(jié)束狀態(tài)g_iGameState=0;GameEnd(); break;/ 游戲結(jié)束/等待按空格鍵開始case 0:default:break;這是游戲的總體框架,那么我們就來完成這個游戲;3、 我們已經(jīng)知道,系統(tǒng)會自動檢測鍵盤的按下消息,即main.cpp里面的dOnKeyDown函數(shù)。系統(tǒng)會捕獲按下什么鍵,是否同時按下Alt鍵或Shift鍵或Ctrl鍵,通過dOnKeyDown的參數(shù)傳遞進來,供編程者使用。4、 鍵盤的鍵值我們通過枚舉類型給出,其中空格對應(yīng)的鍵值為KEY_SPACE,所以當(dāng)ikey參數(shù)的值為KEY_SPACE且游戲的狀態(tài)為0,即g_iGameState的值為0,說明用戶單擊了空格鍵,之后將g_iGameState的值改為1,說明游戲開始,并且把“游戲開始”精靈隱藏掉。5、 如果是空格鍵按下,則說明現(xiàn)在游戲開始,說明游戲狀態(tài)進入1,我們在GameInit中調(diào)用dSetSpriteVisible函數(shù)將“空格開始”隱藏;這里我們就不在添加代碼。至此,實驗二完成,單機空格鍵,“空格開始”消失,游戲進入初始化狀態(tài)。實驗三 鉤子左右搖擺【實驗內(nèi)容】步驟、鉤子在等待抓取狀態(tài)下左右搖擺【實驗思路】鉤子的擺動實際是動畫精靈以某個點為中心位置,在某個角度范圍來回旋轉(zhuǎn)。在FunCode中,游戲不斷刷新屏幕,每次時間為幾微秒,每次刷新相應(yīng)改變精靈的角度,就能達(dá)到旋轉(zhuǎn)的效果。游戲每刷新一次屏幕,while循環(huán)執(zhí)行一次,并且通過參數(shù)fTimeDelta把刷新屏幕的時間傳遞進去。因此,在該函數(shù)中,通過精靈的旋轉(zhuǎn)速度、旋轉(zhuǎn)時間就可以獲得每個時刻,精靈的旋轉(zhuǎn)角度。最后,利用FunCode提供的API接口dSetSpriteRotation函數(shù),設(shè)置精靈每個時刻對應(yīng)的角度,從而獲得精靈旋轉(zhuǎn)的動畫效果。具體到鉤子左右擺動,要考慮的因素有四個:擺動方向(從左往右、從右往左)、擺動速度、擺動時間、擺動的角度范圍。定義兩個變量g_iHookRotToLeft表示鉤子當(dāng)前是往左擺動還是往右擺動( 1 右-左, 0 左-右 ),g_fHookRotation表示鉤子當(dāng)前轉(zhuǎn)動的朝向。判斷當(dāng) g_iHookRotToLeft 不為0的時候(鉤子往左擺),將g_fHookRotation加上上面計算的本次旋轉(zhuǎn)的度數(shù)。如果g_fHookRotation大于180度,則將其改為180度,并且將g_iHookRotToLeft設(shè)置為0(往右擺)。往左到頭后,開始往右擺。往右擺與往左擺相反,但是算法是一致的定義變量g_iHookRotToLeft表示鉤子當(dāng)前是往左擺動還是往右擺動( 1 右-左, 0 左-右 )。定義變量g_fHookRotation表示鉤子當(dāng)前角度。當(dāng)前角度=擺動速度擺動時間。規(guī)定鉤子擺動弧度,從左往右或從右往左正好都是擺動到水平位置,因此鉤子擺動角度的范圍正好是0, 180。從右往左擺時,擺動大于180度時,設(shè)置當(dāng)前角度為180度,鉤子變?yōu)閺淖笸覕[。從左往右擺時,擺動小于0度時,設(shè)置當(dāng)前就得為0度,鉤子變?yōu)閺挠蚁蜃髷[?!緦嶒炛笇?dǎo)】1、 根據(jù)實驗思路,為了實現(xiàn)鉤子左右搖擺,我們需要定義獲得金子的狀態(tài)、鉤子的角度、是否再往左方向擺動、以及鉤子的坐標(biāo)點等全局變量,并且在初始化函數(shù)GameInit中進行初始化2、 在Main.cpp文件中,定義GameRun函數(shù),要實現(xiàn)鉤子左右搖擺,則判斷當(dāng)g_iHookRotToLeft 不為0的時候(鉤子往左擺),將g_fHookRotation加上上面計算的本次旋轉(zhuǎn)的度數(shù)。如果g_fHookRotation大于180度,則將其改為180度,并且將g_iHookRotToLeft設(shè)置為0(往右擺)。往左到頭后,開始往右擺。往右擺與往左擺相反,但是算法是一致的。思路如下:1) 如果當(dāng)前為等待抓取狀態(tài),那么鉤子以一定的角速度左右搖擺,如果鉤子左擺的角度大于了180度,就給角度變量賦值為180度,并改變是否往左搖擺的變量為否,這樣鉤子就可以往右搖擺了;2) 如果往右搖擺的角度小于了0度,那么就給角度變量賦值為0度,并且改變是否往左搖擺的變量,這樣鉤子就可以不停的左右搖擺。到此實驗三完成,游戲最開始鉤子左右搖擺動作的實現(xiàn)了。實驗四 顯示金子【實驗內(nèi)容】步驟一、初始化金子實例步驟二、隨機顯示金子步驟三、保存初始化的每一個金子【實驗思路】以我們在實驗一中添加的一個金子精靈作為模板,定義好金子精靈數(shù)量,調(diào)用dCloneSprite函數(shù),使用一個for循環(huán)來復(fù)制金子。這里可以在for循環(huán)里面嵌入if判斷來實現(xiàn)復(fù)制不同大小的金子精靈,最后在地圖上隨機顯示金子精靈?!緦嶒炛笇?dǎo)】1、 在Main.cpp中添加要賦值金子的個數(shù)和金子分布的世界邊界的坐標(biāo)等全局變量;并在GameInit函數(shù)中添加代碼,初始化全局變量。2、 接著在使用if語句,以限定金子最終在地圖上的顯示范圍不能超過世界邊界,數(shù)字部分只是一個參考值,自己也可以定義在一個合理的范圍內(nèi)。/ 以下變量只需要初始化一次static intiInitedHookPos=0;if( 0 = iInitedHookPos )iInitedHookPos=1;/ 鉤子初始位置值初始化g_fHookStartPosX=dGetSpritePositionX( GoldHook );g_fHookStartPosY=dGetSpritePositionY( GoldHook );/ 金子可以出現(xiàn)的邊界范圍初始化g_iGoldBornMinX=dGetWorldLeft() + 5;g_iGoldBornMaxX=dGetWorldRight() - 5;g_iGoldBornMinY=dGetWorldTop() + 20;g_iGoldBornMaxY=dGetWorldBottom() - 5;3、 在if后面,我們需要用一個for循環(huán)來創(chuàng)建所有的金子。我們規(guī)定金子的大小為三種,用iSize來記錄,分別是iSize=4,iSize=6,iSize=8。數(shù)量的比例是10個,6個,4個(這個是在金子總數(shù)為20的前提下,如果總數(shù)不是20,根據(jù)比例創(chuàng)建)。我們可以再for循環(huán)里面通過if判斷循環(huán)變量iLoop的大小范圍為創(chuàng)建不同大小的金子。設(shè)置金子大小的函數(shù)分別為SetSpriteWidth(設(shè)置寬度)dSetSpriteHeight(設(shè)置高度),最后使用FunCode提供的隨機函數(shù)隨機生成每個金子的(x,y)坐標(biāo)放入地圖:其中(float)iSize是類型轉(zhuǎn)換,因為iSize是int型,而SetSpriteWidth函數(shù)的參數(shù)是float型,如果直接傳進去可能會丟失數(shù)據(jù),所以需要先將int型轉(zhuǎn)換為float型。4、 最后添加下面代碼,恢復(fù)挖金者的動作。/ 播放挖金者的動作(恢復(fù)初始守候動作)dAnimateSpritePlayAnimation( GoldMan, GolderManAnimation2, 0 );至此,實驗四顯示金子的部分就完成了。實驗五 抓取金子【實驗內(nèi)容】步驟一、從纜繩器那里畫根線到鉤子上步驟二、檢測鉤子和金子的碰撞步驟三、實現(xiàn)金子綁定在鉤子上并往回拖步驟四、回拖之后使金子消失,金子數(shù)目減一【實驗思路】從纜繩器畫線到鉤子上:在地圖上創(chuàng)建精靈的鏈接點,然后獲取他們的坐標(biāo)位置,調(diào)用FunCode的dDrawLine函數(shù)即可。鉤子與金子的碰撞:系統(tǒng)檢測到兩者的碰撞之后會調(diào)用dOnSpriteColSprite函數(shù),所以我們只要在此函數(shù)中實現(xiàn)碰撞之后鉤子抓取金子的代碼就可以了。這里需要注意的是鉤子抓取金子之后的速度處理,抓的金子越大,鉤子回收的速度就會越慢。【實驗指導(dǎo)】1、 打開funcode,單擊地圖上的礦工精靈圖像,在顯示框的上面五個選擇左數(shù)第二個“編輯次精靈的鏈接點”,按如圖所示依次單擊這位置顯示0,保存即可。2、 同上,點擊地圖上的鉤子精靈,選擇“編輯此精靈的鏈接點”,依次單擊這三個位置顯示0,1,2,最后保存即可。3、 首先在Main.cpp中添加全局的字符數(shù)組變量,用它來存放抓到的金子的名字,并定義空鉤子在抓取金子的時候移向鉤子的速度變量,定義完成之后在GameInit中初始化;4、 精靈的碰撞方式為:當(dāng)A移動中碰上B時,如果A是可以產(chǎn)生碰撞的,B是可以接受碰撞的,則這2個物體會產(chǎn)生碰撞,精靈碰撞的API將被調(diào)用。否則無碰撞發(fā)生通過調(diào)用庫函數(shù)dSetSpriteCollisionSend設(shè)置鉤子可以發(fā)送碰撞,通過dSetSpriteCollisionReceive函數(shù)設(shè)置金子可以接收碰撞,這樣,當(dāng)在地圖上鉤子和金子相碰時,系統(tǒng)就能檢測到。5、 首先實現(xiàn)從纜繩器畫線到鉤子。首先在Main.cpp進行聲明:voidDrawHookLine();然后,添加函數(shù)的定義。畫線的原理是先獲取纜繩器的坐標(biāo)和鉤子的坐標(biāo),然后調(diào)用DrawLine函數(shù)即可。函數(shù)定義如下voidDrawHookLine()/ 首先,從礦工精靈上獲取一個纜繩鏈接點作為繩子的起始點(該鏈接點在編/ 輯器里編輯好)floatfStartX=dGetSpriteLinkPointPosX( GoldMan, 1 );floatfStartY=dGetSpriteLinkPointPosY( GoldMan, 1 );/ 繩子終點在鉤子精靈上獲取(該鏈接點在編輯器里編輯好)floatfEndX=dGetSpriteLinkPointPosX( GoldHook, 1 );floatfEndY=dGetSpriteLinkPointPosY( GoldHook, 1 );/ 在這兩點之間劃線.線的顏色紅綠藍(lán)值都為50,即灰色dDrawLine( fStartX, fStartY, fEndX, fEndY, 2.f, 0, 50, 50, 50, 255 );dDrawLine函數(shù)參數(shù)參見文檔前面部分的介紹或者是CommonAPI.h中關(guān)于dDrawLine的介紹。6、 main.cpp文件里面的主函數(shù)中的while循環(huán)每次調(diào)用GameMainLoop函數(shù)時能保證調(diào)用到DrawHookLine函數(shù),保證了鉤子與纜繩器之間的線是一直連著的。 在while循環(huán)的最后面添加如下代碼:/ 畫鉤子的纜繩線。不管游戲是什么狀態(tài),這根纜繩線都要畫出來DrawHookLine();7、 接下來要實現(xiàn)單擊鍵盤上的下方向鍵伸出鉤子。如實驗二所說,系統(tǒng)檢測到鍵盤按下,會響應(yīng)main.cpp里面的dOnKeyDown函數(shù),向下方向鍵的宏定義是KEY_DOWN,因此我們只要判斷dOnKeyDown獲取的鍵值ikey等于它,并且游戲是正在進行的(g_iGameState等于2),鉤子沒有抓到金子(g_iGetGoldState等于0)即可。之后利用系統(tǒng)提供的函數(shù)給鉤子一個向前的速度,在播放挖金者手臂往下壓的動作即可。在main.cpp里面dOnKeyDown函數(shù)if后面添加如下代碼:/ 當(dāng)前處于游戲進行中,按下向下的方向鍵,鉤子伸出抓取金子else if( KEY_DOWN = iKey & 2 = g_iGameState & 0 = g_iGetGoldState )/ 設(shè)置抓取狀態(tài)為:鉤子往外伸g_iGetGoldState=1;/ 以當(dāng)前朝向給鉤子一個向前的速度dSetSpriteLinearVelocityPolar(GoldHook,g_fEmptyHookSpeed, g_fHookRotation );/ 播放挖金者的動作(一個胳膊往下壓的動作)dAnimateSpritePlayAnimation( GoldMan, GolderManAnimation1, 0 );8、 實現(xiàn)鉤子抓金子的精靈與精靈碰撞事件。/ 首先判斷鉤子是否伸出,已經(jīng)游戲是否真在進行,否則推出函數(shù):if( 2 != g_iGameState | 1 != g_iGetGoldState )return;/判斷是否是鉤子與金子進行碰撞(即這兩個名字字符串里必須一個是金子名,一/個是鉤子名)if( stricmp(GoldHook,szSrcName)!=0&stricmp(GoldHook,szTarName)!=0)return;/ 找到哪個是金子的名字const char*szGoldName=NULL;if( strstr( szSrcName, GoldBlock ) )szGoldName = szSrcName;else if( strstr( szTarName, GoldBlock ) )szGoldName = szTarName;else return;9、 得到金子實例之后,使用FunCode給的綁定函數(shù)SpriteMountToSpriteLinkPoint()將金子綁定在鉤子上隨鉤子移動:/ 將金子掛接到鉤子的2號掛接點上dSpriteMountToSpriteLinkPoint( szGoldName, GoldHook, 2 );/ 設(shè)置抓取狀態(tài)為:鉤子往回收,抓取到東西。記錄金子名字g_iGetGoldState=3;strcpy( g_szCurGetGold, szGoldName );/ 根據(jù)金子大小,計算鉤子的往回收的速度,越大的越慢。/ 算法:之前設(shè)置的金子大小為4,6,8,用10減去該大小再除以10,得到3個小/ 數(shù):0.6,0.4,0.2.該小數(shù)乘以空鉤子的速度即得到掛接不同金子后的實際速度floatfWidth=dGetSpriteWidth( szGoldName );floatfSpeed=(10.f - fWidth) / 10.f) * g_fEmptyHookSpeed;/ 鉤子往初始位置移動dSpriteMoveTo( GoldHook, g_fHookStartPosX, g_fHookStartPosY, fSpeed, 1);/ 播放挖金者的動作(胳膊來回動的動作)dAnimateSpritePlayAnimation( GoldMan, GolderManAnimation3, 0 );10、 金子抓取之后回收到纜繩器之后,系統(tǒng)判斷鉤子的是否往回運動,是的話判斷鉤子是否回到終點,若是則調(diào)用dSpriteDismount函數(shù)取消金子與鉤子的綁定,同時調(diào)用dDeleteSprite函數(shù)刪除該金子精靈,再將金子精靈的總數(shù)減一。在GameRun函數(shù)后面添加如下代碼:/ 如果當(dāng)前為鉤子往回歸位,則判斷是否已經(jīng)運動到終點。到了終點,則又開始搖/ 擺、等待else if( 2 = g_iGetGoldState | 3 = g_iGetGoldState )/ 判斷是否移動到終點(判斷的依據(jù)是XY方向的移動速度為0,即金子是否/ 已經(jīng)停止移動)floatfSpeedX=dGetSpriteLinearVelocityX( GoldHook );floatfSpeedY=dGetSpriteLinearVelocityY( GoldHook );/ 當(dāng)前速度不為0,還在運動中/ 浮點數(shù)是否為0,不能直接判斷 = != 0if( fSpeedX 0.00001f | fS
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024美甲店客戶投訴處理與售后服務(wù)承包合同3篇
- 2025年人教版七年級物理下冊階段測試試卷含答案
- 2025年浙教版八年級物理下冊階段測試試卷含答案
- 2024版新房預(yù)售購房合同條款版B版
- 2025年冀教版選擇性必修2生物下冊階段測試試卷
- 2025年人教B版必修2化學(xué)下冊階段測試試卷
- 2025年浙教版三年級語文上冊階段測試試卷
- 2025年冀少新版選修4化學(xué)下冊月考試卷含答案
- 二零二五年度跨區(qū)域搬運服務(wù)合作協(xié)議2篇
- 2025年冀教版七年級科學(xué)下冊階段測試試卷含答案
- 香精香料市場需求與消費特點分析
- 2024年6月青少年機器人技術(shù)等級考試?yán)碚摼C合-三級試題(真題及答案)
- 市政道路及綜合管網(wǎng)工程施工組織設(shè)計
- 09J801民用建筑工程建筑施工圖設(shè)計深度圖樣
- JGJ/T235-2011建筑外墻防水工程技術(shù)規(guī)程
- Unit 4 同步練習(xí)人教版2024七年級英語上冊
- 殘疾軍人新退休政策
- T-HNKCSJ 002-2023 河南省地源熱泵系統(tǒng)工程技術(shù)規(guī)范
- 人教版數(shù)學(xué)三年級下冊《簡單的小數(shù)加、減法》說課稿(附反思、板書)課件
- 漁業(yè)資源基本術(shù)語-編制說明
- 酒店住宿水單模板-皇冠假日
評論
0/150
提交評論