05C++課程設(shè)計_迷你高爾夫_第1頁
05C++課程設(shè)計_迷你高爾夫_第2頁
05C++課程設(shè)計_迷你高爾夫_第3頁
05C++課程設(shè)計_迷你高爾夫_第4頁
05C++課程設(shè)計_迷你高爾夫_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、C+語言課程設(shè)計一迷你高爾夫一、實驗內(nèi)容玩家通過按下鍵盤上的上下左右方向鍵控制球的移動,使其最終到達出口則游戲通關(guān)。要求如下:1、 游戲分成3關(guān),第一關(guān)、第二關(guān)、第三關(guān)界面圖如下:第一關(guān)第二關(guān)第三關(guān)2、 啟動游戲進入第一關(guān),勝利后進入第二關(guān),如果第三關(guān)通關(guān),則游戲重新回到第一關(guān)。3、 游戲玩法是通關(guān)控制鍵盤上的上下左右方向鍵控制球的運動,單擊方向鍵,則球獲得一個向該方向直線運動的速度。如果球遇到方塊,則球停止運動,如果遇到黑洞,則游戲結(jié)束,重新開始該游戲,遇到出口則通關(guān)。4、 球靜止?fàn)顟B(tài)下會有箭頭指示球可以運動的方向,運動狀態(tài)下則箭頭消失。如果球運動出世界邊界,則游戲結(jié)束,重新回到該游戲。二、

2、實驗指南實驗一 開始實驗【實驗任務(wù)】步驟一、打開FunCode,創(chuàng)建一個的C+語言項目;步驟二、導(dǎo)入GolfGame場景?!緦嶒炈悸贰堪磳嶒炛笇?dǎo)完成。【實驗指導(dǎo)】1、 打開FunCode,點擊“項目”菜單,選擇“創(chuàng)建C+工程”注意:工程名名稱要求字母開頭,只能包含字母和數(shù)字,且名字中間不能有空格。2、 點擊菜單“項目”中的“導(dǎo)入地圖模塊”,如圖一。跳出一個對話框,選中“GolfGame”模板,點擊“導(dǎo)入到工程”按鈕,如圖二。 圖 一 圖 二3、 導(dǎo)入成功后的,界面如下圖所示:地圖不僅包括界面設(shè)計,還包括該游戲可能要用到的其他精靈。添加到“場景”中的精靈,都已經(jīng)取好名稱,并根據(jù)程序要求設(shè)置好中心

3、點、鏈接點等,學(xué)生只需要直接編程就可以。實驗二 游戲關(guān)卡初始化【實驗內(nèi)容】步驟一、關(guān)卡地圖初始化步驟二、清除上一關(guān)卡數(shù)據(jù)步驟三、根據(jù)當(dāng)前關(guān)卡,選擇關(guān)卡數(shù)據(jù)【實驗思路】游戲開始的時候首先要清除上一關(guān)的游戲數(shù)據(jù),即將上一關(guān)創(chuàng)建的精靈從地圖中刪掉。將游戲地圖分成12*12的方格界面,游戲總共分成三關(guān),因此我們需要用三個二維數(shù)組m_iLevelData1GRID_COUNTGRID_COUNTm_iLevelData2GRID_COUNTGRID_COUNTm_iLevelData3GRID_COUNTGRID_COUNT(其中GRID_COUNT的值為12)來存放這三關(guān)的數(shù)據(jù)即可。二維數(shù)組中0表示該

4、位置不創(chuàng)建精靈,否則根據(jù)不同的值創(chuàng)建不同精靈,RIGID_BLOCK(值為1)表示創(chuàng)建一個方塊精靈,BLACK_HOLE(值為2)表示創(chuàng)建一個黑洞精靈,GOLF_EXIT(值為3)表示創(chuàng)建一個出口精靈。每次把代表該關(guān)卡的二維數(shù)組的數(shù)據(jù)拷貝到存儲當(dāng)前關(guān)卡m_iGridData的二維數(shù)組中?!緦嶒炛笇?dǎo)】1、 進入LessonX.h的CGameMain類中,添加以下成員變量的聲明:intm_iMoveState;/ 控制球的移動狀態(tài):0當(dāng)前靜止,可以移動,1、2、3、4:代表上下左右4個方向移動中,按鍵無響應(yīng)intm_iCurLevel;/ 當(dāng)前關(guān)卡static const floatm_fGrid

