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

📄 main.cpp

📁 这是一个屠宰场游戏,此游戏很休闲的请大家下载来看看.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		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 + -