基本信息
源码名称:黄金矿工(funcode项目源码)
源码大小:2.71M
文件格式:.zip
开发语言:C/C++
更新时间:2020-04-18
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 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 );
}