📄 main.cpp
字号:
if (nV) { // 二分之一概率 y方向移动
pSprite->m_Movement.m_dx = 0;
if (nH) { // 二分之一概率,向下走
pSprite->m_Movement.m_dy = 1 * (rand()%2+1);
pSprite->SetState(ST_WALK_DOWN); //向下走
} else { // 二分之一概率,向上走
pSprite->m_Movement.m_dy = -1 * (rand()%2+1);
pSprite->SetState(ST_WALK_UP);
}
} else { // 二分之一概率x方向移动
pSprite->m_Movement.m_dy = 0;
if (nH) { // 二分之一概率,向左走
pSprite->m_Movement.m_dx = 1 * (rand()%2+1);
pSprite->SetState(ST_WALK_RIGHT);
} else { // 二分之一概率,向右走
pSprite->m_Movement.m_dx = -1 * (rand()%2+1);
pSprite->SetState(ST_WALK_LEFT);
}
}
}
if (pSprite->GetType() == TYPE_ENEMY4) { // TYPE_ENEMY4 可以发射子弹
if (g_BulletSprite.GetState() == ST_DEAD && pSprite->GetState() != ST_KILL
&& pSprite->GetState() != ST_DEAD) {
//设置子弹的起始位置
RECT rc = pSprite->GetRect();
g_BulletSprite.MoveTo(rc.left,rc.top);
g_BulletSprite.SetState(ST_DEFAULT);
//根据YPE_ENEMY4 敌人的移动方向决定子弹以后的移动
switch (pSprite->GetState()) {
case ST_WALK_UP:
g_BulletSprite.m_Movement.m_dx =0; //速度
g_BulletSprite.m_Movement.m_dy = -3;
break;
case ST_WALK_DOWN:
g_BulletSprite.m_Movement.m_dx =0;
g_BulletSprite.m_Movement.m_dy = 3;
break;
case ST_WALK_LEFT:
g_BulletSprite.m_Movement.m_dx =-3;
g_BulletSprite.m_Movement.m_dy = 0;
break;
case ST_WALK_RIGHT:
g_BulletSprite.m_Movement.m_dx =3;
g_BulletSprite.m_Movement.m_dy = 0;
break;
}
}
}
}
void DeadPig(CSprite* pSprite)//玩家死掉
{
++g_nPigDead; //死亡数增加
--g_nLivesLeft; //剩余生命数减少
#ifdef DISPLAY_STATUS
wsprintf((char*)g_szGameStatus, (char*)GAMESTATUS_TEXT, g_nPigDead, g_nEnemyDead);
SAFE_DELETE( g_pTextSurface );
g_pDisplay->CreateSurfaceFromText( &g_pTextSurface, NULL, (char*)g_szGameStatus,
RGB(0,0,0), RGB(255, 255, 0) );
#endif
//更新显示
SAFE_DELETE( g_pLifeTextSurface );
wsprintf((char*)g_szLifeLeft, (char*)LIFE_LEFT_TEXT, g_nLivesLeft-1);
HFONT hFont = GetGameFont();
g_pDisplay->CreateSurfaceFromText( &g_pLifeTextSurface, hFont , (char*)g_szLifeLeft,
RGB(0,0,0), RGB(255, 255, 0) );
DeleteObject(hFont);
//重新产生玩家控制的精灵
g_pPlayerSprite->MoveTo(1 * MAZETEXTURE_WIDTH, 19 * MAZETEXTURE_HEIGHT);
g_pPlayerSprite->SetState(ST_WALK_UP);
g_pPlayerSprite->m_Movement.m_nInvulnerable=INVULNERABLE_DELAY;
if (g_nLivesLeft == 0) {
g_nLivesLeft = NO_OF_LIFE;
g_nGameState = GAMESTATE_GAMEOVERBAD;
LoadJPEG(true, GAMEOVERBADFILENAME, &g_pSplashSurface);
}
}
void DeadEnemy(CSprite* pSprite)
{
++g_nEnemyDead; //计数加一
#ifdef DISPLAY_STATUS
wsprintf((char*)g_szGameStatus, (char*)GAMESTATUS_TEXT, g_nPigDead, g_nEnemyDead);
SAFE_DELETE( g_pTextSurface );
g_pDisplay->CreateSurfaceFromText( &g_pTextSurface, NULL, (char*)g_szGameStatus,
RGB(0,0,0), RGB(255, 255, 0) );
#endif
g_nScore += pSprite->m_nPoints;
SAFE_DELETE( g_pScoreTextSurface );
wsprintf((char*)g_szScore, (char*)GAMESCORE_TEXT, g_nScore);
HFONT hFont = GetGameFont();
g_pDisplay->CreateSurfaceFromText( &g_pScoreTextSurface, hFont, (char*)g_szScore,
RGB(0,0,0), RGB(255, 255, 0) );
DeleteObject(hFont);
if (g_nNoOfEnemies) {//敌人被消灭掉后,数目会减1,当g_nNoOfEnemies为零后,不会再产生新的敌人,直到下一级
g_nNoOfEnemies--;
pSprite->SetState(ST_WALK_LEFT);
POINT pt = g_Maze.GetRandDeployPoint(); //随机抽取一个放置物品的位置
pt.x *= MAZETEXTURE_WIDTH; //格子数乘上格子宽度才是真正的位置坐标
pt.y *= MAZETEXTURE_HEIGHT;
pSprite->MoveTo(pt);
(*pSprite->m_Movement.m_pfnFindPath)(pSprite);
pSprite->m_Movement.m_nInvulnerable=INVULNERABLE_DELAY; //设置不死延时
}
}
bool KillSpecial(CSprite* pSprite) //吃掉物品
{
if (pSprite->GetState() == ST_DOOR) { //如果是门,过关
InitLevel();
return false;
}
return true;
}
void DeadSpecial(CSprite* pSprite)
{
static long nSpecialState = ST_FOOD1; //第一次开始置为食物
////得分加上该精灵的分值 并显示
g_nScore += pSprite->m_nPoints;
SAFE_DELETE( g_pScoreTextSurface );
wsprintf((char*)g_szScore, (char*)GAMESCORE_TEXT, g_nScore);
HFONT hFont = GetGameFont();
g_pDisplay->CreateSurfaceFromText( &g_pScoreTextSurface, hFont, (char*)g_szScore,
RGB(0,0,0), RGB(255, 255, 0) );
DeleteObject(hFont);
if (g_nNoOfSpecials) { //还没有捡完规定的物品数目,放置食物
pSprite->SetState(rand()%6 + ST_FOOD1);
POINT pt = g_Maze.GetRandDeployPoint();
pt.x *= MAZETEXTURE_WIDTH;
pt.y *= MAZETEXTURE_HEIGHT;
pSprite->MoveTo(pt);
nSpecialState = ST_FOOD1;
--g_nNoOfSpecials;
} else { //捡够了,如果前面捡到的如果是食物,放置钥匙,如果是钥匙则放置门
switch (nSpecialState) {
case ST_FOOD1:
pSprite->SetState(ST_KEY);
POINT pt = g_Maze.GetRandDeployPoint();
pt.x *= MAZETEXTURE_WIDTH;
pt.y *= MAZETEXTURE_HEIGHT;
pSprite->MoveTo(pt);
nSpecialState = ST_KEY;
break;
case ST_KEY:
pSprite->SetState(ST_DOOR);
pt = g_Maze.GetRandDeployPoint();
pt.x *= MAZETEXTURE_WIDTH;
pt.y *= MAZETEXTURE_HEIGHT;
pSprite->MoveTo(pt);
nSpecialState = ST_DOOR;
break;
case ST_DOOR:
InitLevel(); //下一级
}
}
}
//初始化精灵,它负责创建猪精灵,兔精灵,羊精灵,敌人精灵,特殊精灵和子弹精灵。
void InitSprites()
{
//统一的动画尺寸
const int nHeight = SPRITE_HEIGHT; //64
const int nWidth = SPRITE_WIDTH; //64
POINT pt;
RECT rcBounding;
// ---------------- 猪精灵----------------- //
g_PigSprite.CreateSprite(&g_pSpriteSurface, TYPE_PLAYER, nHeight,nWidth);
pt.x = 5*64; pt.y =7*64 ; //图像坐标
g_PigSprite.AddState(ST_STAND_STILL, pt, 2, 60);//状态:不动,第一帧位置,帧数,延时
//包络矩形
rcBounding.top = 0;
rcBounding.bottom = nHeight-10;
rcBounding.left = 10;
rcBounding.right= nWidth - 20;
pt.x = 6*64; pt.y =4*64;
g_PigSprite.AddState(ST_WALK_UP, pt, 3, 10,&rcBounding);//状态,第一帧位置,帧数,延时,包络矩形
rcBounding.top = 10;
rcBounding.bottom = nHeight-10;
pt.x = 64*9;pt.y = 4*64;
g_PigSprite.AddState(ST_WALK_DOWN, pt, 3, 10,&rcBounding);//向下走
rcBounding.top = 10;
rcBounding.bottom = nHeight - 20;
rcBounding.left = 0;
rcBounding.right=nWidth - 10;
pt.x = 3*64;pt.y = 4*64;
// g_pPlayerSprite->AddState(ST_WALK_LEFT, pt, 2, 20,"WavPigWalk",true);
g_PigSprite.AddState(ST_WALK_LEFT, pt, 3, 10,&rcBounding); //向左走
pt.x = 64*0;pt.y = 4*64;
rcBounding.left = 10;
rcBounding.right=nWidth-10;
g_PigSprite.AddState(ST_WALK_RIGHT, pt, 3, 10,&rcBounding);//向右走
pt.x = 64 * 8; pt.y = 7 * 64;
g_PigSprite.AddState(ST_KILL, pt, 4, 20); //被杀死
g_PigSprite.MoveTo(1 * MAZETEXTURE_WIDTH, 19 * MAZETEXTURE_HEIGHT);//移动到,x=1,y=19 位置. 起始位置
g_PigSprite.m_pfnDead = DeadPig;
g_PigSprite.m_Movement.m_pfnCollision = IsHit;
g_PigPooSprite.CreateSprite(&g_pSpriteSurface, TYPE_POO, nHeight,nWidth);
rcBounding.top = rcBounding.left = 20;
rcBounding.right=rcBounding.bottom = nHeight - 40;
pt.x = 0*64;pt.y = 7*64;
g_PigPooSprite.AddState(ST_DEFAULT, pt, 3, 50,&rcBounding);
pt.x = 11*64;pt.y = 10*64;
g_PigPooSprite.AddState(ST_DEAD, pt, 3, 50,&rcBounding);
g_PigPooSprite.SetState(ST_DEFAULT); //设置当前状态
// --------------- 兔精灵 --------------- //
g_RabbitSprite.CreateSprite(&g_pSpriteSurface, TYPE_PLAYER, nHeight,nWidth);
pt.x = 5*64; pt.y =8*64 ;
g_RabbitSprite.AddState(ST_STAND_STILL, pt, 2, 60);
rcBounding.top = 0;
rcBounding.bottom = nHeight-10;
rcBounding.left = 10;
rcBounding.right= nWidth - 20;
pt.x = 6*64; pt.y =5*64;
g_RabbitSprite.AddState(ST_WALK_UP, pt, 3, 10,&rcBounding);
rcBounding.top = 10;
rcBounding.bottom = nHeight-10;
pt.x = 64*9;pt.y = 5*64;
g_RabbitSprite.AddState(ST_WALK_DOWN, pt, 3, 10,&rcBounding);
rcBounding.top = 10;
rcBounding.bottom = nHeight - 20;
rcBounding.left = 0;
rcBounding.right=nWidth - 10;
pt.x = 3*64;pt.y = 5*64;
g_RabbitSprite.AddState(ST_WALK_LEFT, pt, 3, 10,&rcBounding);
pt.x = 64*0;pt.y = 5*64;
rcBounding.left = 10;
rcBounding.right=nWidth-10;
g_RabbitSprite.AddState(ST_WALK_RIGHT, pt, 3, 10,&rcBounding);
pt.x = 64 * 8; pt.y = 8 * 64;
g_RabbitSprite.AddState(ST_KILL, pt, 4, 20);
g_RabbitSprite.MoveTo(1 * MAZETEXTURE_WIDTH, 19 * MAZETEXTURE_HEIGHT);
g_RabbitSprite.m_pfnDead = DeadPig;
g_RabbitSprite.m_Movement.m_pfnCollision = IsHit;
g_RabbitPooSprite.CreateSprite(&g_pSpriteSurface, TYPE_POO, nHeight,nWidth);
rcBounding.top = rcBounding.left = 20;
rcBounding.right=rcBounding.bottom = nHeight - 40;
pt.x = 0*64;pt.y = 8*64;
g_RabbitPooSprite.AddState(ST_DEFAULT, pt, 3, 50,&rcBounding);
pt.x = 11*64;pt.y = 10*64;
g_RabbitPooSprite.AddState(ST_DEAD, pt, 3, 50,&rcBounding);
g_RabbitPooSprite.SetState(ST_DEFAULT);
// --------------- 羊精灵----------------//
g_SheepSprite.CreateSprite(&g_pSpriteSurface, TYPE_PLAYER, nHeight,nWidth);
pt.x = 5*64; pt.y =9*64 ;
g_SheepSprite.AddState(ST_STAND_STILL, pt, 2, 60);
rcBounding.top = 0;
rcBounding.bottom = nHeight-10;
rcBounding.left = 10;
rcBounding.right= nWidth - 20;
pt.x = 6*64; pt.y =6*64;
g_SheepSprite.AddState(ST_WALK_UP, pt, 3, 10,&rcBounding);
rcBounding.top = 10;
rcBounding.bottom = nHeight-10;
pt.x = 64*9;pt.y = 6*64;
g_SheepSprite.AddState(ST_WALK_DOWN, pt, 3, 10,&rcBounding);
rcBounding.top = 10;
rcBounding.bottom = nHeight - 20;
rcBounding.left = 0;
rcBounding.right=nWidth - 10;
pt.x = 3*64;pt.y = 6*64;
g_SheepSprite.AddState(ST_WALK_LEFT, pt, 3, 10,&rcBounding);
pt.x = 64*0;pt.y = 6*64;
rcBounding.left = 10;
rcBounding.right=nWidth-10;
g_SheepSprite.AddState(ST_WALK_RIGHT, pt, 3, 10,&rcBounding);
pt.x = 64 * 8; pt.y = 9 * 64;
g_SheepSprite.AddState(ST_KILL, pt, 4, 20);
g_SheepSprite.MoveTo(1 * MAZETEXTURE_WIDTH, 19 * MAZETEXTURE_HEIGHT);
g_SheepSprite.m_pfnDead = DeadPig;
g_SheepSprite.m_Movement.m_pfnCollision = IsHit;
g_SheepPooSprite.CreateSprite(&g_pSpriteSurface, TYPE_POO, nHeight,nWidth);
rcBounding.top = rcBounding.left = 20;
rcBounding.right=rcBounding.bottom = nHeight - 40;
pt.x = 0*64;pt.y = 9*64;
g_SheepPooSprite.AddState(ST_DEFAULT, pt, 3, 50,&rcBounding);
pt.x = 11*64;pt.y = 10*64;
g_SheepPooSprite.AddState(ST_DEAD, pt, 3, 50,&rcBounding);
g_SheepPooSprite.SetState(ST_DEFAULT);
// --------------- 敌人精灵--------------------//
//敌人精灵管理器
g_EnemySpriteManager.SetCollAndPathFn(IsHit, FindPath);//
rcBounding.left = 10;
rcBounding.top =0;
rcBounding.right = SPRITE_WIDTH - 20;
rcBounding.bottom = SPRITE_HEIGHT ;
g_Enemy1Sprite.CreateSprite(&g_pSpriteSurface, TYPE_ENEMY1, nHeight,nWidth);
pt.x = 6*64;pt.y = 0*64;
g_Enemy1Sprite.AddState(ST_WALK_UP, pt, 2, 20,&rcBounding);
pt.x = 3*64;pt.y = 0*64;
g_Enemy1Sprite.AddState(ST_WALK_LEFT, pt, 3, 20,&rcBounding);
pt.x = 0*64;pt.y = 0*64;
g_Enemy1Sprite.AddState(ST_WALK_RIGHT, pt, 3, 20,&rcBounding);
pt.x = 8*64;pt.y = 0*64;
g_Enemy1Sprite.AddState(ST_WALK_DOWN, pt, 2, 20,&rcBounding);
pt.x = 10*64;pt.y = 0*64;
g_Enemy1Sprite.AddState(ST_KILL, pt, 3, 100);
g_Enemy1Sprite.m_pfnDead= DeadEnemy;
g_Enemy1Sprite.m_nPoints = 100; //分值
g_Enemy2Sprite.CreateSprite(&g_pSpriteSurface, TYPE_ENEMY2, nHeight,nWidth);
pt.x = 6*64;pt.y = 1*64;
g_Enemy2Sprite.AddState(ST_WALK_UP, pt, 2, 20,&rcBounding);
pt.x = 3*64;pt.y = 1*64;
g_Enemy2Sprite.AddState(ST_WALK_LEFT, pt, 3, 20,&rcBounding);
pt.x = 0*64;pt.y = 1*64;
g_Enemy2Sprite.AddState(ST_WALK_RIGHT, pt, 3, 20,&rcBounding);
pt.x = 8*64;pt.y = 1*64;
g_Enemy2Sprite.AddState(ST_WALK_DOWN, pt, 2, 20,&rcBounding);
pt.x = 10*64;pt.y = 1*64;
g_Enemy2Sprite.AddState(ST_KILL, pt, 3, 100);
g_Enemy2Sprite.m_pfnDead= DeadEnemy;
g_Enemy2Sprite.m_nPoints = 100;
g_Enemy3Sprite.CreateSprite(&g_pSpriteSurface, TYPE_ENEMY3, nHeight,nWidth);
pt.x = 6*64;pt.y = 2*64;
g_Enemy3Sprite.AddState(ST_WALK_UP, pt, 2, 20,&rcBounding);
pt.x = 3*64;pt.y = 2*64;
g_Enemy3Sprite.AddState(ST_WALK_LEFT, pt, 3, 20,&rcBounding);
pt.x = 0*64;pt.y = 2*64;
g_Enemy3Sprite.AddState(ST_WALK_RIGHT, pt, 3, 20,&rcBounding);
pt.x = 8*64;pt.y = 2*64;
g_Enemy3Sprite.AddState(ST_WALK_DOWN, pt, 2, 20,&rcBounding);
pt.x = 10*64;pt.y = 2*64;
g_Enemy3Sprite.AddState(ST_KILL, pt, 3, 100);
g_Enemy3Sprite.m_pfnDead= DeadEnemy;
g_Enemy3Sprite.m_nPoints = 100;
g_EnemySpriteManager.AddSprite(&g_Enemy3Sprite);
g_Enemy4Sprite.CreateSprite(&g_pSpriteSurface, TYPE_ENEMY4, nHeight,nWidth);
pt.x = 6*64;pt.y = 3*64;
g_Enemy4Sprite.AddState(ST_WALK_UP, pt, 2, 20,&rcBounding);
pt.x = 3*64;pt.y = 3*64;
g_Enemy4Sprite.AddState(ST_WALK_LEFT, pt, 3, 20,&rcBounding);
pt.x = 0*64;pt.y = 3*64;
g_Enemy4Sprite.AddState(ST_WALK_RIGHT, pt, 3, 20,&rcBounding);
pt.x = 8*64;pt.y = 3*64;
g_Enemy4Sprite.AddState(ST_WALK_DOWN, pt, 2, 20,&rcBounding);
pt.x = 10*64;pt.y =3*64;
g_Enemy4Sprite.AddState(ST_KILL, pt, 3, 100);
g_Enemy4Sprite.m_pfnDead= DeadEnemy;
g_Enemy4Sprite.m_nPoints = 200;
g_EnemySpriteManager.AddSprite(&g_Enemy4Sprite);
g_Enemy5Sprite.CreateSprite(&g_pSpriteSurface, TYPE_ENEMY4, nHeight,nWidth);
pt.x = 6*64;pt.y = 3*64;
g_Enemy5Sprite.AddState(ST_WALK_UP, pt, 2, 20,&rcBounding);
pt.x = 3*64;pt.y = 3*64;
g_Enemy5Sprite.AddState(ST_WALK_LEFT, pt, 3, 20,&rcBounding);
pt.x = 0*64;pt.y = 3*64;
g_Enemy5Sprite.AddState(ST_WALK_RIGHT, pt, 3, 20,&rcBounding);
pt.x = 8*64;pt.y = 3*64;
g_Enemy5Sprite.AddState(ST_WALK_DOWN, pt, 2, 20,&rcBounding);
pt.x = 10*64;pt.y =3*64;
g_Enemy5Sprite.AddState(ST_KILL, pt, 3, 100);
g_Enemy5Sprite.m_pfnDead= DeadEnemy;
g_Enemy5Sprite.m_nPoints = 200;
g_EnemySpriteManager.AddSprite(&g_Enemy5Sprite);
//其它精灵
g_SpecialSprite.CreateSprite(&g_pSpriteSurface, TYPE_SPECIAL, nHeight,nWidth);
pt.x = 5*64;pt.y = 10*64;
g_SpecialSprite.AddState(ST_FOOD1, pt, 1, 100);
pt.x = 6*64;pt.y = 10*64;
g_SpecialSprite.AddState(ST_FOOD2, pt, 1, 100);
pt.x = 7*64;pt.y = 10*64;
g_SpecialSprite.AddState(ST_FOOD3, pt, 1, 100);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -