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

📄 fight.cpp

📁 RPG单机游戏圣剑英雄传的源代码(声音、图片、剧情等)希望给对于想制作游戏的人有一定帮助。
💻 CPP
字号:
//===================打斗模块====================


int X1=130, Y1=270, X2=470, Y2=270;
int SoundIt[]={2,1,2,2,1, 2,1,1,2,1,  1,1,1,1,2}; //声音映射

void ShowFight(int MenuIt,Role Enemy);
Role MyFight(Role Enemy);
Role EnemyFight(Role Enemy);
int Win(Role Enemy);

//进入打斗
int Fight(Role Enemy,int FightScene, int Escape)
{
	int MenuIt=0;
	int OldScene=Scene;
	Role Old=Hero;
	int Sx=SX,Sy=SY,Dx=DX,Dy=DY,oSx=old_SX, oSy=old_SY, oDx=old_DX, oDy=old_DY;
	
	Scene=FightScene;
	SX=SY=DX=DY=old_SX=old_SY=old_DX=old_DY=0;
	Hero.x=X1;
	Hero.y=Y1;
	Hero.Way=2;
	Hero.Stats=0;
	Map[Scene].NPC[0]=Enemy;
	Map[Scene].Npc_Nums=1;
	Map[Scene].NPC[0].x=X2;
	Map[Scene].NPC[0].y=Y2;
	Map[Scene].NPC[0].Way=1;
	Map[Scene].NPC[0].Stats=0;

	ChangePalette(MainPal, NullPal, -1);
	ShowFight(0,Enemy);
	ChangePalette(NullPal, MainPal, 1);

	PressKey(VK_RETURN,1);

	while(1)
	{
		if( GetAsyncKeyState(VK_DOWN) )	//下一项
		{
			PressKey(VK_DOWN,1);
			MenuIt=(MenuIt+1)%4;
			ShowFight(MenuIt,Enemy);
		}
		if( GetAsyncKeyState(VK_UP) )	//上一项
		{
			PressKey(VK_UP,1);
			if( MenuIt==0 ) MenuIt=3;
			else MenuIt--;
			ShowFight(MenuIt,Enemy);
		}
		if( GetAsyncKeyState(VK_RETURN) )	//确定
		{
			while( GetAsyncKeyState(VK_RETURN) ) {}
			switch( MenuIt )
			{
			case 0:	//打斗
				Enemy=MyFight(Enemy);
				if( Win(Enemy)==0 ) //胜利
				{
					Scene=OldScene;
					SX=Sx; SY=Sy; DX=Dx; DY=Dy;
					old_SX=oSx; old_SY=oSy; old_DX=oDx; old_DY=oDy;
					Hero.x=Hero.old_x=Old.x; Hero.y=Hero.old_y=Old.y; Hero.Way=Old.Way;	Hero.Stats=Old.Stats;
					ChangePalette(MainPal, NullPal, -1);
					MainMove();
					Flip();
					ChangePalette(NullPal, MainPal, 1);
					return 0;
				}
				Delay(500);
				Enemy=EnemyFight(Enemy);
				if( Win(Enemy)==1 ) //失败
				{
					ChangePalette(MainPal,NullPal,-1);
					//PostMessage(hWnd, WM_CLOSE, 0, 0);
					//GameTitle();
					return 2;
				}
				break;
			case 1: //状态
				ShowFight(MenuIt,Enemy);
				ShowState();
				break;
			case 2: //物品
				if( GoodsDialog()==1 )  //轮到敌人攻击(用过了物品)
				{
					Enemy=EnemyFight(Enemy);
					if( Win(Enemy)==1 ) //失败
					{
						ChangePalette(MainPal,NullPal,-1);
						//PostMessage(hWnd, WM_CLOSE, 0, 0);
						return 2;
					}
				}
				ShowFight(MenuIt,Enemy);
				break;
			case 3:	//逃走
				if( random(100)>Escape )
				{
				Scene=OldScene;
				SX=Sx; SY=Sy; DX=Dx; DY=Dy;
				old_SX=oSx; old_SY=oSy; old_DX=oDx; old_DY=oDy;
				Hero.x=Hero.old_x=Old.x; Hero.y=Hero.old_y=Old.y; Hero.Way=Old.Way;	Hero.Stats=Old.Stats;
				ChangePalette(MainPal, NullPal, -1);
				MainMove();
				Flip();
				ChangePalette(NullPal, MainPal, 1);
				return 1;
				}
				else 
				{
					for(int j=0; j<6; j++)
					{
						ShowFight(MenuIt,Enemy);
						if( j%2==0 )
						PrintText(lpDDSPrimary, 280,200, "逃跑失败!",RGB(255,255,255));
						Delay(80);
					}
					Enemy=EnemyFight(Enemy);
					if( Win(Enemy)==1 ) //失败
					{
						ChangePalette(MainPal,NullPal,-1);
						//PostMessage(hWnd, WM_CLOSE, 0, 0);
						//GameTitle();
						return 2;
					}
					ShowFight(MenuIt,Enemy);
				}
				break;
			}
		}
	}
	
}

//显示打斗场景
void ShowFight(int MenuIt,Role Enemy)
{
	int x=96,y=304;
	char *MainMenu[]={"攻击","状态","物品","逃走"};
	char Temp[100];

	MainMove();

	rect=GetRect(0,0,448,112);
	Blt(lpDDSBack, x, y, lpDDSFightBar, rect, FALSE);
	rect=GetRect(0,0,32,48);
	Blt(lpDDSBack, x+10, y+10, lpDDSSpirit, rect, TRUE);
	rect=GetRect(0,0,32,32);
	Blt(lpDDSBack, x+265, y+26, Enemy.Surface, rect, TRUE);

	sprintf(Temp,"生命:%4d  攻击:%4d  防御:%4d  等级:%4d",Hero.Lift, Hero.Attack, Hero.Defend, Hero.Level);
	PrintText(lpDDSBack, x+50, y+15, Temp, RGB(0,0,0), TRANSPARENT, 0, 12);
	
	sprintf(Temp,"生命:%4d  攻击:%4d  防御:%4d  等级:%4d",Enemy.Lift, Enemy.Attack, Enemy.Defend, Enemy.Level);
	PrintText(lpDDSBack, x+305, y+15, Temp, RGB(0,0,0), TRANSPARENT, 0, 12);
	
	for( int i=0; i<4; i++ )
	{
		DWORD T1=0,T2=0;
		if( MenuIt == i )
		{
			T1=OPAQUE;
			T2=RGB(255,255,255);
		}
		PrintText(lpDDSBack, x+202, y+10+i*24, MainMenu[i],RGB(255,0,0), T1, T2);
	}
	Flip();
}

//**********************
//我方攻击
Role MyFight(Role Enemy)
{
	int i,tmp=5, SubBlood;	
	char temp[100];
	
	SubBlood= Hero.Attack*2 - Enemy.Defend;
	if( SubBlood<=10 ) SubBlood=random(10);
	else SubBlood= SubBlood+random(SubBlood*1);
	sprintf(temp,"-%d",SubBlood);
	
	//我方攻击
	PlayDirectSound(SoundAttack[0]); //攻击声
	for( i=0; i<10; i++)
	{
		ShowFight(0, Enemy);
		rect=GetRect(i*54, 0, i*54+54, 50);
		Blt(lpDDSPrimary, X2-10, Y2-32, lpDDSBomb, rect, TRUE);
		Delay(60);
	}
	
	PlayDirectSound( SoundAo[SoundIt[ Enemy.Pic] ] ); //痛苦声
	for( i=0; i<10; i++)
	{
		Map[Scene].NPC[0].x+=tmp; 	tmp=-tmp;
		ShowFight(0, Enemy);
		PrintText(lpDDSPrimary, X2, Y2-32-i*5, temp, RGB(255,255,255));
		Delay(50);
	}		
	Enemy.Lift-=SubBlood;
	ShowFight(0, Enemy);
	return Enemy;
}