5、StartX;/ 第一塊方塊的起始坐標(biāo) = -(GRID_COUNT * g_fGridSize * 0.5 - g_fGridSize / 2)static const floatm_fGridStartY;static const floatm_fGridSize;/ 每塊的大小,包括球、出口等都是此大小intm_iRigidBlockCount;/ 本關(guān)卡創(chuàng)建的阻擋物方塊數(shù)量intm_iBlackHoleCount;/ 本關(guān)卡創(chuàng)建的黑洞數(shù)量intm_iGolfExitCount;/ 本關(guān)卡創(chuàng)建的出口的數(shù)量intm_iGridDataGRID_COUNTGRID_COUNT;/二維數(shù)組,存

6、儲當(dāng)前關(guān)卡N*N的矩陣方塊信息static const intm_iLevelData1GRID_COUNTGRID_COUNT ;static const intm_iLevelData2GRID_COUNTGRID_COUNT ;static const intm_iLevelData3GRID_COUNTGRID_COUNT ; vector<CSprite*> m_vRigidBlock;/阻擋物精靈向量數(shù)組vector<CSprite*> m_vBlackHole;/黑洞精靈向量數(shù)組vector<CSprite*> m_vGolfExit;/出口精

7、靈向量數(shù)組2、 進入LessonX.h中在頭文件聲明的后面添加下面的宏定義代碼:#defineGRID_COUNT12/ N * N 的矩陣方塊,一個N的大小#defineMAX_LEVEL3/ 最大關(guān)卡數(shù)量。如果要增加關(guān)卡,請先修改此值#defineRIGID_BLOCK1/ 以下3個分別為方塊阻擋物、黑洞、出口的值#defineBLACK_HOLE2#defineGOLF_EXIT33、 在LessonX.h頭文件#include <Windows.h>下面添加:#include <vector>using std:vector;4、 進入LessonX.cpp中添

8、加上面的成員變量的初始化:1) 在構(gòu)造函數(shù)中把m_iGameState的值由0改為1:m_iGameState=1;2) 在構(gòu)造函數(shù)中添加下面代碼:m_iCurLevel=1;m_iMoveState=0;/ 控制球的移動狀態(tài):0當(dāng)前靜止,可以移動,1、2、3、4:代表上下左右4個方向移動中,按鍵無響應(yīng)m_iRigidBlockCount=0;/ 本關(guān)卡創(chuàng)建的阻擋物方塊數(shù)量m_iBlackHoleCount=0;/ 本關(guān)卡創(chuàng)建的黑洞數(shù)量m_iGolfExitCount=0;3) 對于const類型的成員變量,我們需要在函數(shù)外面單獨進行初始化,在文件最后面添加如下代碼:const float C

9、GameMain:m_fGridStartX=-27.5f;const float CGameMain:m_fGridStartY=-27.5f;const float CGameMain:m_fGridSize=5.f;const int CGameMain:m_iLevelData1GRID_COUNTGRID_COUNT = 0, 0, 0, 0,0,0,0,0,0, 0, 0, 0,0, 0, 0, 0,0,0,0,0,0, 0, 0, 0,0, 0, 0, 0,0,0,0,0,0, 0, 0, 0,0, 0, 0, RIGID_BLOCK,RIGID_BLOCK,RIGID_BLOC

10、K,RIGID_BLOCK,RIGID_BLOCK,RIGID_BLOCK, 0, 0, 0,0, 0, 0, RIGID_BLOCK,0,0,0,0,RIGID_BLOCK, 0, 0, 0,0, 0, 0, RIGID_BLOCK,0,0,0,0,RIGID_BLOCK, 0, 0, 0,0, 0, 0, RIGID_BLOCK,0,0,0,0,BLACK_HOLE, 0, 0, 0,0, 0, 0, 0,0,0,0,GOLF_EXIT,RIGID_BLOCK, 0, 0, 0,0, 0, 0, 0,0,0,0,0,0, 0, 0, 0,0, 0, 0, 0,0,0,0,0,0, 0, 0

