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

📄 ball.c

📁 手机8032的完整代码。吐血推荐。小做改动就可以生产。
💻 C
📖 第 1 页 / 共 2 页
字号:

#define _BALL_C_

#pragma NOAREGS

#include "general.h"
#include "osdshow.h"

#ifdef  OSD_GAME_BREAKOUT
///////////////////////////////////////////////////////////////////////////////

extern void DRS232LogS(char *pcStr);
extern void DRS232LogB(BYTE bV1, BYTE bV2, BYTE bV3, BYTE bV4);

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

static void vGameBallVarInit(void) large
{
  _bGameState = 0;
  _bGameSubState = 0;
  _bGameItem = 0;
  _bGameGrade = 0;
#ifdef OSD_GAME_SOUND
  _bGameSndTimer = 0;
  _bGameSndId = 0xFF;
#endif
}


static void vGameBallNewTurnInit(void) large
{
  WORD wRandomPosi;

  wRandomPosi = (TL0 + TL1 + TL2) % (GM_BALL_MAX_WIDTH - rBmpSize[GetBmpSizeId(BAR)].width + 8);

  if((wRandomPosi % 2) == 0)
  {
    _bOrenx = BALL_LEFT;
    _bOreny = BALL_UP;    // initial the ball orentation
  }
  else
  {
    _bOrenx = BALL_RIGHT;
    _bOreny = BALL_UP;    // initial the ball orentation
  }

  wRandomPosi >>= 3;
  wRandomPosi <<= 3;

  _NowBarPos.x = wRandomPosi;  //initial the bar
  _NowBarPos.y = GM_BALL_MAX_HEIGHT - rBmpSize[GetBmpSizeId(BAR)].height;

  _NowBallPos.x = wRandomPosi + (rBmpSize[GetBmpSizeId(BAR)].width - rBmpSize[GetBmpSizeId(BALL)].width) / 2;
  _NowBallPos.y = GM_BALL_MAX_HEIGHT - rBmpSize[GetBmpSizeId(BAR)].height - rBmpSize[GetBmpSizeId(BALL)].height;
  
  _fgGmBallEnb = FALSE;
  _fgGmBallButton = FALSE;
  _bGmBallTimer = 0;
  _bBallMinute = 0;
  _bBallSecond = 0;
  _bBall20Ms = 0;
  _bBallSpeed = 0;
  _wBallScore = 0;
}


static void vGameBallShowInit(void) large
{
  vOsdSetSt(OSD_ST_BURST);
  
  vCreateWB(WB_OSD_GAME, TRUE);

  vSetWBTcColor(WB_OSD_GAME);

  vSetTransEn(WB_OSD_GAME, 0);

  vBallShowInfo(BALL_INFO_ALL1);

  vHiliBallMenuItem(_bGameItem, ITEM_HILI);

  vEnableWB(WB_OSD_GAME);
}


static void vGameBallOsdRecover(void) large
{
  vClrGameWorkArea();

  vGameBallDrawBmp(BALL_BMP, _NowBallPos.x, _NowBallPos.y);

  vDrawBlockMap(); // initial the blockmap bmp

  vGameBallDrawBmp(BAR_BMP, _NowBarPos.x, _NowBarPos.y);

  _fgGmBallEnb = TRUE;
}


static BOOL fgJudgeShotAll(void) large
{
  BYTE i;

  for (i = 0; i < BLOCK_MAP_MAX_WIDTH; i++)
  {
    if (bSharedInfo(SI_BALL_SHOT_FG_START + i) != 0)
    {
      return FALSE;
    }
  }

  return TRUE;
}


static BOOL fgValidRange(BYTE x, BYTE y) large
{
  if ( (x < BLOCK_MAP_MAX_WIDTH) && (y < BLOCK_MAP_MAX_HEIGHT) )
  {
    return TRUE;
  }
  else
  {
    return FALSE;
  }
}


static void vJudgeSpeed(WORD wScore, BYTE fgHitRed) large
{
  BYTE bSpeedBuf;
  BYTE bSpeedTmp;
  
  if (wScore >= 12)
  {
    bSpeedBuf = 4;
  }
  else if(wScore >= 4)
  {
    bSpeedBuf = 2;
  }
  else
  {
    bSpeedBuf = 0;
  }
  bSpeedTmp = _bBallSpeed;
  if (fgHitRed)
  {
    bSpeedTmp++;
  }
  bSpeedTmp %= 2;
  _bBallSpeed = bSpeedBuf + bSpeedTmp;
}


