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

📄 weather.cpp

📁 网络游戏魔域源代码 测试可以完整变异
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		m_YinFa[j]->Process( );
			
}



void CYinFaSys::YinFaStop()
{
	this->m_iStatu = _YINFA_STOP;
}

void CYinFaSys::Destroy()
{
	if(m_iStatu ==_YINFA_NONE)
		return;
    DWORD i;
	for( i = 0 ;i<m_YinFa.size();i++) 
		SAFE_DELETE(m_YinFa[i]);	
	m_YinFa.clear();   	
	this->m_iStatu		= _YINFA_NONE;
	m_nCreated			= 2;
	
}


////////////////////////////////////////////////////////////////////
//
//firework 2
//
////////////////////////////////////////////////////////////////////



//--------------------------------------------------------------


//--------------------------------------------------------------
BOOL CYinFa2::Create(int iOrigPosX,int iOrigPosY,int nMarginX, int nMarginY, int nRadius  )
{
	
	if(m_iStatus!=_YINFASTATUS_NONE)
		return FALSE;
	
	m_iStatus				=  _YINFASTATUS_CREATE; 	
	m_nCenterWorldPoint.x	= iOrigPosX  ;
	m_nCenterWorldPoint.y	= iOrigPosY ;
	m_nMarginWorldPoint.x	= nMarginX;
	m_nMarginWorldPoint.y	= nMarginY;
	m_fRadius				= nRadius;	 	
	m_nPathCount			= rand()%8+2;
	m_nPathLength			=  ((nRadius)/35 + 1) + 2;
    m_dwLifeBeginTime		= TimeGet();
	
	return TRUE;
}

//--------------------------------------------------------------------------------------


void CYinFa2::Show()
{
	if(m_iStatus==_YINFASTATUS_NONE)
		return;	 
	
	
	if(m_iStatus==_YINFASTATUS_CREATE)
	{
		DWORD m_dwElapseTime	=TimeGet()-m_dwLifeBeginTime; 
		double dElapseTime	=(double)m_dwElapseTime/100.0;
		double dOffsetB		=(double)1.0*dElapseTime*dElapseTime/2.0;
		
		int iY0	= m_nPathCount * (m_nMarginWorldPoint.y - m_nCenterWorldPoint.y )/ m_nPathLength + m_nCenterWorldPoint.y + dOffsetB ;
		int iX0	= m_nPathCount * (m_nMarginWorldPoint.x - m_nCenterWorldPoint.x )/ m_nPathLength + m_nCenterWorldPoint.x ;
		
		int nStepPerColor = m_nPathLength / _YINFA_FRAME + 1;		
		int nFrame = (m_nPathCount  )/ nStepPerColor ;		
		if(nFrame >= _YINFA_FRAME)
			nFrame = _YINFA_FRAME - 1;
		if(nFrame < 0)
			nFrame =0;
		int nScreenX,nScreenY;
		g_objGameMap.World2Screen(iX0,iY0,nScreenX,nScreenY);
		CAni * pAni = g_objGameDataSet.GetDataAni("ani/weather.ani",m_szFileTitle);
		if(pAni)
		{
			pAni->Show(nFrame,nScreenX,nScreenY + (m_nPathLength-m_nPathCount), 255,_SHOWWAY_ADDITIVE);
			pAni->Show(nFrame,nScreenX+10,nScreenY+10 + (m_nPathLength-m_nPathCount), 255,_SHOWWAY_ADDITIVE);
		}
		m_nPathCount ++;
		if(m_nPathCount >= m_nPathLength)
		{
			m_iStatus	=_YINFASTATUS_FALL;
			int nRadius;
			nRadius = (m_fRadius + 1)/5;
			if(nRadius <15)
				nRadius = 15;
			m_nFallLenght = rand()%nRadius + 10;
			m_nFallStep = 0;
			m_nFallWorldPoint.x =  m_nMarginWorldPoint.x + rand()% 10;
			if( m_nMarginWorldPoint.y > m_nCenterWorldPoint.y)
				m_nFallWorldPoint.y =  m_nMarginWorldPoint.y - rand()% (nRadius/2);
			else
				m_nFallWorldPoint.y =  m_nMarginWorldPoint.y + rand()% (nRadius/2);
			
		}
	}
	else if(m_iStatus==_YINFASTATUS_FALL)
	{ 
		if(  m_nFallStep >= m_nFallLenght)
		{
			m_iStatus = _YINFASTATUS_END;
			return;
		}	 
			
		m_nFallStep++;
		int iX0,iY0,nScreenx,nScreeny;
		iX0 = m_nFallWorldPoint.x ;
		iY0 = m_nFallWorldPoint.y + m_nFallStep *5 + m_nFallStep * m_nFallStep /50 ;
		g_objGameMap.World2Screen(iX0,iY0,nScreenx,nScreeny);
		CAni * pAni = g_objGameDataSet.GetDataAni("ani/weather.ani",m_szFileTitle);
		if(pAni)
		{
			int nFrame = pAni->GetFrameAmount() -1;
			pAni->Show(nFrame,nScreenx,nScreeny, 255 - 255 * m_nFallStep/m_nFallLenght);//,_SHOWWAY_ADDITIVE);
			pAni->Show(nFrame,nScreenx + 10 ,nScreeny + 10,  255 - 255 * m_nFallStep/m_nFallLenght);//,_SHOWWAY_ADDITIVE);
		}			
	}
	
	return;
}
//--------------------------------------------------------------
void CYinFa2::Destroy(void)
{  
	return;
}

//--------------------------------------------------------------


void CYinFa2::Process()
{
	Show();
	return;
}



BOOL CYinFaSys2::Create(int nScreenX,int nScreenY,int nNum, int nShowNum, int nRadius, int nType,DWORD dwDelayTime)
{
	if( nRadius > 400)
		nRadius = 400;
	if( nRadius < 5 )
		nRadius = 5;
	if(nShowNum > 20)
		nShowNum = 20;
	if(nShowNum <1 )
		nShowNum = 1;
	if(nNum < 1)
		nNum =1;
	if(nType <= 0)
		nType = 1;
	this->m_nYinFaShowNum   = nShowNum;
	this->m_nYinFaTotal		= nNum;
	this->m_nYinFaType		= nType;
	m_nYinFaUsed			= 0;
	m_fRadius				= nRadius; 
	
	sprintf(m_szFileTitle,"%s%d","YinFa",nType);
	
	this->m_iStatu = _YINFA_BEGIN; 
	m_dwCreateTime = TimeGet() + dwDelayTime;
	
	for(int i = 0; i<_MAX_AMOUNT*2; i++)
	{
		CYinFa2 * YinFa = new CYinFa2();
		m_YinFa.push_back(YinFa);
	}
	
	this->m_nInterval	= 0;
	int nCenterX		=nScreenX; 
	int nCenterY		= nScreenY; 
	g_objGameMap.Screen2World( nCenterX  , nCenterY   , m_nOrigWorldPointX, m_nOrigWorldPointY ); 
	m_nCreated			= 1;
	m_dwDelayTime		= dwDelayTime;
	m_dwBeginTime		= TimeGet();
	return TRUE;
}

//--------------------------------------------------------------


