📄 ufo.hpp
字号:
//*******************************************************
//* INVASION - By Maur韈io Teichmann RItter 1998 *
//* Please, respect the copyright *
//*******************************************************
// OVNI is the same thing as UFO but in portuguese
// since i磎 brazilian, i think that was better to use the "local" name
// Here a define a class for each one of the game objects (UFO, BULLET, EXTRA)
class Ovni {
private:
int x;
int y;
int mov;
int AmDown;
int inc;
int iExtra;
int iFrame;
RECT rcLastPos;
int ArgPosX;
int ArgPosY;
int iExplosionFrame;
int iQtdeDown;
int iState;
int iStr;
Ovni* Next;
public:
int iType;
DWORD dwLastShoot;
Ovni()
{
inc = 1;
x = 0;
y = 0;
AmDown = 0;
mov = 0;
iState = 0;
iExplosionFrame = 0;
dwLastShoot = 1000 + (rand() % 500);
iType = 0;
iStr = 1;
ArgPosY = 0;
ArgPosX = 0;
iQtdeDown = 80;
}
int GetStr()
{
return iStr;
}
void SetStr(int iQtde)
{
iStr = iQtde;
}
void LowStr(int iQtde)
{
iStr -= iQtde;
}
void SetQtdeDown(int iNewQtde)
{
iQtdeDown = iNewQtde;
}
int CreateExtra(int iFlags)
{
int iPercent;
iPercent = rand() % 150;
iExtra = 0;
if ((iPercent == 0 || iPercent == 25 || iPercent == 45) &&
(iFlags != 2))
iExtra = 2;
if (iPercent > 0 && iPercent < 11)
iExtra = 3;
if (iPercent > 10 && iPercent < 25)
iExtra = 1;
if (iPercent > 25 && iPercent < 45)
iExtra = 4;
if (iPercent == 45 || iPercent == 46)
iExtra = 5;
return iExtra;
}
int GetExtra()
{
return iExtra;
}
void SetAmDown(int newAmDown)
{
AmDown = newAmDown;
}
int GetAmDown(void)
{
return AmDown;
}
void SetInc(int newInc)
{
inc = newInc;
}
int GetInc(void)
{
return inc;
}
void SetMov(int newmov)
{
mov = newmov;
}
int GetMov(void)
{
return mov;
}
void SetXY(int newx, int newy)
{
x = newx;
y = newy;
rcLastPos.top = y;
rcLastPos.left = x;
rcLastPos.bottom = y + 70;
rcLastPos.right = x + 70;
if (rcLastPos.bottom > 460)
rcLastPos.bottom = 460;
if (rcLastPos.left > 640)
rcLastPos.left = 640;
}
Ovni* GetNext(void)
{
return Next;
}
void SetNext(Ovni* nxUfo)
{
Next = nxUfo;
}
int GetX(void)
{
return x;
}
int GetY(void)
{
return y;
}
void SetState(int iNewState)
{
iState = iNewState;
}
void Crash()
{
switch (iType)
{
case 0:
inc = inc * (-1);
break;
case 2:
if (mov == 1)
mov = 0;
else
mov = 1;
break;
}
}
int Move(int iFlags)
{
rcLastPos.top = y;
rcLastPos.left = x;
rcLastPos.bottom = y + 70;
rcLastPos.right = x + 70;
if (rcLastPos.bottom > 460)
rcLastPos.bottom = 460;
if (rcLastPos.right > 640)
rcLastPos.right = 640;
if (rcLastPos.left < 0)
rcLastPos.left = 0;
if (rcLastPos.top < 0)
rcLastPos.top = 0;
switch(iType)
{
case 0:
switch (mov)
{
case 0:
x += inc;
if (y > 300)
{
if (inc > 0)
{
if (x>650)
{
x = 11;
y = -70;
mov = 1;
inc = 1;
AmDown = 0;
}
}
else
{
if (x<-80)
{
x = 560;
y = -70;
mov = 1;
inc = 1;
AmDown = 0;
}
}
}
else
{
if (x == 560 ||
x == 10)
{
AmDown = 0;
mov = 1;
inc = 1;
}
}
break;
case 1:
y += inc;
AmDown += inc;
if (y > 0)
if (AmDown >= iQtdeDown)
{
mov = 0;
if (x == 0)
{
inc = abs(inc);
}
if (x == 560)
{
inc = abs(inc) * (-1);
}
}
break;
}
break;
case 1:
switch(mov)
{
case 0:
x -= inc;
y -= inc;
if (x <= 0)
{
x = 0;
mov = 1;
}
if (y <= 0)
{
y = 0;
mov = 3;
}
break;
case 1:
x += inc;
y -= inc;
if (x >= 560)
{
x = 560;
mov = 0;
}
if (y <= 0)
{
y = 0;
mov = 2;
}
break;
case 2:
x += inc;
y += inc;
if (x >= 560)
{
x = 560;
mov = 3;
}
if (y >= 300)
{
y = 300;
mov = 1;
}
break;
case 3:
x -= inc;
y += inc;
if (x <= 0)
{
x = 0;
mov = 2;
}
if (y >= 300)
{
y = 300;
mov = 0;
}
break;
}
break;
case 2:
switch(mov)
{
case 0:
if (x <= iFlags )
{
if (iFlags != NULL)
mov = 1;
else
x += inc;
}
else
x +=inc;
if (x >= 650)
{
x = -80;
mov = 0;
}
break;
case 1:
if (x >= iFlags)
if (iFlags != NULL)
mov = 0;
else
x -= inc;
else
x -=inc;
if (x <= -80)
{
x = 650;
mov = 1;
}
break;
}
break;
}
return TRUE;
}
BOOL isExploding()
{
if (iState == 0)
return FALSE;
else
return TRUE;
}
BOOL DropExtra()
{
if (iState == 1 &&
iExplosionFrame == 12 &&
iExtra != 0
)
return TRUE;
else
return FALSE;
}
BOOL DestroyMe()
{
if (iState == 1 &&
iExplosionFrame == 20)
return TRUE;
return FALSE;
}
/* BOOL Repaint(LPDIRECTDRAWSURFACE7 lpDest, LPDIRECTDRAWSURFACE7 lpSource, int iFlags)
{
HRESULT hRet;
if (iFlags == 1 ||
(iState == 1 && iExplosionFrame > 0))
{
rcLastPos.top = y - 2;
rcLastPos.left = x - 2;
rcLastPos.bottom = y + 74;
rcLastPos.right = x + 74;
if (rcLastPos.bottom > 460)
rcLastPos.bottom = 460;
if (rcLastPos.right > 640)
rcLastPos.right = 640;
if (rcLastPos.top < 0)
rcLastPos.top = 0;
if (rcLastPos.left < 0)
rcLastPos.left = 0;
}
while (1)
{
hRet = lpDest->BltFast(rcLastPos.left, rcLastPos.top, lpSource, &rcLastPos, DDBLTFAST_NOCOLORKEY | DDBLTFAST_WAIT);
if (hRet == DD_OK)
{
break;
}
if (hRet == DDERR_SURFACELOST)
{
return FALSE;
}
if (hRet != DDERR_WASSTILLDRAWING)
break;
}
return TRUE;
}
*/
BOOL Draw(LPDIRECTDRAWSURFACE7 lpDest, LPDIRECTDRAWSURFACE7 lpSource, int iFlags)
{
RECT rcRect;
HRESULT hRet;
int iDiffRight;
int iDiffLeft;
int iDiffBottom;
switch(iState)
{
case 0:
rcRect.left = ArgPosX;
rcRect.top = ArgPosY;
rcRect.right = ArgPosX + 70;
rcRect.bottom = ArgPosY + 70;
if (x+70>640)
{
iDiffRight = x+70-640;
rcRect.right -= iDiffRight;
}
else
iDiffLeft = 0;
if (x<0)
{
iDiffLeft = x * (-1);
rcRect.left += iDiffLeft;
}
else
iDiffLeft = 0;
if (y < 0)
{
iDiffBottom = y * (-1);
rcRect.top += iDiffBottom;
}
else
iDiffBottom = 0;
break;
case 1:
iDiffBottom = 0;
if (iExplosionFrame < 5)
{
ArgPosX = iExplosionFrame * 70;
ArgPosY = 0;
}
if (iExplosionFrame > 4 &&
iExplosionFrame < 9)
{
ArgPosX = (iExplosionFrame-5) * 70;
ArgPosY = 70;
}
if (iExplosionFrame > 9 &&
iExplosionFrame < 14)
{
ArgPosX = (iExplosionFrame-10) * 70;
ArgPosY = 140;
}
if (iExplosionFrame > 14 &&
iExplosionFrame < 20)
{
ArgPosX = (iExplosionFrame-15) * 70;
ArgPosY = 210;
}
rcRect.left = ArgPosX;
rcRect.top = ArgPosY;
rcRect.right = ArgPosX + 70;
rcRect.bottom = ArgPosY + 70;
if (x+70>640)
{
iDiffRight = x+70-640;
rcRect.right -= iDiffRight;
}
else
iDiffLeft = 0;
if (x<0)
{
iDiffLeft = x * (-1);
rcRect.left += iDiffLeft;
}
else
iDiffLeft = 0;
if (y < 0)
{
iDiffBottom = y * (-1);
rcRect.top += iDiffBottom;
}
else
iDiffBottom = 0;
iExplosionFrame++;
break;
}
while (1)
{
hRet = lpDest->BltFast(x+iDiffLeft, y+iDiffBottom, lpSource, &rcRect, TRUE);
if (hRet == DD_OK)
{
hRet = TRUE;
break;
}
if (hRet == DDERR_SURFACELOST)
{
hRet = FALSE;
break;
}
if (hRet != DDERR_WASSTILLDRAWING)
{
hRet = TRUE;
break;
}
}
ArgPosX += 70;
if (ArgPosX == 350)
{
ArgPosX = 0;
ArgPosY += 70;
if (ArgPosY == 700)
ArgPosY = 0;
}
return hRet;
}
};
class Bullet
{
private:
int x;
int y;
RECT rcLastPos;
int iType;
Bullet* pNext;
Bullet* pPrev;
public:
int frame;
Bullet()
{
x = 0;
y = 0;
pNext = NULL;
pPrev = NULL;
frame = 0;
iType = 0;
rcLastPos.left = 0;
rcLastPos.top = 0;
rcLastPos.right = 0;
rcLastPos.bottom = 0;
};
int GetType()
{
return iType;
}
void SetType(int iNewType)
{
iType = iNewType;
}
int GetX()
{
return x;
}
int GetY()
{
return y;
}
int GetPower()
{
switch(iType)
{
case 0:
return 2;
break;
case 2:
return 1;
break;
}
return 1;
}
void Move(int Qtde)
{
rcLastPos.left = x;
rcLastPos.top = y;
rcLastPos.right = x + 20;
rcLastPos.bottom = y + 20;
if (rcLastPos.top < 0)
rcLastPos.top = 0;
if (rcLastPos.bottom > 455)
rcLastPos.bottom = 455;
y -= Qtde;
}
void SetXY(int nx, int ny)
{
rcLastPos.left = nx;
rcLastPos.top = ny;
rcLastPos.right = nx + 20;
rcLastPos.bottom = ny + 20;
x = nx;
y = ny;
}
Bullet* GetNext()
{
return pNext;
}
Bullet* GetPrev()
{
return pPrev;
}
void SetNext(Bullet* nNext)
{
pNext = nNext;
}
void SetPrev(Bullet* nPrev)
{
pPrev = nPrev;
}
BOOL Draw(LPDIRECTDRAWSURFACE7 lpOrigin, LPDIRECTDRAWSURFACE7 lpSource)
{
RECT rcRect;
HRESULT hRet;
int iClipTop;
int iClipBottom;
if (y < 0)
iClipTop = y * -1;
else
iClipTop = 0;
if (y+20 > 455)
iClipBottom = y+20-455;
else
iClipBottom = 0;
if (iType == 2)
frame = 0;
rcRect.left = frame * 20;
rcRect.top = 0 + iClipTop;
rcRect.right = frame * 20 + 20;
rcRect.bottom = 20 - iClipBottom;
frame++;
if (frame == 11 && iType == 0)
frame = 0;
if (frame == 20 && iType == 1)
frame = 0;
while (1)
{
hRet = lpOrigin->BltFast(x + iClipTop, y, lpSource, &rcRect, DDBLTFAST_SRCCOLORKEY);
if (hRet == DD_OK)
{
break;
}
if (hRet == DDERR_SURFACELOST)
{
return FALSE;
}
if (hRet != DDERR_WASSTILLDRAWING)
break;
}
return TRUE;
}
// Flags:
//
// 1 - Draw background
// 2 - Draw bullet
/*
BOOL Repaint(LPDIRECTDRAWSURFACE7 lpOrigin, LPDIRECTDRAWSURFACE7 lpSource, int iFlags)
{
HRESULT hRet;
int iCorrection = 0;
if (iFlags == 1)
{
rcLastPos.top = y;
rcLastPos.left = x;
rcLastPos.bottom = y + 20;
rcLastPos.right = x + 20;
if (rcLastPos.bottom > 460)
rcLastPos.bottom = 460;
}
while (1)
{
hRet = lpOrigin->BltFast(rcLastPos.left, rcLastPos.top, lpSource, &rcLastPos, DDBLTFAST_NOCOLORKEY | DDBLTFAST_WAIT);
if (hRet == DD_OK)
{
break;
}
if (hRet == DDERR_SURFACELOST)
{
return FALSE;
}
if (hRet != DDERR_WASSTILLDRAWING)
break;
}
return TRUE;
}
*/
};
//处理奖子类型的类,奖子定义在图extras.bmp中,它是一副500×125的图像,有五种类型的奖子,每种奖子有20帧,
//平均每个奖子是25*25的分辨率。
class Extra
{
private:
int x;
int y;
RECT rcLastPos;
int iType; //奖子类型,从extras.bmp可以看出共有5种类型
Extra* pNext;
Extra* pPrev;
public:
int frame;//帧编号,从extras.bmp可以看出共有20帧
Extra()
{
x = 0;
y = 0;
pNext = NULL;
pPrev = NULL;
frame = 0;
iType = 0;
rcLastPos.left = 0;
rcLastPos.top = 0;
rcLastPos.right = 0;
rcLastPos.bottom = 0;
};
int GetType()
{
return iType;
}
void SetType(int iNewType)
{
iType = iNewType;
}
int GetX()
{
return x;
}
int GetY()
{
return y;
}
void Move(int Qtde)
{
rcLastPos.left = x;
rcLastPos.top = y;
rcLastPos.right = x + 25;
rcLastPos.bottom = y + 25;
if (rcLastPos.bottom > 455)
rcLastPos.bottom = 455;
//Qtde是一个负值,因为这种奖子都是垂直下落的,即y值需要不断增加
y -= Qtde;
}
void SetXY(int nx, int ny)
{
rcLastPos.left = nx;
rcLastPos.top = ny;
rcLastPos.right = nx + 25;
rcLastPos.bottom = ny + 25;
x = nx;
y = ny;
}
Extra* GetNext()
{
return pNext;
}
Extra* GetPrev()
{
return pPrev;
}
void SetNext(Extra* nNext)
{
pNext = nNext;
}
void SetPrev(Extra* nPrev)
{
pPrev = nPrev;
}
BOOL Draw(LPDIRECTDRAWSURFACE7 lpOrigin, LPDIRECTDRAWSURFACE7 lpSource)
{
RECT rcRect;
HRESULT hRet;
int iClipTop;
int iClipBottom;
if (y < 0)
iClipTop = y * -1;
else
iClipTop = 0;
if (y+25 > 455)
iClipBottom = y+25-455;
else
iClipBottom = 0;
rcRect.left = frame * 25;
rcRect.top = ((iType - 1) * 25) + iClipTop;
rcRect.right = frame * 25 + 25;
rcRect.bottom = ((iType - 1) * 25) + 25 - iClipBottom;
//帧数编号加1
frame++;
if (frame == 20)
frame = 0;
while (1)
{
hRet = lpOrigin->BltFast(x , y, lpSource, &rcRect, DDBLTFAST_SRCCOLORKEY);
if (hRet == DD_OK)
{
break;
}
if (hRet == DDERR_SURFACELOST)
{
return FALSE;
}
if (hRet != DDERR_WASSTILLDRAWING)
break;
}
return TRUE;
}
// Flags:
//
// 1 - Draw background
// 2 - Draw bullet
/*
BOOL Repaint(LPDIRECTDRAWSURFACE lpDest, LPDIRECTDRAWSURFACE lpSource, int iFlags)
{
HRESULT hRet;
int iCorrection = 0;
if (iFlags == 1)
{
rcLastPos.top = y;
rcLastPos.left = x;
rcLastPos.bottom = y + 25;
rcLastPos.right = x + 25;
if (rcLastPos.bottom > 455)
rcLastPos.bottom = 455;
}
while (1)
{
hRet = lpDest->BltFast(rcLastPos.left, rcLastPos.top, lpSource, &rcLastPos, DDBLTFAST_NOCOLORKEY | DDBLTFAST_WAIT);
if (hRet == DD_OK)
{
break;
}
if (hRet == DDERR_SURFACELOST)
{
return FALSE;
}
if (hRet != DDERR_WASSTILLDRAWING)
break;
}
return TRUE;
}
*/
};
// The alpha strucute is used to map the alphabet bitmap, so that we can
// bli the alphabet to the screen
struct Alpha
{
unsigned int start;
unsigned int end;
};
const Alpha AA[40] =
{
{0,14},{19,27},{31,46},{47,61},{65,78},{80,94},
{96,110},{114,125},{128,143},{145,159},{160,175},
{176,191},{193,206},{207,222},{224,237},{238,252},{253,267},
{269,284},{285,291},{292,307},{308,323},{324,338},{340,364},
{365,380},{382,397},{398,413},{414,429},{430,444},{447,460},
{464,475},{477,492},{494,508},{509,533},{533,548},{550,564},
{564,579},{579,599},{600,610},{611,615},{617,620}
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -