⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ball.c

📁 手机8032的完整代码。吐血推荐。小做改动就可以生产。
💻 C
📖 第 1 页 / 共 2 页
字号:
  #if  0  // #ifdef OSD_GAME_SOUND
    vGameDelayMs(10);
    vSendUopCmd(UOP_AUDIO_CLIP, SV_ACLIP_FLASH, CLIP_HITWALL, 0);
    _bGameSndId = 0xFF;
    _bGameSndTimer = 15;
  #endif
  }
  else if (GetBlockYcoor(_NowBallPos.y) < rBlockMap[_bGameGrade].HeightNum)
  {
    if ( fgBetweenBlockY(_NowBallPos.y)
      && ( fgGetBlockfgPosi(_NowBallPos.x, _NowBallPos.y) 
        || fgGetBlockfgPosi(_NowBallPos.x + rBmpSize[GetBmpSizeId(BALL)].width, _NowBallPos.y)) )
    {
      vShotBlockUp();
      _bOreny = BALL_DOWN;
    #if  0  // #ifdef OSD_GAME_SOUND
      vGameDelayMs(10);
      vSendUopCmd(UOP_AUDIO_CLIP, SV_ACLIP_FLASH, CLIP_HITBRICK, 0);
      _bGameSndId = 0xFF;
      _bGameSndTimer = 15;
    #endif
    }
  }
}


static void vJudgebally(void) large
{
  switch(_bOreny)
  {
    case BALL_DOWN:
      vfgJudgeDown();
      break;
    case BALL_UP:
      vfgJudgeUp();
      break;
  }
}


static void  vBallMachine(void) large
{
  vGameBallDrawBmp(BALL_EMPTY_BMP, _NowBallPos.x, _NowBallPos.y); // clear the ball
  // judge the blocks are all shot
  vJudgeballx();  // change the ball x postion an x orentation
  vJudgebally();  // change the ball y postion an y orentation

  // vShotBlockx();  // the ball is drawn first then clear the ball
  // vShotBlocky();  // the clear will break the bar
  if (fgJudgeShotAll())
  {
    // ShowMessage("congratulations!");
    _fgGmBallEnb = FALSE;
    vChgGameState(BALL_DIALOG_STATE);
    vChgGameSubState(BALL_DIALOG_NEXT_STATE);
    vBallShowDialog();
  #ifdef OSD_GAME_SOUND
    vGameDelayMs(10);
    vSendUopCmd(UOP_AUDIO_CLIP, SV_ACLIP_FLASH, CLIP_WIN, 0);
    _bGameSndId = 0xFF;
    _bGameSndTimer = 75;
  #endif
  }
  else if(_fgGmBallEnb)
  {
    vGameBallDrawBmp(BALL_BMP, _NowBallPos.x, _NowBallPos.y);  // draw the ball
  }
}


static BOOL fgBallMenuState(void) large
{
  BOOL fgRet = TRUE;

  switch (_bIRKey)
  {
    case IR_UP:
    {
      if (_bGameItem < BALL_MENU_MAX)
      {
        vHiliBallMenuItem(_bGameItem, FALSE);
        _bGameItem++;
        vHiliBallMenuItem(_bGameItem, ITEM_HILI);
      }
      break;
    }
    case IR_DOWN:
    {
      if (_bGameItem > 0)
      {
        vHiliBallMenuItem(_bGameItem, FALSE);
        _bGameItem--;
        vHiliBallMenuItem(_bGameItem, ITEM_HILI);
      }
      break;
    }
    case IR_LEFT:
    case IR_PREV:
    {
      if ((BALL_MENU_GRADE == _bGameItem) && (_bGameGrade > 0))
      {
        _bGameGrade--;
        vHiliBallMenuItem(_bGameItem, TRUE);
      }
      break;
    }
    case IR_RIGHT:
    case IR_NEXT:
    {
      if ((BALL_MENU_GRADE == _bGameItem) && (_bGameGrade < GAME_BALL_GRADE_MAX))
      {
        _bGameGrade++;
        vHiliBallMenuItem(_bGameItem, TRUE);
      }
      break;
    }
    case IR_PLAY:
    case IR_ENTER:
    case IR_PLAY_ENTER:
    {
      switch (_bGameItem)
      {
        case BALL_MENU_START:
        {
          vChgGameState(BALL_PLAY_STATE);
          vBallShowInfo(BALL_INFO_ALL2);
          vGameBallNewTurnInit();
          vGameBallOsdRecover();
        #ifdef OSD_GAME_SOUND
          vGameDelayMs(10);
          vSendUopCmd(UOP_AUDIO_CLIP, SV_ACLIP_FLASH, CLIP_START, 0);
          _bGameSndId = 0xFF;
          _bGameSndTimer = 75;
        #endif
          break;
        }
        case BALL_MENU_GRADE:
        {
          break;
        }
        default:
        {
          break;
        }
      }
      break;
    }
    case IR_TITLE_MENU:
    case IR_ROOT_MENU:
    {
    #ifdef OSD_GAME_MAIN_MENU
      vChangeInputState(INPUT_STATE_OSD_GAME_MAIN_MENU, FALSE);
    #endif
      break;
    }
    default:
    {
      break;
    }
  }

  return fgRet;
}