11、, 0,0, 0, 0, 0,0,0,0,0,0, 0, 0, 0,0, 0, 0, 0,0,0,0,0,0, 0, 0, 0;const int CGameMain:m_iLevelData2GRID_COUNTGRID_COUNT=0, RIGID_BLOCK, RIGID_BLOCK, RIGID_BLOCK, 0, RIGID_BLOCK, RIGID_BLOCK, RIGID_BLOCK, RIGID_BLOCK, RIGID_BLOCK, RIGID_BLOCK, 0,0, RIGID_BLOCK, 0, 0, 0, 0, 0, 0, 0, 0, RIGID_BLOCK, 0,0,

12、 RIGID_BLOCK, 0, 0, 0, 0, 0, 0, 0, 0, RIGID_BLOCK, 0,0, RIGID_BLOCK, 0, 0, 0, 0, 0, 0, 0, 0, RIGID_BLOCK, 0,0, RIGID_BLOCK, 0, 0, 0, 0, 0, 0, 0, 0, RIGID_BLOCK, 0,0, RIGID_BLOCK, 0, 0, 0, 0, 0, 0, 0, 0, RIGID_BLOCK, 0,0, RIGID_BLOCK, 0, 0, 0, RIGID_BLOCK, RIGID_BLOCK, RIGID_BLOCK, 0, 0, RIGID_BLOCK,

13、 0,0, RIGID_BLOCK, 0, 0, 0, 0, 0, RIGID_BLOCK, 0, 0, RIGID_BLOCK, 0,0, RIGID_BLOCK, 0, 0, 0, 0, 0, 0, GOLF_EXIT, RIGID_BLOCK, RIGID_BLOCK, 0,0, RIGID_BLOCK, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, RIGID_BLOCK, 0, 0, 0, 0, 0, 0, 0, 0, RIGID_BLOCK, 0,0, RIGID_BLOCK, 0, RIGID_BLOCK, RIGID_BLOCK, RIGID_BLOCK, R

14、IGID_BLOCK, RIGID_BLOCK, RIGID_BLOCK, 0, RIGID_BLOCK, 0;const int CGameMain:m_iLevelData3GRID_COUNTGRID_COUNT=0, 0, 0, 0, 0, 0, 0, 0, RIGID_BLOCK, RIGID_BLOCK, 0, 0,0, 0, RIGID_BLOCK, RIGID_BLOCK, RIGID_BLOCK, 0, 0, 0, 0, 0, 0, RIGID_BLOCK,RIGID_BLOCK, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RIGID_BLOCK,0, 0,

15、 0, 0, 0, 0, 0, 0, 0, 0, 0, RIGID_BLOCK,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, GOLF_EXIT, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, RIGID_BLOCK, RIGID_BLOCK, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RIGID_BLOCK, 0,0, 0, 0, RIGID_BLOCK, 0, 0, 0, 0, 0, 0, RIGID_B

16、LOCK, 0,0, 0, 0, 0, BLACK_HOLE, RIGID_BLOCK, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;二維數(shù)組中0表示該位置不創(chuàng)建精靈,否則根據(jù)不同的值創(chuàng)建不同精靈,RIGID_BLOCK(值為1)表示創(chuàng)建一個方塊精靈,BLACK_HOLE(值為2)表示創(chuàng)建一個黑洞精靈,GOLF_EXIT(值為3)表示創(chuàng)建一個出口精靈。4) 進入GameInit函數(shù)里面,將球的運動狀態(tài)初始化為靜止,添加下面代碼:m_iMoveState=0;5、 游戲初始化的時候,首先我們需要將前邊添加的精靈全部刪除掉。1) 進入Le

17、ssonX.h文件的CGameMain類中添加該函數(shù)的聲明:void ClearAllSprite();2) 在LessonX.cpp最后面添加該函數(shù)的定義:void CGameMain: ClearAllSprite()3) 再使用3個循環(huán),分別將上一關(guān)卡創(chuàng)建的3種精靈刪除掉。在上邊定義的函數(shù)中添加如下代碼:intiLoop= 0;for( iLoop = 0; iLoop < m_vRigidBlock.size(); iLoop+ )m_vRigidBlockiLoop->DeleteSprite();for( iLoop = 0; iLoop < m_vBlackHo

18、le.size(); iLoop+ )m_vBlackHoleiLoop->DeleteSprite();for( iLoop = 0; iLoop < m_vGolfExit.size(); iLoop+ )m_vGolfExitiLoop->DeleteSprite();/ 總數(shù)置0,重新創(chuàng)建m_iRigidBlockCount=0;m_iBlackHoleCount=0;m_iGolfExitCount=0;其中m_vRigidBlock、m_vBlackHole、m_vGolfExit是存儲三種精靈的向量數(shù)組,每一個循環(huán)都遍歷一遍向量數(shù)組并調(diào)用數(shù)組中每個精靈的Dele

