在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例C/C++游戏开发 → 黄金矿工(funcode项目源码)

黄金矿工(funcode项目源码)

C/C++游戏开发

下载此实例
  • 开发语言:C/C++
  • 实例大小:2.71M
  • 下载次数:16
  • 浏览次数:428
  • 发布时间:2020-04-18
  • 实例类别:C/C++游戏开发
  • 发 布 人:sherlocklxy
  • 文件格式:.zip
  • 所需积分:2
 相关标签: 黄金矿工

实例介绍

【实例简介】

用funcode平台进行矿工抓取黄金小游戏的制作,玩家通过键盘的按键控制矿工抓取金块,将钩子碰触到的金块抓取过来。

压缩包中包括源代码和游戏文件,可以用funcode打开。

【实例截图】from clipboard

from clipboard

【核心代码】

/////////////////////////////////////////////////////////////////////////////////
//
//
//
//
/////////////////////////////////////////////////////////////////////////////////
#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 );
}

标签: 黄金矿工

实例下载地址

黄金矿工(funcode项目源码)

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警