07 C語言課程設計_黃金礦工(提高篇).doc_第1頁
07 C語言課程設計_黃金礦工(提高篇).doc_第2頁
07 C語言課程設計_黃金礦工(提高篇).doc_第3頁
07 C語言課程設計_黃金礦工(提高篇).doc_第4頁
07 C語言課程設計_黃金礦工(提高篇).doc_第5頁
已閱讀5頁,還剩5頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

C語言課程設計-黃金礦工一、實驗內容玩家通過鍵盤的按鍵控制礦工抓取金塊,將鉤子碰觸到的金塊抓取過來。要求如下:1. 游戲的初始界面如下圖(一),單機鍵盤上的空格鍵進入游戲,進入后界面如圖(二),金塊的總數是20,大小位置是隨機的。2. 在沒有抓取狀態下,鉤子左右擺動,此時礦工的是靜止的。當鉤子擺動到一定角度,玩家可以單擊鍵盤上的上下左右鍵中的下方向鍵控制礦工伸出長鉤,抓取金子,此時礦工是向下搖動轉軸。獲取到金子往回拉后,礦工是不斷轉動轉軸,知道金子拉動到鉤子初始處,礦工恢復靜止,鉤子繼續左右搖擺,直到玩家再次單擊向下方向鍵。3. 伸出的鉤子如果碰觸到金子,則鉤子和金子一起往回拉,回收的速度根據抓取到的金子的大小變化而變化,金子越大,回拉的速度越慢,反之亦然。如果鉤子沒有碰觸到金子,而是碰觸到左右和下的邊界,則鉤子保持原來的速度往回收。4. 抓取到的金子拉回到轉軸處消失,此時金子數目減少一個。如果玩家將所有金子抓取完,游戲返回到如圖(一)的初始界面。圖(一)圖(二)二、實驗指南實驗一 開始實驗【實驗任務】步驟一、打開FunCode,創建一個的C語言項目;步驟二、導入Goldman模板。【實驗思路】按實驗指導完成?!緦嶒炛笇А?、 打開FunCode,點擊“項目”菜單,選擇“創建C語言工程”注意:工程名名稱要求字母開頭,只能包含字母和數字,且名字中間不能有空格。2、 點擊菜單“項目”中的“導入地圖模塊”,如圖一。跳出一個對話框,選中“Goldman”模板,點擊“導入到工程”按鈕,如圖二。 圖 一 圖 二3、 導入成功后的,界面如下圖所示:實驗二 單擊空格鍵,開始游戲【實驗內容】步驟、啟動游戲顯示“空格開始”,單擊空格鍵進入游戲初始界面。【實驗思路】系統會自動響應dOnKeyDown函數來響應鍵盤按下消息,這部分代碼實現在main.cpp里。我們要做的就是通過在main.cpp的dOnKeyDown函數里實現我們的代碼。當用戶單擊鍵盤上的空格鍵之后,設置GameBegin即“空格開始”精靈不可見?!緦嶒炛笇А?、 首先游戲會有不同的游戲狀態,我們設置全局變量g_iGameState,分別用游戲狀0 表示游戲結束等待開始狀態;游戲狀態1表示按下空格鍵開始,初始化游戲;游戲狀態2表示游戲進行中;2、 有了以上游戲狀態的定義,我們就可以將游戲的主流程寫出來;由于游戲是一直進行的,所以一下要寫在while循環當中:switch( g_iGameState )/ 初始化游戲,清空上一局相關數據case 1:GameInit();g_iGameState=2; / 初始化之后,將游戲狀態設置為進行中break;/ 游戲進行中,處理各種游戲邏輯case 2:/ 金子數量大于0的時候,繼續游戲if( g_iGoldCount 0 )GameRun( fTimeDelta );else/ 游戲結束。調用游戲結數函數并把游戲狀態修改為結束狀態g_iGameState=0;GameEnd(); break;/ 游戲結束/等待按空格鍵開始case 0:default:break;這是游戲的總體框架,那么我們就來完成這個游戲;3、 我們已經知道,系統會自動檢測鍵盤的按下消息,即main.cpp里面的dOnKeyDown函數。系統會捕獲按下什么鍵,是否同時按下Alt鍵或Shift鍵或Ctrl鍵,通過dOnKeyDown的參數傳遞進來,供編程者使用。4、 鍵盤的鍵值我們通過枚舉類型給出,其中空格對應的鍵值為KEY_SPACE,所以當ikey參數的值為KEY_SPACE且游戲的狀態為0,即g_iGameState的值為0,說明用戶單擊了空格鍵,之后將g_iGameState的值改為1,說明游戲開始,并且把“游戲開始”精靈隱藏掉。5、 如果是空格鍵按下,則說明現在游戲開始,說明游戲狀態進入1,我們在GameInit中調用dSetSpriteVisible函數將“空格開始”隱藏;這里我們就不在添加代碼。至此,實驗二完成,單機空格鍵,“空格開始”消失,游戲進入初始化狀態。實驗三 鉤子左右搖擺【實驗內容】步驟、鉤子在等待抓取狀態下左右搖擺【實驗思路】鉤子的擺動實際是動畫精靈以某個點為中心位置,在某個角度范圍來回旋轉。在FunCode中,游戲不斷刷新屏幕,每次時間為幾微秒,每次刷新相應改變精靈的角度,就能達到旋轉的效果。游戲每刷新一次屏幕,while循環執行一次,并且通過參數fTimeDelta把刷新屏幕的時間傳遞進去。因此,在該函數中,通過精靈的旋轉速度、旋轉時間就可以獲得每個時刻,精靈的旋轉角度。最后,利用FunCode提供的API接口dSetSpriteRotation函數,設置精靈每個時刻對應的角度,從而獲得精靈旋轉的動畫效果。具體到鉤子左右擺動,要考慮的因素有四個:擺動方向(從左往右、從右往左)、擺動速度、擺動時間、擺動的角度范圍。定義兩個變量g_iHookRotToLeft表示鉤子當前是往左擺動還是往右擺動( 1 右-左, 0 左-右 ),g_fHookRotation表示鉤子當前轉動的朝向。判斷當 g_iHookRotToLeft 不為0的時候(鉤子往左擺),將g_fHookRotation加上上面計算的本次旋轉的度數。如果g_fHookRotation大于180度,則將其改為180度,并且將g_iHookRotToLeft設置為0(往右擺)。往左到頭后,開始往右擺。往右擺與往左擺相反,但是算法是一致的定義變量g_iHookRotToLeft表示鉤子當前是往左擺動還是往右擺動( 1 右-左, 0 左-右 )。定義變量g_fHookRotation表示鉤子當前角度。當前角度=擺動速度擺動時間。規定鉤子擺動弧度,從左往右或從右往左正好都是擺動到水平位置,因此鉤子擺動角度的范圍正好是0, 180。從右往左擺時,擺動大于180度時,設置當前角度為180度,鉤子變為從左往右擺。從左往右擺時,擺動小于0度時,設置當前就得為0度,鉤子變為從右向左擺。【實驗指導】1、 根據實驗思路,為了實現鉤子左右搖擺,我們需要定義獲得金子的狀態、鉤子的角度、是否再往左方向擺動、以及鉤子的坐標點等全局變量,并且在初始化函數GameInit中進行初始化2、 在Main.cpp文件中,定義GameRun函數,要實現鉤子左右搖擺,則判斷當g_iHookRotToLeft 不為0的時候(鉤子往左擺),將g_fHookRotation加上上面計算的本次旋轉的度數。如果g_fHookRotation大于180度,則將其改為180度,并且將g_iHookRotToLeft設置為0(往右擺)。往左到頭后,開始往右擺。往右擺與往左擺相反,但是算法是一致的。思路如下:1) 如果當前為等待抓取狀態,那么鉤子以一定的角速度左右搖擺,如果鉤子左擺的角度大于了180度,就給角度變量賦值為180度,并改變是否往左搖擺的變量為否,這樣鉤子就可以往右搖擺了;2) 如果往右搖擺的角度小于了0度,那么就給角度變量賦值為0度,并且改變是否往左搖擺的變量,這樣鉤子就可以不停的左右搖擺。到此實驗三完成,游戲最開始鉤子左右搖擺動作的實現了。實驗四 顯示金子【實驗內容】步驟一、初始化金子實例步驟二、隨機顯示金子步驟三、保存初始化的每一個金子【實驗思路】以我們在實驗一中添加的一個金子精靈作為模板,定義好金子精靈數量,調用dCloneSprite函數,使用一個for循環來復制金子。這里可以在for循環里面嵌入if判斷來實現復制不同大小的金子精靈,最后在地圖上隨機顯示金子精靈?!緦嶒炛笇А?、 在Main.cpp中添加要賦值金子的個數和金子分布的世界邊界的坐標等全局變量;并在GameInit函數中添加代碼,初始化全局變量。2、 接著在使用if語句,以限定金子最終在地圖上的顯示范圍不能超過世界邊界,數字部分只是一個參考值,自己也可以定義在一個合理的范圍內。/ 以下變量只需要初始化一次static intiInitedHookPos=0;if( 0 = iInitedHookPos )iInitedHookPos=1;/ 鉤子初始位置值初始化g_fHookStartPosX=dGetSpritePositionX( GoldHook );g_fHookStartPosY=dGetSpritePositionY( GoldHook );/ 金子可以出現的邊界范圍初始化g_iGoldBornMinX=dGetWorldLeft() + 5;g_iGoldBornMaxX=dGetWorldRight() - 5;g_iGoldBornMinY=dGetWorldTop() + 20;g_iGoldBornMaxY=dGetWorldBottom() - 5;3、 在if后面,我們需要用一個for循環來創建所有的金子。我們規定金子的大小為三種,用iSize來記錄,分別是iSize=4,iSize=6,iSize=8。數量的比例是10個,6個,4個(這個是在金子總數為20的前提下,如果總數不是20,根據比例創建)。我們可以再for循環里面通過if判斷循環變量iLoop的大小范圍為創建不同大小的金子。設置金子大小的函數分別為SetSpriteWidth(設置寬度)dSetSpriteHeight(設置高度),最后使用FunCode提供的隨機函數隨機生成每個金子的(x,y)坐標放入地圖:其中(float)iSize是類型轉換,因為iSize是int型,而SetSpriteWidth函數的參數是float型,如果直接傳進去可能會丟失數據,所以需要先將int型轉換為float型。4、 最后添加下面代碼,恢復挖金者的動作。/ 播放挖金者的動作(恢復初始守候動作)dAnimateSpritePlayAnimation( GoldMan, GolderManAnimation2, 0 );至此,實驗四顯示金子的部分就完成了。實驗五 抓取金子【實驗內容】步驟一、從纜繩器那里畫根線到鉤子上步驟二、檢測鉤子和金子的碰撞步驟三、實現金子綁定在鉤子上并往回拖步驟四、回拖之后使金子消失,金子數目減一【實驗思路】從纜繩器畫線到鉤子上:在地圖上創建精靈的鏈接點,然后獲取他們的坐標位置,調用FunCode的dDrawLine函數即可。鉤子與金子的碰撞:系統檢測到兩者的碰撞之后會調用dOnSpriteColSprite函數,所以我們只要在此函數中實現碰撞之后鉤子抓取金子的代碼就可以了。這里需要注意的是鉤子抓取金子之后的速度處理,抓的金子越大,鉤子回收的速度就會越慢。【實驗指導】1、 打開funcode,單擊地圖上的礦工精靈圖像,在顯示框的上面五個選擇左數第二個“編輯次精靈的鏈接點”,按如圖所示依次單擊這位置顯示0,保存即可。2、 同上,點擊地圖上的鉤子精靈,選擇“編輯此精靈的鏈接點”,依次單擊這三個位置顯示0,1,2,最后保存即可。3、 首先在Main.cpp中添加全局的字符數組變量,用它來存放抓到的金子的名字,并定義空鉤子在抓取金子的時候移向鉤子的速度變量,定義完成之后在GameInit中初始化;4、 精靈的碰撞方式為:當A移動中碰上B時,如果A是可以產生碰撞的,B是可以接受碰撞的,則這2個物體會產生碰撞,精靈碰撞的API將被調用。否則無碰撞發生通過調用庫函數dSetSpriteCollisionSend設置鉤子可以發送碰撞,通過dSetSpriteCollisionReceive函數設置金子可以接收碰撞,這樣,當在地圖上鉤子和金子相碰時,系統就能檢測到。5、 首先實現從纜繩器畫線到鉤子。首先在Main.cpp進行聲明:voidDrawHookLine();然后,添加函數的定義。畫線的原理是先獲取纜繩器的坐標和鉤子的坐標,然后調用DrawLine函數即可。函數定義如下voidDrawHookLine()/ 首先,從礦工精靈上獲取一個纜繩鏈接點作為繩子的起始點(該鏈接點在編/ 輯器里編輯好)floatfStartX=dGetSpriteLinkPointPosX( GoldMan, 1 );floatfStartY=dGetSpriteLinkPointPosY( GoldMan, 1 );/ 繩子終點在鉤子精靈上獲取(該鏈接點在編輯器里編輯好)floatfEndX=dGetSpriteLinkPointPosX( GoldHook, 1 );floatfEndY=dGetSpriteLinkPointPosY( GoldHook, 1 );/ 在這兩點之間劃線.線的顏色紅綠藍值都為50,即灰色dDrawLine( fStartX, fStartY, fEndX, fEndY, 2.f, 0, 50, 50, 50, 255 );dDrawLine函數參數參見文檔前面部分的介紹或者是CommonAPI.h中關于dDrawLine的介紹。6、 main.cpp文件里面的主函數中的while循環每次調用GameMainLoop函數時能保證調用到DrawHookLine函數,保證了鉤子與纜繩器之間的線是一直連著的。 在while循環的最后面添加如下代碼:/ 畫鉤子的纜繩線。不管游戲是什么狀態,這根纜繩線都要畫出來DrawHookLine();7、 接下來要實現單擊鍵盤上的下方向鍵伸出鉤子。如實驗二所說,系統檢測到鍵盤按下,會響應main.cpp里面的dOnKeyDown函數,向下方向鍵的宏定義是KEY_DOWN,因此我們只要判斷dOnKeyDown獲取的鍵值ikey等于它,并且游戲是正在進行的(g_iGameState等于2),鉤子沒有抓到金子(g_iGetGoldState等于0)即可。之后利用系統提供的函數給鉤子一個向前的速度,在播放挖金者手臂往下壓的動作即可。在main.cpp里面dOnKeyDown函數if后面添加如下代碼:/ 當前處于游戲進行中,按下向下的方向鍵,鉤子伸出抓取金子else if( KEY_DOWN = iKey & 2 = g_iGameState & 0 = g_iGetGoldState )/ 設置抓取狀態為:鉤子往外伸g_iGetGoldState=1;/ 以當前朝向給鉤子一個向前的速度dSetSpriteLinearVelocityPolar(GoldHook,g_fEmptyHookSpeed, g_fHookRotation );/ 播放挖金者的動作(一個胳膊往下壓的動作)dAnimateSpritePlayAnimation( GoldMan, GolderManAnimation1, 0 );8、 實現鉤子抓金子的精靈與精靈碰撞事件。/ 首先判斷鉤子是否伸出,已經游戲是否真在進行,否則推出函數: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給的綁定函數SpriteMountToSpriteLinkPoint()將金子綁定在鉤子上隨鉤子移動:/ 將金子掛接到鉤子的2號掛接點上dSpriteMountToSpriteLinkPoint( szGoldName, GoldHook, 2 );/ 設置抓取狀態為:鉤子往回收,抓取到東西。記錄金子名字g_iGetGoldState=3;strcpy( g_szCurGetGold, szGoldName );/ 根據金子大小,計算鉤子的往回收的速度,越大的越慢。/ 算法:之前設置的金子大小為4,6,8,用10減去該大小再除以10,得到3個小/ 數:0.6,0.4,0.2.該小數乘以空鉤子的速度即得到掛接不同金子后的實際速度floatfWidth=dGetSpriteWidth( szGoldName );floatfSpeed=(10.f - fWidth) / 10.f) * g_fEmptyHookSpeed;/ 鉤子往初始位置移動dSpriteMoveTo( GoldHook, g_fHookStartPosX, g_fHookStartPosY, fSpeed, 1);/ 播放挖金者的動作(胳膊來回動的動作)dAnimateSpritePlayAnimation( GoldMan, GolderManAnimation3, 0 );10、 金子抓取之后回收到纜繩器之后,系統判斷鉤子的是否往回運動,是的話判斷鉤子是否回到終點,若是則調用dSpriteDismount函數取消金子與鉤子的綁定,同時調用dDeleteSprite函數刪除該金子精靈,再將金子精靈的總數減一。在GameRun函數后面添加如下代碼:/ 如果當前為鉤子往回歸位,則判斷是否已經運動到終點。到了終點,則又開始搖/ 擺、等待else if( 2 = g_iGetGoldState | 3 = g_iGetGoldState )/ 判斷是否移動到終點(判斷的依據是XY方向的移動速度為0,即金子是否/ 已經停止移動)floatfSpeedX=dGetSpriteLinearVelocityX( GoldHook );floatfSpeedY=dGetSpriteLinearVelocityY( GoldHook );/ 當前速度不為0,還在運動中/ 浮點數是否為0,不能直接判斷 = != 0if( fSpeedX 0.00001f | fS

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論