static BOOL fgBallPlayState(void) large
{
  BOOL fgRet = TRUE;

  switch (_bIRKey)
  {
    case IR_LEFT:
    {
      if (_fgGmBallEnb)
      {
        vGameBallDrawBmp(BAR_EMPTY_BMP, _NowBarPos.x, _NowBarPos.y);
        // _NowBarPos.x -= BAR_X_STEP;
        _NowBarPos.x -= _sGmBallSpeed[_bBallSpeed].bBarXStep;
        if (_NowBarPos.x > 0xf000)
        {
          _NowBarPos.x = 0;
        }
        vGameBallDrawBmp(BAR_BMP, _NowBarPos.x, _NowBarPos.y);
      }
      break;
    }
    case IR_RIGHT:
    {
      if (_fgGmBallEnb)
      {
        vGameBallDrawBmp(BAR_EMPTY_BMP, _NowBarPos.x, _NowBarPos.y);
        // _NowBarPos.x += BAR_X_STEP;
        _NowBarPos.x += _sGmBallSpeed[_bBallSpeed].bBarXStep;
        if (_NowBarPos.x + rBmpSize[GetBmpSizeId(BAR)].width > GM_BALL_MAX_WIDTH)
        {
          _NowBarPos.x = GM_BALL_MAX_WIDTH - rBmpSize[GetBmpSizeId(BAR)].width;
        }
        vGameBallDrawBmp(BAR_BMP, _NowBarPos.x, _NowBarPos.y); 
      }
      break;
    }
    case IR_PAUSE:
    case IR_PLAY_PAUSE:
    {
      if(_fgGmBallEnb)
      {
        _fgGmBallEnb = FALSE;
        vBallShowInfo(BALL_INFO_PAUSE);
      }
      else
      {
        _fgGmBallEnb = TRUE;
        vBallShowInfo(BALL_INFO_PLAYING);
      }
      break;
    }
    case IR_PLAY:
    case IR_ENTER:
    case IR_PLAY_ENTER:
    {
      if(!_fgGmBallEnb)
      {
        _fgGmBallEnb = TRUE;
        vBallShowInfo(BALL_INFO_PLAYING);
      }
      break;
    }
    case IR_TITLE_MENU:
    {
      _fgGmBallEnb = FALSE;
      vChgGameState(BALL_MENU_STATE);
      vGameBallNewTurnInit();
      vClrGameWorkArea();
      vBallShowInfo(BALL_INFO_ALL1);
      vHiliBallMenuItem(_bGameItem, ITEM_HILI);
      break;
    }
    case IR_ROOT_MENU:
    {
    #ifdef OSD_GAME_MAIN_MENU
      vChangeInputState(INPUT_STATE_OSD_GAME_MAIN_MENU, FALSE);
    #endif
      break;
    } 
  }

  return fgRet;
}


static BOOL fgBallDialogState(void) large
{
  BOOL fgRet = TRUE;

  switch (_bIRKey)
  {
    case IR_LEFT:
    {
      if (_bGameItem > 0)
      {
        vHiliBallDialogItem(_bGameItem, FALSE);
        _bGameItem--;
        vHiliBallDialogItem(_bGameItem, TRUE);
      }
      break;
    }
    case IR_RIGHT:
    {
      if (_bGameItem < 1)
      {
        vHiliBallDialogItem(_bGameItem, FALSE);
        _bGameItem++;
        vHiliBallDialogItem(_bGameItem, TRUE);
      }
      break;
    }
    case IR_PLAY:
    case IR_ENTER:
    case IR_PLAY_ENTER:
    {
      if (0 == _bGameItem)
      {
        if(BALL_DIALOG_NEXT_STATE == _bGameSubState)
        {
          if (_bGameGrade < GAME_BALL_GRADE_MAX)
          {
            _bGameGrade++;
          }
          else
          {
            _bGameGrade = 0;
          }
        }
        vChgGameState(BALL_PLAY_STATE);
        vGameBallNewTurnInit();
        vGameBallOsdRecover();
        vBallShowInfo(BALL_INFO_ALL2);
      }
      else
      {
        vChgGameState(BALL_MENU_STATE);
        vGameBallNewTurnInit();
        vClrGameWorkArea();
        vBallShowInfo(BALL_INFO_ALL1);
        vHiliBallMenuItem(_bGameItem, ITEM_HILI);
      }
    }
    default:
    {
      break;
    }
  }

  return fgRet;
}

