版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、C 語言課程設(shè)計(jì) -桌球一、實(shí)驗(yàn)內(nèi)容玩家通過移動(dòng)球桿到單一的桌球處碰撞桌球運(yùn)動(dòng), 當(dāng)桌球于一定速度通過桌面右方的同樣顏色的球洞后,則該球進(jìn)洞,在桌面左邊重新分配新球開始游戲。要求如下:1.游戲的初始界面如下,其中左邊有一個(gè)體積較小的桌球,其 x 方向位置固定, y 方向位置隨機(jī)。右邊有八個(gè)顏色不一樣,體積較大的球洞,游戲的目的是使用左邊的桌球以一定小的速度穿過右邊同樣顏色的球洞就算桌球進(jìn)洞,然后重新分配新球。2. 球桿隨鼠標(biāo)運(yùn)動(dòng)而運(yùn)動(dòng),單擊球桿,桌球獲取一個(gè)前進(jìn)的速度同時(shí)往前有運(yùn)動(dòng)。桌球的前進(jìn)方向有一段指示球運(yùn)動(dòng)方向的虛線。3.右側(cè)的球洞以移動(dòng)的頻率不斷更換位置。球洞的x 左邊不變,更換的是
2、y 坐標(biāo)的位置,即每一輪中每一個(gè)球洞移動(dòng)到下一個(gè)球洞的位置,最下邊的球洞則移動(dòng)到第一個(gè)球洞位置。所以的這些動(dòng)作都要在一個(gè)頻率的時(shí)間里面完成。因此當(dāng)游戲一某一個(gè)頻率進(jìn)行的時(shí)候,右側(cè)的球洞就能實(shí)現(xiàn)循環(huán)變化的效果。4.球碰撞到桌面邊沿的時(shí)候以發(fā)射角的角度彈走。5.球進(jìn)洞的判斷是球以一定的速度通過同樣顏色的球洞時(shí),桌球消失, 表明球進(jìn)洞了,此時(shí)左側(cè)隨機(jī)生成新球。 球運(yùn)動(dòng)到球洞的速度不能太大,太大則球直接運(yùn)動(dòng)過球洞,如果速度太小,則球同樣不進(jìn)洞。二、實(shí)驗(yàn)指南實(shí)驗(yàn)一開始實(shí)驗(yàn)【實(shí)驗(yàn)任務(wù)】步驟一、打開FunCode,創(chuàng)建一個(gè)的C+語言項(xiàng)目;步驟二、導(dǎo)入snooker 模板。【實(shí)驗(yàn)思路】按實(shí)驗(yàn)指導(dǎo)完成?!緦?shí)驗(yàn)指
3、導(dǎo)】1、 打開 FunCode,點(diǎn)擊“項(xiàng)目”菜單,選擇“創(chuàng)建C 語言工程”注意:工程名名稱要求字母開頭,只能包含字母和數(shù)字,且名字中間不能有空格。2、 點(diǎn)擊菜單“項(xiàng)目”中的“導(dǎo)入地圖模塊”,如圖一。跳出一個(gè)對(duì)話框,選中“snooker ”模板,點(diǎn)擊“導(dǎo)入到工程”按鈕,如圖二。圖 一3、導(dǎo)入成功后的,界面如下圖所示:圖 二實(shí)驗(yàn)二初始化桌球和球桿同時(shí)在球的前進(jìn)方向畫虛線【實(shí)驗(yàn)內(nèi)容】步驟一、設(shè)置球的初始位置,球桿的初始朝向步驟二、設(shè)置球桿隨鼠標(biāo)移動(dòng)步驟三、在球的前進(jìn)方向上畫虛線【實(shí)驗(yàn)思路】在設(shè)置初始球的時(shí)候要考慮隨機(jī)本局的球數(shù)字,如果和上一局的不一致,則將上局的球拉到屏幕外,將本局的球拉到屏幕內(nèi),在
4、Y 向上隨機(jī)擺放球的出生位置,只隨機(jī)Y方向坐標(biāo),不動(dòng) X 方向。對(duì)于球桿則通過系統(tǒng)的dOnMouseMove 函數(shù)獲取到鼠標(biāo)移動(dòng)時(shí)的坐標(biāo)位置,然后使用dSetSpritePosition 函數(shù)同步設(shè)置桌球精靈的位置。通過獲取球的X 和Y 坐標(biāo),并求兩個(gè)坐標(biāo)平方和的平方根來得到球運(yùn)動(dòng)方向向量的大小,利用循環(huán)調(diào)用系統(tǒng)畫線函數(shù)畫虛線。【實(shí)驗(yàn)指導(dǎo)】1. 在 Main.cpp 中,初始化幾個(gè)全局變量,代碼如下:/ 游戲玩法設(shè)計(jì):上方有8 個(gè)球洞,分別是數(shù)字0-7,球洞間的數(shù)字按一定速率滾/動(dòng) ,每局球都隨機(jī)一個(gè)0-7 的數(shù)字,對(duì)應(yīng)的數(shù)字打入對(duì)應(yīng)的球洞才勝利,開始打球/狀態(tài)g_iPlayState =0;
5、g_fRotateTime= 0.f;g_fHoleRollTime=0.f;2. 初始化精靈:/ 使用循環(huán),給數(shù)組賦值:/將數(shù)組的8 個(gè)值分別賦值0-7 即可,無需隨機(jī)。名字使用dMakeSpriteName 分/別產(chǎn)生,為BallHole0 - BallHole7/ 球洞精靈預(yù)先擺放在場(chǎng)景中,因此不需要?jiǎng)?chuàng)建intiLoop = 0;for( iLoop = 0; iLoop B 減去 A 得到一條由 A 指向 B 的向量。/ 下面的計(jì)算,得到一條球桿坐標(biāo)指向球坐標(biāo)的向量float fVectorX =fBallPosX - fCuePosX;float fVectorY=fBallPosY
6、 - fCuePosY;3) 判斷球和球桿不重合的時(shí)候就執(zhí)行畫線操作。所以還需要在上面的代碼后面添加一個(gè) if 的判斷,同時(shí)計(jì)算向量( fVectorX,fVectorY)的大小,以及將該向量單位化:if( fVectorX 0.001f | fVectorX 0.001f | fVectorY -0.001f )/計(jì)算該向量的大小,以及將該向量單位化(sqrt 函數(shù)是開平方函數(shù),回想下/ 數(shù)學(xué)里如何求單位向量 )floatfVectorSize = sqrt( fVectorX * fVectorX + fVectorY * fVectorY );floatfDirX =fVectorX /
7、 fVectorSize;floatfDirY=fVectorY / fVectorSize;4) 用循環(huán),與上一個(gè)if判斷平行,畫出球前進(jìn)方向的虛線:/ 我們用循環(huán)畫 12 段首尾相連的線段, 如果全部畫出來就是一條實(shí)線, 如果循環(huán)/ 變量為偶數(shù)就畫,為奇數(shù)就不畫,那么就得到一條虛線/畫一條線需要前后兩個(gè)點(diǎn):一個(gè)點(diǎn)使用LastPos ,一個(gè)點(diǎn)使用NewPos。循環(huán) 12/ 次,按照下面步驟寫代碼:/ NewPos等于 LastPos 加上 Dir 乘以 PosStep( 單位向量乘以長(zhǎng)度值等于該向量上/ 的一個(gè)坐標(biāo)點(diǎn) )/當(dāng)循環(huán)變量為偶數(shù)的時(shí)候,使用dDrawLine 畫一根線/ 在畫了線之
8、后,將 NewPos賦值給 LastPosintiLoop= 0;floatfLastPosX= fBallPosX, fLastPosY = fBallPosY;floatfNewPosX= 0.f, fNewPosY = 0.f;floatfPosStep= fVectorSize / 10.f;for( iLoop = 0; iLoop 12; iLoop+ )/ 新坐標(biāo)等于前一坐標(biāo)加上向量方向上的一個(gè)距離值fNewPosX=fLastPosX + fDirX * fPosStep;fNewPosY=fLastPosY + fDirY * fPosStep;/ 偶數(shù)段就畫if( iLoo
9、p % 2 = 0 )dDrawLine( fLastPosX, fLastPosY, fNewPosX, fNewPosY, 2.f, 0, 0, 255, 0, 255 );/ 坐標(biāo)往前移動(dòng) (NewPos 賦值給 LastPos)fLastPosX=fNewPosX;fLastPosY=fNewPosY;實(shí)驗(yàn)三球洞來回循環(huán)滾動(dòng)【實(shí)驗(yàn)內(nèi)容】步驟、循環(huán)改變球洞的位置實(shí)現(xiàn)來回滾動(dòng)【實(shí)驗(yàn)思路】使用循環(huán),將數(shù)組值分別往后移動(dòng)一位,最后一位移動(dòng)到第一位。同時(shí)移動(dòng)精靈名字?jǐn)?shù)組,移動(dòng)對(duì)應(yīng)的精靈 Y 坐標(biāo) (移動(dòng)精靈。使用 dGetSpritePositionY 獲取精靈的位置,交換一下 ,用 dSetS
10、pritePositionY 賦值回去 )思路:先取出最后一個(gè)的值、名字、Y 坐標(biāo),由后往前遍歷數(shù)組,依次將前一個(gè)的值覆蓋當(dāng)前的值,最后將取出來的值賦值給第一個(gè)(這一步是在循環(huán)結(jié)束后做)【實(shí)驗(yàn)指導(dǎo)】1. 在 Main.cpp 中,添加球洞精靈的聲明:/ 8 個(gè)球洞當(dāng)前的數(shù)字值, 0 - 7 來回滾動(dòng)。對(duì)應(yīng)的球數(shù)字打入對(duì)應(yīng)的球洞才勝利intg_iHoleNumber8;charg_szHoleName864;/ 8個(gè)球洞的精靈名字floatg_fHoleRollTime = 0.f;/球洞循環(huán)滾動(dòng)間隔時(shí)間2. 在 Main.cp 的 while 循環(huán)中初始化球洞精靈變量:/ 使用循環(huán),給數(shù)組賦值
11、:/ 將數(shù)組的 8 個(gè)值分別賦值 0-7 即可,無需隨機(jī)。名字使用 dMakeSpriteName 分 / 別產(chǎn)生,為 BallHole0 - BallHole7/ 球洞精靈預(yù)先擺放在場(chǎng)景中,因此不需要?jiǎng)?chuàng)建intiLoop = 0;for( iLoop = 0; iLoop 1.f )g_fHoleRollTime -= 1.f;4. 在上面的 if 判斷里面添加下面代碼:/ 取出最后一個(gè)值iLastData =g_iHoleNumber7;fLastPosY=dGetSpritePositionY( g_szHoleName7 );strcpy( szLastName, g_szHoleNa
12、me7 );/從后往前遍歷數(shù)組。注意只需要做6 次循環(huán)(iLoop由7 遞減至1)for( iLoop = 7; iLoop 0; iLoop- )g_iHoleNumberiLoop=g_iHoleNumberiLoop - 1;/ 先保存需要更改坐標(biāo)的精靈的Y 坐標(biāo)作為下一個(gè)精靈的坐標(biāo),然后再給它/ 賦值fTempPosY = dGetSpritePositionY( g_szHoleNameiLoop - 1 ); dSetSpritePositionY( g_szHoleNameiLoop - 1, fLastPosY ); fLastPosY = fTempPosY;strcpy(
13、g_szHoleNameiLoop, g_szHoleNameiLoop - 1 );/ 將取出來的最后一個(gè)值賦值給第一個(gè)g_iHoleNumber0 =iLastData;strcpy( g_szHoleName0, szLastName );dSetSpritePositionY( g_szHoleName0, fLastPosY );5. 至此,球洞循環(huán)來回滾動(dòng)的實(shí)驗(yàn)結(jié)束。實(shí)驗(yàn)四擊打桌球【實(shí)驗(yàn)內(nèi)容】步驟一、處理鼠標(biāo)單擊事件,球桿角度變化步驟二、球桿擊打之后,桌球獲取一個(gè)向前運(yùn)動(dòng)的速度【實(shí)驗(yàn)思路】獲取系統(tǒng)鼠標(biāo)點(diǎn)擊的消息,判斷游戲是否在進(jìn)行以及球是否可以擊打(即 g_iPlayState 不
14、等于 0),然后球桿旋轉(zhuǎn), 模擬打球的操作。 之后獲取球和球桿之間的向量用來計(jì)算速度,最后利用 dSetSpriteLinearVelocity 函數(shù)給該球一個(gè)速度,同時(shí)用 dSetSpriteDamping 函數(shù)給球一個(gè)減速系數(shù)。【實(shí)驗(yàn)指導(dǎo)】1. 在 Main.cpp 中添加如下變量聲明:float g_fRotateTime; / 球桿拍下時(shí),做個(gè)角度旋轉(zhuǎn),持續(xù)一小段時(shí)間,模擬拍下的動(dòng)作2. 進(jìn)入 Main.cpp 中對(duì)變量 g_fRotateTime 進(jìn)行初始化:g_fRotateTime=0.f;3. 在 dOnMouseClick 中填入如下代碼:1) 只響應(yīng)游戲中可以點(diǎn)擊打球的狀態(tài)
15、if( 2 != g_iGameState | 0 != g_iPlayState ) return;2) 改變球的狀態(tài),同時(shí)給球桿一個(gè)旋轉(zhuǎn),模擬打球動(dòng)作,這個(gè)過程持續(xù)一定的時(shí)間g_iPlayState = 1;g_fRotateTime=0.2f;dSetSpriteRotation( BallCue, g_fOldRotation + 10.f );3) 獲取球和球桿之間的變量(通過獲取坐標(biāo)得到)/ 球的位置float fPosX=dGetSpritePositionX( g_szBallName );float fPosY=dGetSpritePositionY( g_szBallNam
16、e );/ 有 A,B 兩點(diǎn)坐標(biāo),求兩點(diǎn)間向量= B 減去 A 得到一條由 A 指向 B 的向量。/ 下面的計(jì)算,得到一條鼠標(biāo)坐標(biāo)指向球坐標(biāo)的向量float fVectorX=fPosX - fMouseX;float fVectorY=fPosY - fMouseY;4) 通過上面的變量計(jì)算球的速度,同時(shí)讓球運(yùn)動(dòng)已經(jīng)添加一個(gè)減速系數(shù)使其慢慢減速到靜止。/ 將該向量放大,得到我們想要的速度fVectorX *= 12.f;fVectorY *= 12.f;/ 給球設(shè)置該速度,以及設(shè)置一個(gè)速度衰減系數(shù),使其逐漸停止dSetSpriteLinearVelocity( g_szBallName, f
17、VectorX, fVectorY );dSetSpriteDamping( g_szBallName, 1.6f );4.球桿按下之后做了旋轉(zhuǎn),需要對(duì)其進(jìn)行復(fù)位。在while循環(huán)的最后面添加下面的代碼:/ 球桿按下之后,做了個(gè)旋轉(zhuǎn)。時(shí)間到了,將球桿復(fù)位if( g_fRotateTime 0.f )g_fRotateTime-= fDeltaTime;if( g_fRotateTime “碰撞”里選中“發(fā)送碰撞”2 同樣,依次在地圖中點(diǎn)擊上圖中的四個(gè)桌球臺(tái)邊沿精靈,分別給左右上下的邊起名字為: VerSide1、VerSide0、 HorSide0、 HorSide1 進(jìn)入精靈與精靈碰撞函數(shù),
18、碰撞的算法是這樣的 :碰到垂直的邊的時(shí)候,將當(dāng)前球的 X 方向速度取反即可得到反彈效果。水平方向則是對(duì) Y 取反 .如下圖:水平方向上:3 垂直方向上:1) 判斷是否是我們控制的球碰撞到邊界if( strcmp( szSrcName, g_szBallName ) = 0 | strcmp( szTarName, g_szBallName ) = 02) 在上面的 if 里面再進(jìn)行判斷,如果球碰到水平邊(即上下邊沿)則按下面代碼處理:3) 判斷碰撞到垂直還是水平邊if( strstr( szSrcName, VerSide ) | strstr( szTarName, VerSide ) )f
19、loat fVelX=dGetSpriteLinearVelocityX( g_szBallName );dSetSpriteLinearVelocityX( g_szBallName, fVelX * -1.f );4) 如果球碰到垂直邊(即左右邊沿)則按下面代碼處理:else if( strstr( szSrcName, HorSide ) | strstr( szTarName, HorSide ) )float fVelY=dGetSpriteLinearVelocityY( g_szBallName );dSetSpriteLinearVelocityY( g_szBallName, fVelY * -1.f );至此,本實(shí)驗(yàn)結(jié)束。實(shí)驗(yàn)六桌球進(jìn)洞【實(shí)驗(yàn)內(nèi)容】步驟、桌球以一定速度移動(dòng)到球洞中,則判為進(jìn)洞,將球移出屏幕,生成新球【實(shí)驗(yàn)思路】判斷球是否正在運(yùn)動(dòng), 是的話則獲取該球的速度, 同時(shí)判斷該球的速度是否符合進(jìn)洞速度要求以及該球的坐標(biāo)是否在同款顏色的球洞精靈中,是的話則認(rèn)為球進(jìn)洞,將球移出屏幕,左側(cè)生成新球?!緦?shí)驗(yàn)指導(dǎo)】1.在 Main.cpp 的 while 循環(huán)當(dāng)中,前面以及有過判斷球是否運(yùn)動(dòng)的操作了,只需要在后面添加一個(gè)else 語句,判斷球進(jìn)洞的操作在if( 0 = g_iPlayState )else
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年滬教版選修6地理上冊(cè)月考試卷含答案
- 2025年外研銜接版高一歷史下冊(cè)階段測(cè)試試卷
- 2025年蘇教版選擇性必修1歷史下冊(cè)階段測(cè)試試卷含答案
- 2025年教科新版九年級(jí)生物上冊(cè)月考試卷含答案
- 2025年外研版選擇性必修1歷史下冊(cè)階段測(cè)試試卷
- 2025年滬科版選擇性必修3化學(xué)上冊(cè)階段測(cè)試試卷含答案
- 2025年冀教版九年級(jí)歷史下冊(cè)階段測(cè)試試卷
- 2025年度中央廚房設(shè)備定期檢查與維護(hù)合同4篇
- 2025年度租賃合同范本(含轉(zhuǎn)租規(guī)定)2篇
- 2025年度高端面包屋品牌加盟及產(chǎn)品訂購合同4篇
- 圖像識(shí)別領(lǐng)域自適應(yīng)技術(shù)-洞察分析
- 個(gè)體戶店鋪?zhàn)赓U合同
- 禮盒業(yè)務(wù)銷售方案
- 二十屆三中全會(huì)精神學(xué)習(xí)試題及答案(100題)
- 小學(xué)五年級(jí)英語閱讀理解(帶答案)
- 仁愛版初中英語單詞(按字母順序排版)
- (正式版)YS∕T 5040-2024 有色金屬礦山工程項(xiàng)目可行性研究報(bào)告編制標(biāo)準(zhǔn)
- 小學(xué)一年級(jí)拼音天天練
- 新概念英語第二冊(cè)考評(píng)試卷含答案(第49-56課)
- 【奧運(yùn)會(huì)獎(jiǎng)牌榜預(yù)測(cè)建模實(shí)證探析12000字(論文)】
- 救生艇筏、救助艇基本知識(shí)課件
評(píng)論
0/150
提交評(píng)論