19、teSprite函數(shù)即可。m_vRigidBlock.size()、m_vBlackHole.size()、m_vGolfExit.size()表示每種精靈的總數(shù)4) 最后在GameInit()中添加調(diào)用此函數(shù)的代碼:ClearAllSprite();5) 在GameInit()中,我們對關(guān)卡進行選擇初始化。a.選擇關(guān)卡我們使用了switch-case結(jié)構(gòu),程序通過判斷switch中的參數(shù)進入到不同的case中去,每個case就是一種情況的實現(xiàn)。代碼如下:/ 控制球在數(shù)組中的開始位置(出生點),該位置不能為0.根據(jù)關(guān)卡數(shù)據(jù)自行指定intiControlStartX = 0, iControlS

20、tartY = 0;/ 根據(jù)當(dāng)前關(guān)卡,選擇關(guān)卡數(shù)據(jù)switch( m_iCurLevel )case 2:iControlStartX=5;iControlStartY=9;memcpy( m_iGridData, m_iLevelData2, sizeof(int) * GRID_COUNT * GRID_COUNT );break;case 3:iControlStartX=3;iControlStartY=6;memcpy( m_iGridData, m_iLevelData3, sizeof(int) * GRID_COUNT * GRID_COUNT );break;/ 如果要新增關(guān)

21、卡,在此處增加case即可/ case./ Level1 或者g_iCurLevel錯誤case 1:default:iControlStartX=5;iControlStartY=6;memcpy( m_iGridData, m_iLevelData1, sizeof(int) * GRID_COUNT * GRID_COUNT );break; memcpy函數(shù)作用是從源src所指的內(nèi)存地址的起始位置開始拷貝n個字節(jié)到目標(biāo)dest所指的內(nèi)存地址的起始位置中。因為二維數(shù)組在內(nèi)存中的存放方式是連續(xù)的,因此我們將源地址拷貝給m_iGridData的起始地址之后,系統(tǒng)后自動根據(jù)m_iGridDat

22、a的下標(biāo)來找到正確的值。至此,本實驗結(jié)束。實驗三初始化游戲精靈【實驗內(nèi)容】步驟一、創(chuàng)建精靈步驟二、初始化精靈位置【實驗思路】遍歷二維數(shù)組m_iGridData,根據(jù)數(shù)組值生成對應(yīng)的精靈實例:值為0的時候不用創(chuàng)建,需要創(chuàng)建的精靈名字前綴為(按照宏定義的1,2,3順序):RigidBlock, BlackHole, GolfExit。每創(chuàng)建一種精靈,將其總數(shù)加1 :m_iRigidBlockCount, m_iBlackHoleCount,m_iGolfExitCount?!緦嶒炛笇?dǎo)】1、 進入LessonX.h,CGameMain類中添加下面成員變量的聲明:CSprite*m_pControlB

23、all;/控制球精靈CSprite*m_pGolfArrow;/指示箭頭精靈在LessonX.cpp中CGameMain類在構(gòu)造函數(shù)里面添加上面成員變量的初始化:m_pControlBall=new CSprite("ControlBall");m_pGolfArrow=new CSprite("GolfArrow");2、 創(chuàng)建精靈之后需要將精靈移到特定位置,因此我們需要定義一個自定義的函數(shù)MoveSpriteToBlock來實現(xiàn)這個功能。1) 進入LessonX.h中添加該函數(shù)的聲明:void MoveSpriteToBlock( CSprite*

24、tmpSprite, const int iIndexX, const int iIndexY );2) 在LessonX.cpp最后面添加該函數(shù)的定義:void CGameMain:MoveSpriteToBlock( CSprite* tmpSprite, const int iIndexX, const int iIndexY )3) 傳入該函數(shù)的是精靈實體以及x,y坐標(biāo)參數(shù)。再通過SetSpritePosition函數(shù)設(shè)置精靈位置,在該函數(shù)里面添加如下代碼:floatfPosX=m_fGridStartX + iIndexX * m_fGridSize;floatfPosY=m_fGr

