📄 ball.c
字号:
#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 + -