static void vShotBlockLeft(void) large
{
  BYTE bCoorX, bCoorY;
  BYTE fgHitRedBlock = FALSE;
  
  bCoorX = GetBlockXcoor(_NowBallPos.x);
  bCoorY = GetBlockYcoor(_NowBallPos.y);
  if (fgGetBlockfg(bCoorX, bCoorY) && fgValidRange(bCoorX, bCoorY))
  {
    vClearBlock(bCoorX, bCoorY);
    _wBallScore++;
    if (rBlockMap[_bGameGrade].BlockMapData[bCoorY][bCoorX].bBmpId == RED_BLOCK)
    {
      fgHitRedBlock = TRUE;
    }
  }
  bCoorX = GetBlockXcoor(_NowBallPos.x);
  bCoorY = GetBlockYcoor(_NowBallPos.y + rBmpSize[GetBmpSizeId(BALL)].height);
  if (fgGetBlockfg(bCoorX, bCoorY) && fgValidRange(bCoorX, bCoorY))
  {
    vClearBlock(bCoorX, bCoorY);
    _wBallScore++;
    if (rBlockMap[_bGameGrade].BlockMapData[bCoorY][bCoorX].bBmpId == RED_BLOCK)
    {
      fgHitRedBlock = TRUE;
    }
  }
  _fgGmBallButton = TRUE;
  vBallShowInfo(BALL_INFO_SCORE);
  vJudgeSpeed(_wBallScore, fgHitRedBlock);
}


static void vShotBlockRight(void) large
{
  BYTE bCoorX, bCoorY;
  BYTE fgHitRedBlock = FALSE;
  
  bCoorX = GetBlockXcoor(_NowBallPos.x + rBmpSize[GetBmpSizeId(BALL)].width);
  bCoorY = GetBlockYcoor(_NowBallPos.y);
  if (fgGetBlockfg(bCoorX, bCoorY) && fgValidRange(bCoorX, bCoorY))
  {
    vClearBlock(bCoorX, bCoorY);
    _wBallScore++;
    if (rBlockMap[_bGameGrade].BlockMapData[bCoorY][bCoorX].bBmpId == RED_BLOCK)
    {
      fgHitRedBlock = TRUE;
    }
  }
  bCoorX = GetBlockXcoor(_NowBallPos.x + rBmpSize[GetBmpSizeId(BALL)].width);
  bCoorY = GetBlockYcoor(_NowBallPos.y + rBmpSize[GetBmpSizeId(BALL)].height);
  if (fgGetBlockfg(bCoorX, bCoorY) && fgValidRange(bCoorX, bCoorY))
  {
    vClearBlock(bCoorX, bCoorY);
    _wBallScore++;
    if (rBlockMap[_bGameGrade].BlockMapData[bCoorY][bCoorX].bBmpId == RED_BLOCK)
    {
      fgHitRedBlock = TRUE;
    }
  }
  _fgGmBallButton = TRUE;
  vBallShowInfo(BALL_INFO_SCORE);
  vJudgeSpeed(_wBallScore, fgHitRedBlock);
}


static void vShotBlockUp(void) large
{
  BYTE bCoorX, bCoorY;
  BYTE fgHitRedBlock = FALSE;
  
  bCoorX = GetBlockXcoor(_NowBallPos.x);
  bCoorY = GetBlockYcoor(_NowBallPos.y);
  if (fgGetBlockfg(bCoorX, bCoorY) && fgValidRange(bCoorX, bCoorY))
  {
    vClearBlock(bCoorX, bCoorY);
    _wBallScore++;
    if (rBlockMap[_bGameGrade].BlockMapData[bCoorY][bCoorX].bBmpId == RED_BLOCK)
    {
      fgHitRedBlock = TRUE;
    }
  }
  bCoorX = GetBlockXcoor(_NowBallPos.x + rBmpSize[GetBmpSizeId(BALL)].width);
  bCoorY = GetBlockYcoor(_NowBallPos.y);
  if ( fgGetBlockfg(bCoorX, bCoorY) && fgValidRange(bCoorX, bCoorY) )
  {
    vClearBlock(bCoorX, bCoorY);
    _wBallScore++;
    if (rBlockMap[_bGameGrade].BlockMapData[bCoorY][bCoorX].bBmpId == RED_BLOCK)
    {
      fgHitRedBlock = TRUE;
    }
  }
  _fgGmBallButton = TRUE;
  vBallShowInfo(BALL_INFO_SCORE);
  vJudgeSpeed(_wBallScore, fgHitRedBlock);
}