void CYinFaSys2::Process()
{ 
	if(m_nCreated != 1)
		return;
	else
	{
		if( (TimeGet() - m_dwBeginTime) < m_dwDelayTime)
			return;
	}
	if(m_iStatu == _YINFA_NONE)
		return;
	int nParticleStep = 4;
	if(m_fRadius>500)
		nParticleStep = 8;
	else
		if(m_fRadius > 300)
			nParticleStep = 6;
		
		
		if( m_iStatu !=  _YINFA_STOP)
		{
			if( !m_YinFa[m_fRadius + m_fRadius*2 /3]->IsCreated())//m_fRadius/3 + m_fRadius /2 +m_fRadius*2 /3
			{
				int x,i;
				this->m_nInterval++;
				
				if(this->m_nInterval > 3)
				{
					float nRx = (float)m_fRadius  ;
					float nRy= (float)nRx*2/3;
					for (float x= -nRx,i= m_fRadius/3 + m_fRadius /2 +m_fRadius*2 /3 ; x< nRx ; x+=nParticleStep)
					{
						if(i>= _MAX_AMOUNT*2)
							break;
						int TargetY = sqrt( abs(nRy * nRy - x * x / (nRx * nRx)  * (nRy * nRy)) ) + m_nOrigWorldPointY;
						int TargetX = x + m_nOrigWorldPointX;	
						m_YinFa[i]->Create( m_nOrigWorldPointX, m_nOrigWorldPointY, TargetX, TargetY, nRx    );
						
						m_YinFa[i++]->SetPicture(m_szFileTitle);
						
						int nOtherSideY = TargetY - m_nOrigWorldPointY;
						TargetY = m_nOrigWorldPointY - nOtherSideY;
						
						m_YinFa[i]->Create( m_nOrigWorldPointX, m_nOrigWorldPointY, TargetX, TargetY, nRx  );					
						m_YinFa[i++]->SetPicture(m_szFileTitle);
						
						
					}
					m_nYinFaUsed += this->m_nYinFaShowNum;
					if(m_nYinFaUsed >= this->m_nYinFaTotal)
					{
						this->YinFaStop();
						
					}
				}
				else	if(this->m_nInterval > 2)
				{
					float nRx = (float)m_fRadius *2/3;			    
					float nRx1 = (float)m_fRadius;
					float nRy1 = (float)m_fRadius*2/3.0f;
					for (  x= -nRx,i= m_fRadius/3 + m_fRadius/2  ; x< nRx ; x+=nParticleStep)
					{
						float x1 = x * 3/2;
						int TargetY = sqrt(  abs(nRy1 * nRy1 - x1 * x1 / (nRx1 * nRx1)  * (nRy1 * nRy1)) ) + m_nOrigWorldPointY;
						int TargetX = x + m_nOrigWorldPointX;	
						m_YinFa[i]->Create( m_nOrigWorldPointX, m_nOrigWorldPointY, TargetX, TargetY, nRx1  );
						m_YinFa[i++]->SetPicture(m_szFileTitle);
						int nOtherSideY = TargetY - m_nOrigWorldPointY;
						TargetY = m_nOrigWorldPointY - nOtherSideY;
						m_YinFa[i]->Create( m_nOrigWorldPointX, m_nOrigWorldPointY, TargetX, TargetY, nRx1   );				 
						m_YinFa[i++]->SetPicture(m_szFileTitle);
					}			 
				}
				else if(this->m_nInterval > 1)
				{
					float nRx = (float)m_fRadius/2.0f;
					float nRx1 = (float)m_fRadius;
					float nRy1 = (float)m_fRadius*2/3.0f;
					for (float x= -nRx,i= m_fRadius/3 ; x< nRx ; x+=nParticleStep)
					{
						float x1 = x * 2;
						int TargetY = sqrt( abs( nRy1 * nRy1 - x1 * x1 / (nRx1 * nRx1)  * (nRy1 * nRy1) )) + m_nOrigWorldPointY;
						int TargetX = x1 + m_nOrigWorldPointX;	
						m_YinFa[i]->Create( m_nOrigWorldPointX, m_nOrigWorldPointY, TargetX, TargetY, nRx1 );				 
						m_YinFa[i++]->SetPicture(m_szFileTitle);
						int nOtherSideY = TargetY - m_nOrigWorldPointY;
						TargetY = m_nOrigWorldPointY - nOtherSideY;
						m_YinFa[i]->Create( m_nOrigWorldPointX, m_nOrigWorldPointY, TargetX, TargetY, nRx1 );				 
						m_YinFa[i++]->SetPicture(m_szFileTitle);
					}		
					
				}
				else
				{
					DXPlaySound("sound/firework1.wav",0,0 );
					float nRx = (float)m_fRadius*3/12.0f;
					float nRy= (float)nRx*2/3.0f;
					float nRx1 = (float)m_fRadius/2;
					float nRy1 = (float)m_fRadius*2/3.0f;
					
					for (float x= -nRx,i=m_fRadius/12 ; x< nRx ; x+=nParticleStep)
					{
						int x1 = x * 4;
						int TargetY = sqrt(  abs(nRy1 * nRy1 - x1 * x1 / (nRx1 * nRx1)  * (nRy1 * nRy1)) ) + m_nOrigWorldPointY;
						int TargetX = x + m_nOrigWorldPointX;	
						m_YinFa[i]->Create( m_nOrigWorldPointX, m_nOrigWorldPointY, TargetX, TargetY, nRx );
						
						m_YinFa[i++]->SetPicture(m_szFileTitle);
						
						
						int nOtherSideY = TargetY - m_nOrigWorldPointY;
						TargetY = m_nOrigWorldPointY - nOtherSideY;
						
						m_YinFa[i]->Create( m_nOrigWorldPointX, m_nOrigWorldPointY, TargetX, TargetY, nRx );					
						m_YinFa[i++]->SetPicture(m_szFileTitle);
						
					}	
					
					nRx = (float)m_fRadius/12.0f;
					nRy= (float)nRx*2/3.0f;
					
					for (x= -nRx,i=0 ; x< nRx ; x+=nParticleStep)
					{		
						int TargetY = sqrt(  abs(nRy * nRy - x * x / (nRx * nRx)  * (nRy * nRy) )) + m_nOrigWorldPointY;
						int TargetX = x + m_nOrigWorldPointX;	
						m_YinFa[i]->Create( m_nOrigWorldPointX, m_nOrigWorldPointY, TargetX, TargetY, nRx );				 
						m_YinFa[i++]->SetPicture(m_szFileTitle);
						int nOtherSideY = TargetY - m_nOrigWorldPointY;
						TargetY = m_nOrigWorldPointY - nOtherSideY;
						m_YinFa[i]->Create( m_nOrigWorldPointX, m_nOrigWorldPointY, TargetX, TargetY, nRx );				 
						m_YinFa[i++]->SetPicture(m_szFileTitle);
						
					}		
				}
		}//end if of is created
	}
	
	else
		if(m_iStatu == _YINFA_STOP)
			if( _YINFASTATUS_END ==m_YinFa[m_fRadius  + m_fRadius /2 ]->IsCreated()  && m_nInterval++ > 255 )
				this->Destroy();
			
	for(DWORD j = 0;j<m_YinFa.size();j++)
		m_YinFa[j]->Process();
			
}