25、idStartY + iIndexY * m_fGridSize;tmpSprite->SetSpritePosition(fPosX, fPosY);3、 這里定義在GameInit函數(shù)中來創(chuàng)建控制球、方塊精靈、出口精靈和黑洞精靈。通過一個函數(shù)來實現(xiàn)CreateAllSprite()。原理是通過兩個for循環(huán)來,判斷m_iGridData的值,如果為0,則不創(chuàng)建,如果為RIGID_BLOCK則創(chuàng)建一個方塊精靈,為 BLACK_HOLE則創(chuàng)建一個黑洞精靈,為GOLF_EXIT則創(chuàng)建一個出口精靈。由于我們預(yù)先在地圖中擺放了三個模板精靈,因此只需要使用CloneSprite函數(shù)即可創(chuàng)建新的精

26、靈。然后再調(diào)用MoveSpriteToBlock函數(shù)將精靈移動到指定位置。最后每創(chuàng)建一個實現(xiàn)精靈,將它添加到相應(yīng)的精靈向量數(shù)組中。、1) 進入LessonX.h文件的CGameMain類中添加該函數(shù)的聲明: void CreateAllSprite();2) 在LessonX.cpp最后面添加該函數(shù)的定義:void CGameMain: CreateAllSprite()3) 在定義汗的函數(shù)中添加變量聲明:intiLoopX = 0, iLoopY = 0;CSprite* tmpSprite;char*szName = NULL;4) 實現(xiàn)兩個for循環(huán):for( iLoopY = 0; i

27、LoopY < GRID_COUNT; iLoopY+ )for( int iLoopX = 0; iLoopX < GRID_COUNT; iLoopX+ )5) 在里面的循環(huán)添加判斷代碼:如果是0,則不創(chuàng)建精靈,continue表示跳出本次循環(huán),繼續(xù)下一個循環(huán)。if( 0 = m_iGridDataiLoopYiLoopX )continue;如果是方塊,則創(chuàng)建方塊精靈:if( RIGID_BLOCK = m_iGridDataiLoopYiLoopX )szName=CSystem:MakeSpriteName("RigidBlock",m_iRigidB

28、lockCount );tmpSprite=new CSprite(szName);tmpSprite->CloneSprite("RigidBlockTemplate");MoveSpriteToBlock( tmpSprite, iLoopX, iLoopY );m_vRigidBlock.push_back(tmpSprite);m_iRigidBlockCount+;如果是黑洞,則創(chuàng)建黑洞精靈:else if( BLACK_HOLE = m_iGridDataiLoopYiLoopX )szName=CSystem:MakeSpriteName( "

29、BlackHole", m_iBlackHoleCount );tmpSprite=new CSprite(szName);tmpSprite->CloneSprite("BlackHoleTemplate");MoveSpriteToBlock( tmpSprite, iLoopX, iLoopY );m_vBlackHole.push_back(tmpSprite);m_iBlackHoleCount+;如果是出口,則創(chuàng)建出口精靈:else if( GOLF_EXIT = m_iGridDataiLoopYiLoopX )szName=CSystem:M

30、akeSpriteName( "GolfExit", m_iGolfExitCount );tmpSprite=new CSprite(szName);tmpSprite->CloneSprite("GolfExitTemplate");MoveSpriteToBlock( tmpSprite, iLoopX, iLoopY );m_vGolfExit.push_back(tmpSprite);m_iGolfExitCount+;6) 將控制球和指示箭頭擺放到初始位置,此時球靜止,因此指示箭頭可見。在上面的兩個循環(huán)后面添加下面的代碼:m_pCont

