有谁做过funcode的黄金矿工或者其他的
  • 浏览:4041 评论:13 人

  • //-----------------------------------------------------------------------------
    //
    //-----------------------------------------------------------------------------
    #include "CommonAPI.h"




    int g_fGoldBornMinX = 0;
    int g_fGoldBornMaxX = 0;
    int g_fGoldBornMinY = 0;
    int g_fGoldBornMaxY = 0;
    int g_iGoldCount = 0;
    float g_fHookRotation = 0.f; //钩子与地面的夹角
    int g_iGameState=0; //0-未开始 1-初始化 2-运行
    float g_fEmptyHookSpeed = 20.f;
    float g_fHookStartPosX; //存储钩子的初始X位置
    float g_fHookStartPosY; //存储钩子的初始Y位置
    char szGotGoldName[20];//当前抓到金子的名称




    int g_iGetGoldState=0; //钩子状态


    float fRotateSpeed = 40.f; // 摇摆速度,单位 度/秒
    int iHookRotToLeft = 1; //钩子摆动的方向:1 ← ;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 );
    }
    void GameInit(void)
    {
    dSetSpriteVisible("GameBegin",0);
    dSetSpriteWorldLimitMode("goldHook", WORLD_LIMIT_NULL);
    dSetTextValue("score",0);
    g_iGoldCount=15; //金子数量
    g_fGoldBornMinX = dGetScreenLeft() + 5; //金子左边界
    g_fGoldBornMaxX = dGetScreenRight() - 5; //金子右边界
    g_fGoldBornMinY = dGetScreenTop() + 20; //金子上边界
    g_fGoldBornMaxY = dGetScreenBottom() - 5; //金子下边界
    int iLoop = 0; //循环变量控制
    int iSize = 4, iPosX = 0, iPosY = 0; //iSize表示金块大小的变量
    dSetSpriteCollisionSend("goldhook", 1); //发送碰撞
    dSetSpriteCollisionReceive("redstone", 1);//接收碰撞
    dSetSpriteCollisionReceive("Rredstone", 1);//接收碰撞
    dSetSpriteCollisionReceive("wine", 1);//接收碰撞
    dSetSpriteCollisionReceive("goldTemplate", 1);//接收碰撞
    dSetSpriteVisible("goldhook",1);




    for( iLoop = 0; iLoop < g_iGoldCount; iLoop++ )
    {
    if( iLoop < 8) //生成10个小金块,大小为4
    {
    iSize = 4;
    }
    else if( iLoop >=8 && iLoop <13) //生成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);




    g_iGameState = 2;
    }
    }




    void GameRun(float fTimeDelta )
    {
    if(g_iGoldCount>0)
    {
    float fThisRotate = fRotateSpeed * fTimeDelta * 1.2; // 本次旋转的角度
    if( iHookRotToLeft )
    {
    //向左转,度数不断变大
    g_fHookRotation += fThisRotate;
    if( g_fHookRotation >= 180.f )
    {
    //大于180,置为向右转,即0
    g_fHookRotation = 180.f;
    iHookRotToLeft = 0;
    }
    }
    else
    {
    //向右转,度数不断变小
    g_fHookRotation -= fThisRotate; //小于0,置为向左转,即 1
    if( g_fHookRotation <= 0.f )
    {
    g_fHookRotation = 0.f;
    iHookRotToLeft = 1;
    }
    }
    dSetSpriteRotation("goldhook",g_fHookRotation); //设置钩子的当前角度
    }
    else
    {
    g_iGameState=0;
    }




    }




    ///////////////////////////////////////////////////////////////////////////////////////////
    //
    // 主函数入口
    //
    //////////////////////////////////////////////////////////////////////////////////////////
    int PASCAL WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow)
    {
    // 初始化游戏引擎
    if( !dInitGameEngine( hInstance, lpCmdLine ) )
    return 0;




    // 游戏初始化代码
    dSetWindowTitle("GM");




    g_fHookStartPosX=dGetSpritePositionX("goldhook");//获取钩子x坐标
    g_fHookStartPosY=dGetSpritePositionY("goldhook");//获取钩子y坐标
    // 引擎主循环,处理屏幕图像刷新等工作




    while( dEngineMainLoop() )
    {
    // 获取两次调用之间的时间差,传递给游戏逻辑处理
    float fTimeDelta=dGetTimeDelta();
    DrawHookLine();
    switch( g_iGameState )
    {
    // 初始化游戏,清空上一局相关数据
    case 1:
    {
    GameInit();
    g_iGameState=2; // 初始化之后,将游戏状态设置为进行中
    }
    break;
    // 游戏进行中,处理各种游戏逻辑
    case 2:
    {
    // 金子数量大于0的时候,继续游戏
    GameRun( fTimeDelta );
    }
    break;
    // 游戏结束/等待按空格键开始
    case 0:
    default:
    break;
    }




    // 执行游戏主循环


    };




    // 关闭游戏引擎
    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==0)
    {
    g_iGameState=1;
    }




    if( KEY_DOWN == iKey && g_iGameState == 2)
    {
    g_iGameState = 3;
    dSetSpriteLinearVelocityPolar("goldhook",g_fEmptyHookSpeed, g_fHookRotation);
    // 播放挖金者的动作(一个胳膊往下压的动作)
    dAnimateSpritePlayAnimation("goldMan","GolderManAnimation1", 0);
    //0 表示播放一次,这里胳膊往下压就是一次
    }
    else if( KEY_DOWN == iKey && 2 == g_iGameState && 0 == g_iGetGoldState )
    {
    // 设置抓取状态为:钩子往外伸
    g_iGetGoldState=1;
    // 以当前朝向给钩子一个向前的速度
    dSetSpriteLinearVelocityPolar("GoldHook",g_fEmptyHookSpeed, g_fHookRotation );
    // 播放挖金者的动作(一个胳膊往下压的动作)
    dAnimateSpritePlayAnimation( "GoldMan", "GolderManAnimation1", 0 );
    }
    // 可以在此添加游戏需要的响应函数
    }




    //==========================================================================
    //
    // 引擎捕捉键盘弹起消息后,将调用到本函数
    void dOnKeyUp( const int iKey )
    {
    // 可以在此添加游戏需要的响应函数




    }




    //===========================================================================
    //
    // 引擎捕捉到精灵与精灵碰撞之后,调用此函数
    void dOnSpriteColSprite( const char *szSrcName, const char *szTarName )
    {
    // 发起者为Goldhook,接受者含有GoldBlock字段
    if(strcmp(szSrcName,"goldhook")== 0 && strstr(szTarName,"GoldBlock")!=NULL )
    {
    dSpriteMountToSpriteLinkPoint( szTarName, "goldhook", 2 );//将金块锚定在钩子上
    dSpriteMoveTo("goldhook",g_fHookStartPosX, g_fHookStartPosY, g_fEmptyHookSpeed, 1);//使钩子向初始位置移动,即会拉
    dAnimateSpritePlayAnimation("GoldMan","GolderManAnimation3", 1 );//播放拉金块的动作
    strcpy(szGotGoldName,szTarName);//复制并保存当前抓取到金块的名称
    }
    g_iGameState = 2;
    g_iGetGoldState=1;
    if(g_iGetGoldState)
    {
    //获取钩子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(g_iGetGoldState==1)
    {
    g_iGoldCount--;
    }
    }
    dAnimateSpritePlayAnimation( "GoldMan", "GolderManAnimation2", 0 );
    }
    }




    //===========================================================================
    //
    // 引擎捕捉到精灵与世界边界碰撞之后,调用此函数.
    // 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", 1 );
    //同样设置为回拉,只是没有碰到金子
    g_iGameState = 2;
    g_iGetGoldState=2;
    }
    }




    想当年我们小学期作业就是这个,我负责剧情,搭档负责PPT和画面,找个大神帮我们改代码




    手??机??复??制????这??几??个??字??看??你??多??久??能??删??完??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????听说这个挺多经验的 ???? ??????????????? ????????? ????????? ???? ? ????? ????????? ????????? ???? ? ????? ????????? ????????? ???? ? ????? ????????? ?
       ????????? ???? ? ????? ???????????? ???? ? ???? ? ????? ???????? ???????????? ???? ? ????? ?????????????????? ???? ? ????? ????????? ????????? ???? ? ????? ????????? ????????? ???? ? ????? ???????????