void CYinFaSys2::YinFaStop()
{
	this->m_iStatu = _YINFA_STOP;
}

void CYinFaSys2::Destroy()
{
	if(m_iStatu ==_YINFA_NONE)
		return;
	DWORD i;
	for( i = 0 ;i<m_YinFa.size();i++)	
		SAFE_DELETE(m_YinFa[i]);	
	m_YinFa.clear(); 
	this->m_iStatu = _YINFA_NONE;
	m_nCreated = 2;
	
}



void CFireWork::Create(int nScreenX,int nScreenY,int nNum,  int nRadius, int nType,DWORD dwDelayTime)
{
	CYinFaSys * obj_firework = new CYinFaSys();
	obj_firework->Create(  nScreenX,  nScreenY, nNum,  1,   nRadius,  nType,dwDelayTime);
	this->dequeFireWork.push_back(obj_firework);
}


void CFireWork::Process()
{
	DWORD i;
	
	for (i = 0; i<this->dequeFireWork.size(); i++)
	{
		if(this->dequeFireWork[i]->m_nCreated == 2 )
		{
			SAFE_DELETE( this->dequeFireWork[i]);
			this->dequeFireWork.erase(this->dequeFireWork.begin()+ i);
		}
		else
			this->dequeFireWork[i]->Process();
	}	
}

void CFireWork::Destroy()
{
	DWORD i;
	for(i = 0 ; i<this->dequeFireWork.size() ; i++ )
		SAFE_DELETE( this->dequeFireWork[i]) ;
	this->dequeFireWork.clear();
}




void CFireWork2::Create(int nScreenX,int nScreenY,int nNum,  int nRadius, int nType,DWORD dwDelayTime)
{
	if(nType>5)
		return;
	CYinFaSys2 * obj_firework = new CYinFaSys2();
	obj_firework->Create(  nScreenX,  nScreenY, nNum,  1,   nRadius,  nType,dwDelayTime);
	this->dequeFireWork2.push_back(obj_firework);
}


void CFireWork2::Process()
{
	DWORD i;
	
	for (i = 0; i<dequeFireWork2.size(); i++)
	{
		if(dequeFireWork2[i]->m_nCreated == 2 )
		{
			SAFE_DELETE( dequeFireWork2[i] );
			dequeFireWork2.erase(dequeFireWork2.begin()+ i);
		}
		else
			dequeFireWork2[i]->Process();
	}	
}

void CFireWork2::Destroy()
{
	DWORD i;
	for(i = 0 ; i<dequeFireWork2.size() ; i++ )
		SAFE_DELETE( dequeFireWork2[i] );
	dequeFireWork2.clear();
}



void Firework::Create(int nScreenX,int nScreenY,int nNum,  int nRadius, int nType  ,int color,DWORD dwDelayTime)
{
	
	m_nType = nType;
	switch(m_nType)
	{
	case 0:
		firework1.Create(nScreenX,nScreenY,nNum,nRadius,color,dwDelayTime);
		return;
	case 1:
		firework2.Create(nScreenX,nScreenY,nNum,nRadius,color,dwDelayTime);
		return;
		
	}
}

void Firework::Destroy()
{
	switch(m_nType)
	{
	case 0:
		firework1.Destroy();
		break;
	case 1:
		firework2.Destroy();
		break;
	}
	
}

void Firework::Process()
{
	
	switch(m_nType)
	{
	case 0:
		firework1.Process();
		break;
	case 1:
		firework2.Process();
		break;
	}
}




//------------------------------------------------------------
//
//气候
//
//-------------------------------------------------------------

BOOL CWeather::CreateEnv(int nType,int nWindDir,int nLevel,DWORD dwColor )
{
	if(m_nType != 0)
	{
		if(m_nType != nType)
			Destroy();
		else
		{
			SetEnv(nWindDir,nLevel);
			return 1;
		}
	}
	m_nType = nType;
	
	switch(nType)
	{
	case __RAIN :
		if(nWindDir >40)
			nWindDir = 40;
		if(nWindDir < -40)
			nWindDir = -40;
		
		if(nLevel> _MAX_AMOUNT)
			nLevel =  _MAX_AMOUNT;
		if(nLevel < 2)
			nLevel = 20;
		m_objRain.Create(nWindDir,nLevel,dwColor);		
		return 1;
	case  __SNOW :
		if(nWindDir >30)
			nWind

⌨️ 快捷键说明

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