static void vShotBlockDown(void) large
{
  BYTE bCoorX, bCoorY;
  BYTE fgHitRedBlock = FALSE;
  
  bCoorX = GetBlockXcoor(_NowBallPos.x);
  bCoorY = GetBlockYcoor(_NowBallPos.y + rBmpSize[GetBmpSizeId(BALL)].height);
  if ( fgGetBlockfg(bCoorX, bCoorY) && fgValidRange(bCoorX, bCoorY) )
  {
    vClearBlock(bCoorX, bCoorY);
    _wBallScore++;
    if (rBlockMap[_bGameGrade].BlockMapData[bCoorY][bCoorX].bBmpId == RED_BLOCK)
    {
      fgHitRedBlock = TRUE;
    }
  }
  bCoorX = GetBlockXcoor(_NowBallPos.x + rBmpSize[GetBmpSizeId(BALL)].width);
  bCoorY = GetBlockYcoor(_NowBallPos.y + rBmpSize[GetBmpSizeId(BALL)].height);
  if ( fgGetBlockfg(bCoorX, bCoorY) && fgValidRange(bCoorX, bCoorY) )
  {
    vClearBlock(bCoorX, bCoorY);
    _wBallScore++;
    if (rBlockMap[_bGameGrade].BlockMapData[bCoorY][bCoorX].bBmpId == RED_BLOCK)
    {
      fgHitRedBlock = TRUE;
    }
  }
  _fgGmBallButton = TRUE;
  vBallShowInfo(BALL_INFO_SCORE);
  vJudgeSpeed(_wBallScore, fgHitRedBlock);
}


static BOOL fgBetweenBlockX(WORD bx) large
{
  BYTE bXcoor;
  
  bXcoor = GetBlockXcoor(bx);

  if (GetBlockXpos(BLOCK_MAP_MAX_WIDTH) < bx)
  {
    return FALSE;
  }
  else if ( (GetBlockXpos(bXcoor) <= bx) && (GetBlockXpos(bXcoor + 1) > bx) )
  {
    return TRUE;
  }
  else
  {
    return FALSE;
  }
}


static BOOL fgBetweenBlockY(WORD by) large
{
  BYTE bYcoor;

  bYcoor = GetBlockYcoor(by);

  if(GetBlockYpos(BLOCK_MAP_MAX_HEIGHT) < by)
  {
    return FALSE;
  }
  else if ( (GetBlockYpos(bYcoor) <= by) && (GetBlockYpos(bYcoor + 1) > by) )
  {
    return TRUE;
  }
  else
  {
    return FALSE;
  }
}


static void vfgJudgeLeft(void) large
{
  // _NowBallPos.x -= BALL_X_STEP;  // change the x pos to left
  _NowBallPos.x -= _sGmBallSpeed[_bBallSpeed].bBallXStep;
  if ((_NowBallPos.x == 0) || (_NowBallPos.x > 0xf000))   // judge the x left
  {
    _NowBallPos.x = 0;
    _bOrenx = BALL_RIGHT;
  #if  0  // #ifdef OSD_GAME_SOUND
    vGameDelayMs(10);
    vSendUopCmd(UOP_AUDIO_CLIP, SV_ACLIP_FLASH, CLIP_HITWALL, 0);
    _bGameSndId = 0xFF;
    _bGameSndTimer = 15;
  #endif
  }
  // the ball height is in the range of blocks
  else if (GetBlockYcoor(_NowBallPos.y) < rBlockMap[_bGameGrade].HeightNum)
  {
    if ( fgBetweenBlockX(_NowBallPos.x)
      && ( fgGetBlockfgPosi(_NowBallPos.x, _NowBallPos.y) 
        || fgGetBlockfgPosi(_NowBallPos.x, _NowBallPos.y + rBmpSize[GetBmpSizeId(BALL)].height) ) )
    {
      vShotBlockLeft();
      _bOrenx = BALL_RIGHT;
    #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 vfgJudgeRight(void) large
{
  // _NowBallPos.x += BALL_X_STEP;
  _NowBallPos.x += _sGmBallSpeed[_bBallSpeed].bBallXStep;
  if ( _NowBallPos.x + rBmpSize[GetBmpSizeId(BALL)].width >= GM_BALL_MAX_WIDTH)
  {
    _NowBallPos.x = GM_BALL_MAX_WIDTH - rBmpSize[GetBmpSizeId(BALL)].width;
    _bOrenx = BALL_LEFT;
  #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 ( fgBetweenBlockX(_NowBallPos.x + rBmpSize[GetBmpSizeId(BALL)].width)
      && ( fgGetBlockfgPosi(_NowBallPos.x + rBmpSize[GetBmpSizeId(BALL)].width, _NowBallPos.y)
        || fgGetBlockfgPosi(_NowBallPos.x + rBmpSize[GetBmpSizeId(BALL)].width, _NowBallPos.y + rBmpSize[GetBmpSizeId(BALL)].height) ) )
    {
      vShotBlockRight();
      _bOrenx = BALL_LEFT;
    #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 vJudgeballx(void) large
{
  switch(_bOrenx)
  {
    case  BALL_LEFT:
      vfgJudgeLeft();
      break;
    case BALL_RIGHT:
      vfgJudgeRight();
      break;
    default:
      break;
  }
}


static void vfgJudgeDown(void) large
{
  // _NowBallPos.y += BALL_Y_STEP;
  _NowBallPos.y += _sGmBallSpeed[_bBallSpeed].bBallYStep;
  if (_NowBallPos.y + rBmpSize[GetBmpSizeId(BALL)].height >= GM_BALL_MAX_HEIGHT)
  {
    // ShowMessage("game is over");
    _fgGmBallEnb = FALSE;
    _NowBallPos.y = 0;
    vChgGameState(BALL_DIALOG_STATE);
    vChgGameSubState(BALL_DIALOG_AGAIN_STATE);
    vBallShowDialog();
  #ifdef OSD_GAME_SOUND
    vGameDelayMs(10);
    vSendUopCmd(UOP_AUDIO_CLIP, SV_ACLIP_FLASH, CLIP_LOSE, 0);
    _bGameSndId = 0xFF;
    _bGameSndTimer = 75;
  #endif
  }
  // if ball is in the down block range and the block is  null block
  else if (GetBlockYcoor(_NowBallPos.y) < rBlockMap[_bGameGrade].HeightNum)
  {
    if ( fgBetweenBlockY(_NowBallPos.y + rBmpSize[GetBmpSizeId(BALL)].height)
      && ( fgGetBlockfgPosi(_NowBallPos.x, _NowBallPos.y + rBmpSize[GetBmpSizeId(BALL)].height)
        || fgGetBlockfgPosi(_NowBallPos.x + rBmpSize[GetBmpSizeId(BALL)].width, _NowBallPos.y + rBmpSize[GetBmpSizeId(BALL)].height)) )
    {
      vShotBlockDown();
      _bOreny = BALL_UP;
    #if  0  // #ifdef OSD_GAME_SOUND
      vGameDelayMs(10);
      vSendUopCmd(UOP_AUDIO_CLIP, SV_ACLIP_FLASH, CLIP_HITBRICK, 0);
      _bGameSndId = 0xFF;
      _bGameSndTimer = 15;
    #endif
    }
  }
  else if ( ( (_NowBallPos.x > _NowBarPos.x) && (_NowBallPos.x < _NowBarPos.x + rBmpSize[GetBmpSizeId(BAR)].width))//the down is bar
         || ( (_NowBallPos.x + rBmpSize[GetBmpSizeId(BALL)].width > _NowBarPos.x)
           && (_NowBallPos.x + rBmpSize[GetBmpSizeId(BALL)].width < _NowBarPos.x + rBmpSize[GetBmpSizeId(BAR)].width) )
  )  // the ball x is in the bar range
  {
    if ( (_NowBallPos.y + rBmpSize[GetBmpSizeId(BALL)].height >= _NowBarPos.y)
      && (_NowBallPos.y + rBmpSize[GetBmpSizeId(BALL)].height < _NowBarPos.y + rBmpSize[GetBmpSizeId(BAR)].height)
    ) // the ball max y is in the range of the bar height
    {
      _NowBallPos.y = _NowBarPos.y - rBmpSize[GetBmpSizeId(BALL)].height;
      _bOreny = BALL_UP;
    #if  0  // #ifdef OSD_GAME_SOUND
      vGameDelayMs(10);
      vSendUopCmd(UOP_AUDIO_CLIP, SV_ACLIP_FLASH, CLIP_HITPADLE, 0);
      _bGameSndId = 0xFF;
      _bGameSndTimer = 15;
    #endif
    }
    else if ( (_NowBallPos.y >= _NowBarPos.y)
           && (_NowBallPos.y < _NowBarPos.y + rBmpSize[GetBmpSizeId(BAR)].height)
    )
    {
      _NowBallPos.y = _NowBarPos.y + rBmpSize[GetBmpSizeId(BAR)].height;
    }
  }
}


static void vfgJudgeUp(void) large
{
  // _NowBallPos.y -= BALL_Y_STEP;
  _NowBallPos.y -= _sGmBallSpeed[_bBallSpeed].bBallYStep;
  if ( ( _NowBallPos.y == 0) || ( _NowBallPos.y > 0xf000) )
  {
    _NowBallPos.y = 0;
    _bOreny = BALL_DOWN;

⌨️ 快捷键说明

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