///////////////////////////////////////////////////////////////////////////////

void vSetBlockfg(BYTE i, BYTE j) large
{
  BYTE bTemp;

#if  0
  bTemp = bSharedInfo(SI_BALL_SHOT_FG_START + GetFgYcoor(i, j));
  bTemp |= (1 << (i % 8));
  vSetSharedInfo(SI_BALL_SHOT_FG_START + GetFgYcoor(i, j), bTemp);
#else
  bTemp = bSharedInfo(SI_BALL_SHOT_FG_START + i);
  bTemp |= (0x01 << (j % 8));
  vSetSharedInfo(SI_BALL_SHOT_FG_START + i, bTemp);
#endif
}


void vClrBlockfg(BYTE i, BYTE j) large
{
  BYTE bTemp;

#if 0
  bTemp = bSharedInfo(SI_BALL_SHOT_FG_START + GetFgYcoor(i, j));
  bTemp &= (~(1 << (i % 8)));
  vSetSharedInfo(SI_BALL_SHOT_FG_START + GetFgYcoor(i, j), bTemp);
#else
  bTemp = bSharedInfo(SI_BALL_SHOT_FG_START + i);
  bTemp &= (~(0x01 << (j % 8)));
  vSetSharedInfo(SI_BALL_SHOT_FG_START + i, bTemp);
#endif
}


BOOL fgGetBlockfg(BYTE i, BYTE j) large
{
  BYTE bTemp;

  if( (i < BLOCK_MAP_MAX_WIDTH) && (j < BLOCK_MAP_MAX_HEIGHT) )
  {
    bTemp = bSharedInfo(SI_BALL_SHOT_FG_START + i);
    if (bTemp & (0x01 << (j % 8)))
    {
      return TRUE;
    }
    else
    {
      return FALSE;
    }
  }
  else
  {
    return FALSE;
  }
}


BOOL fgGetBlockfgPosi(WORD bx, WORD by) large
{
  BYTE i, j;

  i = GetBlockXcoor(bx);
  j = GetBlockYcoor(by);

  return fgGetBlockfg(i, j);
}


void vGMBallTimer(void) large
{
  if ( (_bInputState == INPUT_STATE_OSD_GAME_BREAKOUT) 
       && (_bGameState == BALL_PLAY_STATE)
     #ifdef OSD_GAME_SOUND
       && (_bGameSndTimer == 0)
     #endif
       && _fgGmBallEnb )
  {
    _bBall20Ms++;
    if(_bBall20Ms >= 50)
    {
      _bBall20Ms = 0;
      _bBallSecond++;
      if(_bBallSecond >= 60)
      {
        _bBallSecond = 0;
        _bBallMinute++;
      }
      _fgGmBallButton = TRUE;
      vBallShowInfo(BALL_INFO_TIME);
    }
    // if (_bGmBallTimer < GM_BALL_TIMER_INT)
    if (_bGmBallTimer < _sGmBallSpeed[_bBallSpeed].bTimerCount)
    {
      _bGmBallTimer++;
    }
    else
    {
      vBallMachine();
      _bGmBallTimer = 0;
    }
  }
}

///////////////////////////////////////////////////////////////////////////////

void vGameBallInit(void) large
{
  vGameBallVarInit();
  vGameBallNewTurnInit();
  vGameBallShowInit();
}


BOOL fgGmBallState(void) large
{
  BOOL fgRet = TRUE;

  switch (_bIRKey)
  {
    case IR_GAME:
    {
      vGameClose();
      return TRUE;
    }
    default:
    {
      break;
    }
  }

  switch (_bGameState)
  {
    case BALL_MENU_STATE:
    {
      fgRet = fgBallMenuState();
      break;
    }
    case BALL_PLAY_STATE:
    {
      fgRet = fgBallPlayState();
      break;
    }
    case BALL_DIALOG_STATE:
    {
      fgRet = fgBallDialogState();
      break;
    }
    default:
    {
      break;
    }
  }

  _bIRKey = IR_NONE;
  return fgRet;
}


void vGmBallExit(void) large
{
  vDeleteWB(WB_OSD_GAME);
  vOsdSetSt(OSD_ST_NML);
}

///////////////////////////////////////////////////////////////////////////////
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -