#include?"CommonAPI.h"
#include?"stdio.h"
#include?"string.h"
voidDrawHookLine();
int?g_fGoldBornMinX?=?0;
int?g_fGoldBornMaxX?=?0;
int?g_fGoldBornMinY?=?0;
int?g_fGoldBornMaxY?=?0;
int?g_iGoldCount?=?20;
int?g_iGameState=2;
int?flag=1;?
float?Score=0.f;
int?flagnum=0;?
char?szGotGoldName[20]?;?//當前抓到金子的名稱
float?g_fHookRotation?=?0.f;
float?g_fEmptyHookSpeed?=35.f;
float?fTimeDelta;
float?g_fHookStartPosX;?//存儲鉤子的初始X位置
float?g_fHookStartPosY;?//存儲鉤子的初始Y位置
///////////////////////////////////////////////////////////////////////////////////////////
//
//?主函數入口
//
//////////////////////////////////////////////////////////////////////////////////////////
int?PASCAL?WinMain(HINSTANCE?hInstance,
HINSTANCE?hPrevInstance,
LPSTR?lpCmdLine,
intnCmdShow)
{
//?初始化遊戲引擎 if(?!dInitGameEngine(?hInstance,?lpCmdLine?)?) return?0; //?遊戲初始化代碼?dSetWindowTitle("黃金礦工");
g_fGoldBornMinX?=?dGetScreenLeft()?+?5;?//金子左邊界 g_fGoldBornMaxX?=?dGetScreenRight()?-?5;?//金子右邊界 g_fGoldBornMinY?=?dGetScreenTop()?+?20;?//金子上邊界 g_fGoldBornMaxY?=?dGetScreenBottom()?-?5;?//金子下邊界 g_fHookStartPosX?=?dGetSpritePositionX("GoldHook");?//獲取鉤子的初始X坐標 g_fHookStartPosY?=?dGetSpritePositionY("GoldHook");?//獲取鉤子的初始Y坐標dSetSpriteCollisionSend("goldHook",?1);
dSetSpriteCollisionReceive("goldTemplate",?1); const?float?fRotateSpeed?=?45.f;?//?搖擺速度,單位?度/秒 int?iHookRotToLeft?=?1;//鉤子擺動的方向:1?←?;0?→ float?fTimeDelta?=?dGetTimeDelta();//?引擎主循環,處理屏幕圖像刷新等工作
while(?dEngineMainLoop()?) { //?獲取兩次調用之間的時間差,傳遞給遊戲邏輯處理 float?fTimeDelta?=?dGetTimeDelta(); DrawHookLine();//?執行遊戲主循環
if(g_iGameState?==?0) { float?fThisRotate?=?fRotateSpeed?*?fTimeDelta;if(?iHookRotToLeft?)
{
g_fHookRotation?+=?fThisRotate;
if(?g_fHookRotation?>=?180.f?)
{
g_fHookRotation?=?180.f; iHookRotToLeft?=?0;}
}
else{
g_fHookRotation?-=?fThisRotate;
if(?g_fHookRotation?<=?0.f?)
{
g_fHookRotation?=?0.f; iHookRotToLeft?=?1;}
}
dSetSpriteRotation("GoldHook",g_fHookRotation); } else?if(g_iGameState?==?1) {?dSetTextValue("Score",Score);
//播放拉金塊的動作
dAnimateSpritePlayAnimation("goldMan","GolderManAnimation3",?1?);?//獲取鉤子X方向的速度
float?fSpeedX?=?dGetSpriteLinearVelocityX("GoldHook");?//獲取鉤子Y方向的速度
float?fSpeedY?=?dGetSpriteLinearVelocityY("GoldHook");
//當速度接近為0時,即可判定其已到達初始點
if(?fSpeedX?<?0.00001f?&&?fSpeedX?>?-0.00001f?&&?
fSpeedY?<?0.00001f?&&?fSpeedY?>?-0.00001f?)
{
//解除金塊與鉤子的錨定
dSpriteDismount(szGotGoldName);?
//刪除獲取的金塊
dDeleteSprite(szGotGoldName);?
//回拉結束,設定狀態為0
g_iGameState?=?0;
if(flagnum)
{g_iGoldCount--;
}}
} //?播放挖金者的動作(恢復初始守候動作) dAnimateSpritePlayAnimation("goldMan",?"GolderManAnimation2",?1); if(g_iGoldCount==0) {g_iGameState?=?0;
Score=0;
dSetSpriteVisible("GameBegin",1);?
g_iGoldCount?=?20;
flag=1;?
} }; dAnimateSpritePlayAnimation("goldMan",?"GolderManAnimation2",?1);//?關閉遊戲引擎
dShutdownGameEngine(); return?0;}
//==========================================================================
//
//?引擎捕捉鼠標移動消息後,將調用到本函數
void?dOnMouseMove(?const?float?fMouseX,?const?float?fMouseY?)
{
//?可以在此添加遊戲需要的響應函數}
//==========================================================================
//
//?引擎捕捉鼠標點擊消息後,將調用到本函數
void?dOnMouseClick(?const?int?iMouseType,?const?float?fMouseX,?const?float?fMouseY?)
{
//?可以在此添加遊戲需要的響應函數}
//==========================================================================
//
//?引擎捕捉鍵盤按下消息後,將調用到本函數
//?iAltPress?iShiftPress?iCtrlPress?分別為判斷Shift,Alt,Ctrl當前是否也處於按下狀態。比如可以判斷Ctrl+E組合鍵
void?dOnKeyDown(?const?int?iKey,?const?int?iAltPress,?const?int?iShiftPress,?const?int?iCtrlPress?)
{
//?可以在此添加遊戲需要的響應函數 if(iKey==KEY_SPACE) {g_iGameState?=?1;?//?初始化之後,將遊戲狀態設置為進行中
dSetSpriteVisible("GameBegin",0);
//生成金子
int?iLoop?=?0;?//循環變量控制int?iSize?=?4,?iPosX?=?0,?iPosY?=?0;?//iSize表示金塊大小的變量
if(flag){
for(?iLoop?=?0;?iLoop?<?g_iGoldCount;?iLoop++?)
{
if(?iLoop?<?10?)//生成10個小金塊,大小為4 {iSize?=?4;
} else?if(?iLoop?>=?10?&&?iLoop?<?16?)//生成6個中金塊,大小為6 {iSize?=?6;
} else//生成4個大金塊,大小為8 {iSize?=?8;
}//初始化金子精靈實例char*?tmpName;
//生成金塊名字 tmpName=dMakeSpriteName("GoldBlock",iLoop); dCloneSprite("goldTemplate",tmpName); //設置金塊的寬度 dSetSpriteWidth(tmpName,(float)iSize); //設置金塊的高度 dSetSpriteHeight(tmpName,(float)iSize);? //設置金子精靈位置 iPosX?=?dRandomRange(g_fGoldBornMinX,?g_fGoldBornMaxX); iPosY?=?dRandomRange(g_fGoldBornMinY,?g_fGoldBornMaxY); dSetSpritePosition(tmpName,(float)iPosX,?(float)iPosY);flag=0;
}
}
if(g_iGoldCount==0){
flag=1;
g_iGoldCount=20;
}
} if(?iKey?==?KEY_S?&&g_iGameState?==0?) {//按下↓並且遊戲狀態為?"0"? g_iGameState?=?2;?//置遊戲狀態為2,可用於控制鉤子是否擺動 //?以當前朝向給鉤子壹個向前的速度dSetSpriteLinearVelocityPolar("GoldHook",g_fEmptyHookSpeed,g_fHookRotation);
//?播放挖金者的動作(壹個胳膊往下壓的動作)dAnimateSpritePlayAnimation("goldMan","GolderManAnimation1",?0);
//0?表示播放壹次,這裏胳膊往下壓就是壹次 }?}
//==========================================================================
//
//?引擎捕捉鍵盤彈起消息後,將調用到本函數
void?dOnKeyUp(?const?int?iKey?)
{
//?可以在此添加遊戲需要的響應函數}
//===========================================================================
//
//?引擎捕捉到精靈與精靈碰撞之後,調用此函數
void?dOnSpriteColSprite(?const?char?*szSrcName,?const?char?*szTarName?)
{
//?發起者為GoldHook,接受者含有GoldBlock字段 if(strcmp(szSrcName,"GoldHook")==?1?&&?strstr(szTarName,"GoldBlock")!=NULL?) {//將金塊錨定在鉤子上
dSpriteMountToSpriteLinkPoint(?szTarName,?"GoldHook",?2?);//使鉤子向初始位置移動,即會拉
dSpriteMoveTo("GoldHook",g_fHookStartPosX,g_fHookStartPosY,?g_fEmptyHookSpeed,?1);
//復制並保存當前抓取到金塊的名稱
strcpy(szGotGoldName,szTarName);
//?發起者為GoldHook,接受者含有GoldBlock字段
//?根據金子大小,計算鉤子的往回收的速度,越大的越慢。
//?算法:之前設置的金子大小為4,6,8,用10減去該大小再除以10,得到3個小數:0.6,0.4,0.2.該小數乘以空鉤子的速度即得到掛接不同金子後的實際速度
float?fWidth?=?dGetSpriteWidth(?szTarName?); float?fSpeed?=?((10.f?-?fWidth)?/?10.f)?*?g_fEmptyHookSpeed;Score+=fWidth;
//?鉤子往初始位置移動?
dSpriteMoveTo(?"goldhook",?g_fHookStartPosX,?g_fHookStartPosY,?fSpeed,?1);
//播放拉金塊的動作
dAnimateSpritePlayAnimation("goldMan","GolderManAnimation1",?0?);?
g_iGameState?=?1;
flagnum=1;
}}
//===========================================================================
//
//?引擎捕捉到精靈與世界邊界碰撞之後,調用此函數.
//?iColSide?:?0?左邊,1?右邊,2?上邊,3?下邊
void?dOnSpriteColWorldLimit(?const?char?*szName,?const?int?iColSide?)
{
if(strcmp(szName,"GoldHook")!=0) {? //碰到邊界的為鉤子時//同樣設置為回拉,只是沒有碰到金子
dSpriteMoveTo(szName,g_fHookStartPosX,g_fHookStartPosY,?g_fEmptyHookSpeed,?1);//播放拉金塊的動作
dAnimateSpritePlayAnimation("goldMan","GolderManAnimation3",?0);g_iGameState?=?1;
flagnum=0; }?}
void?DrawHookLine()
{
//?首先,從礦工精靈上獲取壹個纜繩鏈接點作為繩子的起始點 float?fStartX?=?dGetSpriteLinkPointPosX(?"GoldMan",?1?); float?fStartY?=?dGetSpriteLinkPointPosY(?"GoldMan",?1?); //?繩子終點在鉤子精靈上獲取 float?fEndX?=?dGetSpriteLinkPointPosX(?"GoldHook",?1?); float?fEndY?=?dGetSpriteLinkPointPosY(?"GoldHook",?1?); //?在這兩點之間劃線.線的顏色紅綠藍值都為50,即灰色 dDrawLine(?fStartX,?fStartY,?fEndX,?fEndY,?2.f,?0,?50,?50,?50,?255?);}