//胜负判断
int Win(Role Enemy)
{	
	//胜利
	if( Enemy.Lift<=0 ) 
	{
		PlayDirectSound( SoundDead[SoundIt[ Enemy.Pic] ] ); //死亡声
		Map[Scene].Npc_Nums=0;
		ShowFight(0, Enemy);
		PrintText(lpDDSPrimary, 280, 180, "胜利了!", RGB(255,255,255));
		PressKey(VK_RETURN);
		
		char TempChar[200];
		sprintf(TempChar,"获得:经验=[%d] 金钱=[%d] ",Enemy.Level*25,Enemy.Money);
		PrintText(lpDDSPrimary, 200, 210, TempChar, RGB(255,255,255));
		Hero.Money+=Enemy.Money;
		Hero.Exp+=Enemy.Level*20;

		if( Enemy.Goods[0]!='0' ) //得到宝物
		{
			PrintText(lpDDSPrimary, 200, 240, "缴获物品:", RGB(255,255,255));
			for(int i=0; i<16; i++)
			{
				if( Enemy.Goods[i]!=NULL )
				{
					sprintf(TempChar,"%s  ",Goods[Enemy.Goods[i]-'0'].Name);
					PrintText(lpDDSPrimary, 290+i*15*strlen(Goods[Enemy.Goods[i]-'0'].Name), 240, TempChar, RGB(255,255,0));
					for(int j=0; j<16; j++) //放宝物
					{
						if( Hero.Goods[j]==' ' )
						{
							Hero.Goods[j]=Enemy.Goods[i];
							break;
						}
					}
						
				}
			}
		}

		PressKey(VK_RETURN);

		if( Hero.Exp>=100 ) //升级了
		{
			Hero.Level+=Hero.Exp/100;
			sprintf(TempChar, "等级升为(%d)^_^",Hero.Level);
			PrintText(lpDDSPrimary, 250, 270, TempChar, RGB(255,255,0));
			Hero.MaxLift+=Hero.Exp/100 * 30;
			Hero.Attack+=Hero.Exp/100 * 1;
			Hero.Defend+=Hero.Exp/100 * 1; 
			Hero.Lift+=(Hero.MaxLift-Hero.Lift)/2;
			Hero.Exp%=100;
			PressKey(VK_RETURN);
		}
		
		return 0;
	}
	if( Hero.Lift<=0 )
	{
		PlayDirectSound( SoundDead[0] ); //死亡声
		Hero.x=Hero.old_x=640; 
		ShowFight(0, Enemy);
		PrintText(lpDDSPrimary, 280, 200, "你死了!", RGB(255,255,255));
		PressKey(VK_RETURN);
		return 1;
	}
return 2;
}

//敌人攻击
Role EnemyFight(Role Enemy)
{
	int i,tmp=5, SubBlood;	
	char temp[100];

	SubBlood= Enemy.Attack*2 - Hero.Defend;
	if( SubBlood<=10 ) SubBlood=random(10);
	else SubBlood=SubBlood+random(SubBlood*1);
	sprintf(temp,"-%d",SubBlood);
	
	//敌人攻击
	PlayDirectSound(SoundAttack[ SoundIt[Enemy.Pic] ]); //攻击声
	for( i=0; i<10; i++)
	{
		ShowFight(0, Enemy);
		rect=GetRect(i*54, 0, i*54+54, 50);
		Blt(lpDDSPrimary, X1-10, Y1-32, lpDDSBomb, rect, TRUE);
		Delay(60);
	}
	
	PlayDirectSound(SoundAo[0]); //痛苦声
	for( i=0; i<10; i++)
	{
		Hero.x+=-tmp; 	tmp=-tmp;
		ShowFight(0, Enemy);
		PrintText(lpDDSPrimary, X1, Y1-32-i*5, temp, RGB(255,255,255));
		Delay(50);
	}	
	Hero.Lift-=SubBlood;
	ShowFight(0, Enemy);

	return Enemy;
}

⌨️ 快捷键说明

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