31、rolBall->SetSpriteLinearVelocity( 0.f, 0.f);MoveSpriteToBlock(m_pControlBall,m_iControlStartX,m_iControlStartY);MoveSpriteToBlock(m_pGolfArrow, m_iControlStartX, m_iControlStartY );m_pGolfArrow->SetSpriteVisible(1);7) 最后在GameInit()中調(diào)用此函數(shù):CreateAllSprite();至此,本實驗結(jié)束。實驗四 移動球【實驗內(nèi)容】步驟一、響應(yīng)鍵盤按鍵按下消息步驟

32、二、球精靈坐標(biāo)轉(zhuǎn)換為二維格子數(shù)組索引步驟三、判斷移動方向,使球獲取速度【實驗思路】首先響應(yīng)系統(tǒng)的按鍵消息函數(shù),然后獲取精靈坐標(biāo),并將其轉(zhuǎn)換為二維格子中的坐標(biāo),判斷其旁邊的格子是否是方塊,如果不是則給球一個移動的速度?!緦嶒炛笇?dǎo)】1、 在LessonX.cpp文件的OnKeyDown函數(shù)中添加代碼:a.首先判斷游戲狀態(tài),只有在游戲中已經(jīng)可以移動狀態(tài)才響應(yīng)按鍵,在上面函數(shù)中添加下面的代碼:if( 2 != m_iGameState | 0 != m_iMoveState )return;2、 獲取控制球精靈坐標(biāo)轉(zhuǎn)換到二維格子數(shù)組索引,這里我們需要定義兩個函數(shù)SpritePosXToIndexX和S

33、pritePosXToIndexY分別處理精靈坐標(biāo)轉(zhuǎn)換為二維格子的X索引和Y索引:1) 進入LessonX.h中添加上面兩個函數(shù)的聲明:intSpritePosXToIndexX( const float fPosX );intSpritePosYToIndexY( const float fPosY );2) 進入LessonX.cpp中添加SpritePosXToIndexX的定義:int CGameMain: SpritePosXToIndexX ( const float fPosX )3) 首先得到左右邊界的坐標(biāo)值。m_fGridStartX是在方塊的中心,所以需要減去半個方塊的寬度

34、才是左邊邊界。在SpritePosXToIndexX函數(shù)定義中添加下面的代碼:constfloatfLeftSide=m_fGridStartX - m_fGridSize / 2.f;constfloatfRightSide=fLeftSide + m_fGridSize * GRID_COUNT;4) 最后需要判斷坐標(biāo)是否出了左右邊界,如果沒有則返回X索引值。在上面的函數(shù)里面添加下面的判斷代碼:if( fPosX < fLeftSide | fPosX > fRightSide )return -1;intiIndexX=(int)( (fPosX - fLeftSide) /

35、 m_fGridSize );return iIndexX;5) 在LessonX.cpp中添加SpritePosYToIndexY函數(shù)的定義:int CGameMain:SpritePosYToIndexY( const float fPosY )6) 首先獲取上下邊界坐標(biāo)值。m_fGridStartY是在方塊的中心,所以需要減去半個方塊的寬度才是上邊邊界。在上面的函數(shù)定義中添加下面的代碼:constfloatfTopSide=m_fGridStartY - m_fGridSize / 2.f;constfloatfBottomSide=fTopSide + m_fGridSize * GR

36、ID_COUNT;7) 最后判斷是否超過了上下邊界,沒有則返回Y索引值:if( fPosY < fTopSide | fPosY > fBottomSide )return -1;intiIndexY=(int)( (fPosY - fTopSide) / m_fGridSize );return iIndexY;3、 有了上面的兩個函數(shù),我們就可以將控制球精靈坐標(biāo)轉(zhuǎn)換到二維格子數(shù)組索引,并判斷坐標(biāo)是否超出邊界,在OnKeyDown函數(shù)中添加下面的代碼:floatfPosX=m_pControlBall->GetSpritePositionX(); floatfPosY=m_

37、pControlBall->GetSpritePositionY(); intiIndexX=SpritePosXToIndexX( fPosX );intiIndexY=SpritePosYToIndexY( fPosY );if( iIndexX < 0 | iIndexX >= GRID_COUNT | iIndexY < 0 | iIndexY >= GRID_COUNT )return;4、 根據(jù)上下左右方向鍵,先判斷控制球旁邊是否是方塊,如果是方塊則不能移動。不是方塊,則給予控制球一個速度。使用iIndexX, iIndexY的時候,注意要判斷是否是邊

