基本信息
源码名称:黄金矿工(funcode项目源码)
源码大小:2.71M
文件格式:.zip
开发语言:C/C++
更新时间:2020-04-18
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
用funcode平台进行矿工抓取黄金小游戏的制作,玩家通过键盘的按键控制矿工抓取金块,将钩子碰触到的金块抓取过来。
压缩包中包括源代码和游戏文件,可以用funcode打开。
///////////////////////////////////////////////////////////////////////////////// // // // // ///////////////////////////////////////////////////////////////////////////////// #include <Stdio.h> #include "CommonAPI.h" #include "LessonX.h" //////////////////////////////////////////////////////////////////////////////// // // 游戏状态,0 -- 游戏结束等待开始状态; // 1 -- 按下空格键开始,初始化游戏;2 -- 游戏进行中 int g_iGameState = 0; // 抓取金子状态:0 -- 等待按键开始抓金子;1 -- 钩子伸出去 // 2 -- 钩子往回伸,未抓到东西;3 -- 钩子往回伸,带着金子 int g_iGetGoldState; float g_fHookStartPosX, g_fHookStartPosY; // 钩子初始位置,用于钩子回拉 // 钩子当前是往左摆动还是往右摆动( 1 右-左, 0 左-右 ) int g_iHookRotToLeft; float g_fHookRotation; // 钩子当前转动的朝向 char g_szCurGetGold[64]; // 当前抓取到的金子名字 float g_fEmptyHookSpeed; // 空钩子的移动速度 int g_iGoldCount; // 本局生成的金子数量,为0时本局结束 //金子能出现在地图上的上下左右边界最大值和最小值 int g_iGoldBornMinX, g_iGoldBornMaxX, g_iGoldBornMinY, g_iGoldBornMaxY; // void GameInit(); void GameRun( float fDeltaTime ); void GameEnd(); void DrawHookLine(); //============================================================================== // // 大体的程序流程为:GameMainLoop函数为主循环函数,在引擎每帧刷新屏幕图像之后,都会被调用一次。 //============================================================================== // // 游戏主循环,此函数将被不停的调用,引擎每刷新一次屏幕,此函数即被调用一次 // 用以处理游戏的开始、进行中、结束等各种状态. // 函数参数fDeltaTime : 上次调用本函数到此次调用本函数的时间间隔,单位:秒 void GameMainLoop( float fDeltaTime ) { switch( g_iGameState ) { // 初始化游戏,清空上一局相关数据 case 1: { GameInit(); g_iGameState = 2; // 初始化之后,将游戏状态设置为进行中 } break; // 游戏进行中,处理各种游戏逻辑 case 2: { // TODO 修改此处游戏循环条件,完成正确游戏逻辑 if( g_iGoldCount>0) { GameRun( fDeltaTime ); } else { // 游戏结束。调用游戏结算函数,并把游戏状态修改为结束状态 g_iGameState = 0; GameEnd(); } } break; // 游戏结束/等待按空格键开始 case 0: default: break; } DrawHookLine(); } //============================================================================== // // 每局开始前进行初始化,清空上一局相关数据 void GameInit() { dSetSpriteVisible("GameBegin", 0); g_iGetGoldState = 0; g_fHookRotation = 0; // 初始时钩子角度为0 g_iHookRotToLeft = 1; // 初始时钩子向左转 g_fEmptyHookSpeed = 15.f; // 空钩子的移动速度 g_iGoldCount = 20; //每局20块金子 // 金子出现的边界范围 g_iGoldBornMinX = dGetScreenLeft() 5; g_iGoldBornMaxX = dGetScreenRight() - 5; g_iGoldBornMinY = dGetScreenTop() 20; g_iGoldBornMaxY = dGetScreenBottom() - 5; // 钩子初始化位置 g_fHookStartPosX = dGetSpritePositionX( "goldhook" ); g_fHookStartPosY = dGetSpritePositionY( "goldhook" ); // 复制金块 int i = 0; char *szName = NULL; //第i个金子的名字 int iSize = 4, iPosX = 0, iPosY = 0; //第i个金子的大小和位置 for( i= 0; i< g_iGoldCount; i ) { if( i< 10 ) iSize = 4; else if( i>= 10 && i< 16 ) iSize = 6; else iSize = 8; szName = dMakeSpriteName( "GoldBlock", i); dCloneSprite( "GoldTemplate", szName ); dSetSpriteWidth( szName, (float)iSize ); dSetSpriteHeight( szName, (float)iSize ); // 随机位置 iPosX = dRandomRange( g_iGoldBornMinX, g_iGoldBornMaxX ); iPosY = dRandomRange( g_iGoldBornMinY, g_iGoldBornMaxY ); dSetSpritePosition( szName, (float)iPosX, (float)iPosY ); } } // 每局游戏进行中 void GameRun( float fDeltaTime ) { if( 0 == g_iGetGoldState ) { // 摇摆速度,单位 度/秒 const float fRotateSpeed = 45.f; // 本次旋转的度数 float fThisRotate = fRotateSpeed * fDeltaTime; if( g_iHookRotToLeft ) { g_fHookRotation = fThisRotate; if( g_fHookRotation >= 180.f ) { g_fHookRotation = 180.f; g_iHookRotToLeft = 0; } } else { g_fHookRotation -= fThisRotate; if( g_fHookRotation <= 0.f ) { g_fHookRotation = 0.f; g_iHookRotToLeft = 1; } } dSetSpriteRotation( "GoldHook", g_fHookRotation ); } else if( 2 == g_iGetGoldState || 3 == g_iGetGoldState ) // 回拉状态时 { // 获取钩子的当前速度 float fSpeedX = dGetSpriteLinearVelocityX( "goldhook" ); float fSpeedY = dGetSpriteLinearVelocityY( "goldhook" ); // 当前速度不为0,还在运动中:返回 if( fSpeedX > 0.00001f || fSpeedX < -0.00001f || fSpeedY > 0.00001f || fSpeedY < -0.00001f ) return; // 速度为0,钩子回到初始点 if( 3 == g_iGetGoldState ) // 带金子返回时 { dSpriteDismount( g_szCurGetGold ); // 解绑金子 dDeleteSprite( g_szCurGetGold ); // 删除金子 g_iGoldCount--; // 将金子数量减1 } } // 恢复等待状态与播放等待动作 g_iGetGoldState = 0; dAnimateSpritePlayAnimation( "goldMan", "GolderManAnimation2", 0 ); } } //============================================================================== // // 本局游戏结束 void GameEnd() { dSetSpriteVisible( "GameBegin", 1 ); } //========================================================================== // // 鼠标移动 // 参数 fMouseX, fMouseY:为鼠标当前坐标 void OnKeyDown( const int iKey, const bool bAltPress, const bool bShiftPress, const bool bCtrlPress ) { if( KEY_SPACE == iKey && 0 == g_iGameState ) { g_iGameState = 1; dSetSpriteVisible("GameBegin",0); } else if( KEY_DOWN == iKey && g_iGameState==2 && g_iGetGoldState==0 ) { g_iGetGoldState = 1; // 钩子抓取状态为1:钩子往外伸 g_fHookRotation = dGetSpriteRotation("goldhook"); // 钩子的当前朝向 dSetSpriteLinearVelocityPolar("goldhook", g_fEmptyHookSpeed, g_fHookRotation); // 播放挖金者的动作(胳膊往下压) dAnimateSpritePlayAnimation( "goldMan", "GolderManAnimation1", 0 ); } } //========================================================================== // // 引擎捕捉鼠标移动消息后,将调用到本函数 // 参数 fMouseX, fMouseY:为鼠标当前坐标 // void dOnMouseMove( const float fMouseX, const float fMouseY ) { } //========================================================================== // // 引擎捕捉鼠标点击消息后,将调用到本函数 // 参数 iMouseType:鼠标按键值,见 enum MouseTypes 定义 // 参数 fMouseX, fMouseY:为鼠标当前坐标 // void dOnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY ) { } //========================================================================== // // 引擎捕捉鼠标弹起消息后,将调用到本函数 // 参数 iMouseType:鼠标按键值,见 enum MouseTypes 定义 // 参数 fMouseX, fMouseY:为鼠标当前坐标 // void dOnMouseUp( const int iMouseType, const float fMouseX, const float fMouseY ) { // 可以在此添加游戏需要的响应函数 } //========================================================================== // // 引擎捕捉键盘按下消息后,将调用到本函数 // 参数 iKey:被按下的键,值见 enum KeyCodes 宏定义 // 参数 iAltPress, iShiftPress,iCtrlPress:键盘上的功能键Alt,Ctrl,Shift当前是否也处于按下状态(0未按下,1按下) // //========================================================================== // // 键盘弹起 // 参数 iKey:弹起的键,值见 enum KeyCodes 宏定义 void OnKeyUp( const int iKey ) { } //=========================================================================== // // 精灵与精灵碰撞 // 参数 szSrcName:发起碰撞的精灵名字 // 参数 szTarName:被碰撞的精灵名字 void OnSpriteColSprite( const char *szSrcName, const char *szTarName ) { if( g_iGameState==2 && g_iGetGoldState==1 ) //游戏运行状态下、钩子已伸出时 if( strcmp( szSrcName,"goldhook")==0 && strstr(szTarName,"GoldBlock")!=0 ) { // 设置抓取状态为:钩子往回收,抓取到东西。记录金子名字 g_iGetGoldState = 3; // 被抓到金子的名字存入g_szCurGetGold中 strcpy( g_szCurGetGold, szTarName ); // 将金子挂接到钩子的2号挂接点上 dSpriteMountToSpriteLinkPoint( g_szCurGetGold, "goldhook", 2 ); // 根据金子大小,计算钩子的往回收的速度,越大的越慢 float fWidth = dGetSpriteWidth( g_szCurGetGold ); float fSpeed = ((10.f - fWidth) / 10.f) * g_fEmptyHookSpeed; // 钩子往初始位置移动 dSpriteMoveTo( "goldhook", g_fHookStartPosX, g_fHookStartPosY, fSpeed, 1 ); // 播放挖金者的动作(胳膊来回动的动作) dAnimateSpritePlayAnimation( "goldMan", "GolderManAnimation3", 0 ); } } //=========================================================================== // // 精灵与世界边界碰撞 // 参数 szName:碰撞到边界的精灵名字 // 参数 iColSide:碰撞到的边界 0 左边,1 右边,2 上边,3 下边 void OnSpriteColWorldLimit( const char *szName, const int iColSide ) { // 判断是否是钩子碰到边界,往回收 if( strcmp(szName, "goldhook")==0 && g_iGetGoldState==1 ) { // 设置抓取状态为:钩子往回收,未抓取到东西 g_iGetGoldState = 2; // 钩子往初始位置移动 dSpriteMoveTo( "goldhook",g_fHookStartPosX,g_fHookStartPosY,g_fEmptyHookSpeed,1 ); // 播放挖金子动作 dAnimateSpritePlayAnimation( "goldMan", "GolderManAnimation3", 0 ); } } void DrawHookLine() { //绳子的起始点:缆绳链接点 float fStartX = dGetSpriteLinkPointPosX( "goldMan", 0 ); float fStartY = dGetSpriteLinkPointPosY( "goldMan", 0 ); // 绳子终点:钩子的链接点 float fEndX = dGetSpriteLinkPointPosX( "goldhook", 0 ); float fEndY = dGetSpriteLinkPointPosY( "goldhook", 0 ); // 两点之间划线 dDrawLine( fStartX, fStartY, fEndX, fEndY, 2.f, 0, 50, 50, 50, 255 ); }