38、緣的索引,如果不判斷就進行加1減1,訪問數(shù)組會造成下標(biāo)溢出。即如果要判斷左邊是否是方塊阻擋,則索引值為 IndexX - 1 。此時必須先判斷iIndexX大于0,才能減一。如果iIndexX為0,代表直接可以移動。1) 如果是按下向上方向鍵:if( KEY_UP = iKey )if( iIndexY > 0 && RIGID_BLOCK = m_iGridDataiIndexY - 1iIndexX )return;/ 給予控制球一個方向速度,并設(shè)置移動狀態(tài)、隱藏指示箭頭m_iMoveState=1;m_pControlBall->SetSpriteLinear

39、VelocityY(-30.f);m_pGolfArrow->SetSpriteVisible(0);2) 如果是按下向下方向鍵:else if( KEY_DOWN = iKey )if( iIndexY < GRID_COUNT - 1 && RIGID_BLOCK = m_iGridDataiIndexY + 1iIndexX )return;/ 給予控制球一個方向速度,并設(shè)置移動狀態(tài)、隱藏指示箭頭m_iMoveState=2;m_pControlBall->SetSpriteLinearVelocityY(30.f);m_pGolfArrow->S

40、etSpriteVisible(0);3) 如果是按下向左方向鍵:else if( KEY_LEFT = iKey )if( iIndexX > 0 && RIGID_BLOCK = m_iGridDataiIndexYiIndexX - 1 )return;/ 給予控制球一個方向速度,并設(shè)置移動狀態(tài)、隱藏指示箭頭m_iMoveState=3;m_pControlBall->SetSpriteLinearVelocityX(-30.f);m_pGolfArrow->SetSpriteVisible(0);4) 如果是按下向右方向鍵:else if( KEY_R

41、IGHT = iKey )if( iIndexX < GRID_COUNT - 1 && RIGID_BLOCK = m_iGridDataiIndexYiIndexX + 1 )return;/ 給予控制球一個方向速度,并設(shè)置移動狀態(tài)、隱藏指示箭頭m_iMoveState=4;m_pControlBall->SetSpriteLinearVelocityX(30.f);m_pGolfArrow->SetSpriteVisible(0);實驗五球運動情況的處理【實驗內(nèi)容】步驟一、獲得球所在邊緣格子信息步驟二、不同格子分情況處理【實驗思路】獲取球精靈的當(dāng)前坐標(biāo)并

42、將其轉(zhuǎn)換為二維格子的坐標(biāo),判斷在運動中球邊緣的情況,如果已經(jīng)出了邊界則不需要再判斷,否則如果是方塊則球???、是黑洞則重新開始關(guān)卡、是出口則通關(guān)?!緦嶒炛笇?dǎo)】1、 進入LessonX.cpp中的GameRun函數(shù)中,移動狀態(tài)為移動中,時刻監(jiān)測控制球的移動情況,根據(jù)移動方向的下一個方塊,進行對應(yīng)的處理。添加下面的if判斷:if( 0 != m_iMoveState )2、 先將控制球精靈坐標(biāo)轉(zhuǎn)換到二維格子數(shù)組索引,如果控制球已經(jīng)出了邊界,所以不需要再判斷。在上面的判斷里面添加下面的代碼:floatfPosX=m_pControlBall->GetSpritePositionX();float

43、fPosY=m_pControlBall->GetSpritePositionY();intiIndexX=SpritePosXToIndexX( fPosX );intiIndexY=SpritePosYToIndexY( fPosY );/ 控制球已經(jīng)出了邊界,所以不需要再判斷if( iIndexX < 0 | iIndexX >= GRID_COUNT | iIndexY < 0 | iIndexY >= GRID_COUNT )return;3、 根據(jù)當(dāng)前方向,獲得控制球邊緣所在的格子信息(球在坐標(biāo)是在中心點,所以加上球的大小的一半)??偣灿?中方向,即上下左右,分別用1、2、3、4來表示,添加下面的代碼:floatfNextPosX=fPosX;floatfNextPosY=fPosY;/if( 1 = m_iMoveState )fNextPosY -= m_fGridSize * 0.5f;else if( 2 = m_iMoveState )fNextPosY += m_fGridSize * 0.5f;else if( 3

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論