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

📄 weather.cpp

📁 网络游戏魔域源代码 测试可以完整变异
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		{
			m_dwLifeBeginTime	=TimeGet();
			m_dwElapseTime		=0;
			m_dwLifeTime		=2000;
			m_iStatus			=_SNOWSTATUS_SPLASH;
		}
		else if(m_iStatus==_SNOWSTATUS_SPLASH)
			m_iStatus	=_SNOWSTATUS_NONE;
	}
	
	if(m_iStatus==_SNOWSTATUS_CREATE)
	{		 
		
		int dOffset		=m_fSpeed*m_dwElapseTime*10/20;	 
		if(dOffset<=0 && m_dwElapseTime)
		{
			m_iStatus	=_SNOWSTATUS_NONE;
		}
		else
		{
			int iPosX	=m_iStartX+dOffset*m_fSinA/10/1000;
			int iPosY	=m_iStartY+dOffset*m_fCosA/10/1000;			 
			this->ShowImage(iPosX, iPosY);
			
		}
	}
	else if(m_iStatus==_SNOWSTATUS_SPLASH)
	{
	      	int iScreenX=0,iScreenY=0;
			g_objGameMap.World2Screen(m_iSplashX,m_iSplashY,iScreenX,iScreenY);	 
			CAni * pAni = g_objGameDataSet.GetDataAni("ani/weather.ani",m_szFileName);
			if(pAni)
				pAni->Show(0,iScreenX,iScreenY,242- m_nStayTick * 8);
			
            if(++m_nStayTick >= 30)
			{
				m_iStatus	= _SNOWSTATUS_NONE;
				m_nStayTick = 0;
            }
	} 
	
	return;
}

//--------------------------------------------------------------
void CSnow::Destroy(void)
{
	return;
}
//--------------------------------------------------------------

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

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

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

void CSnowSys::Pause()
{
	m_iStatu = _SNOW_PAUSE;
	m_dwPauseTime = TimeGet();
	DXSetVolume("sound/sand.wav",0,0,0); 
	
}
void CSnowSys::Continue()
{
	if(m_iStatu != _SNOW_PAUSE)
		return;
	DWORD dwElapseTime = TimeGet() -  m_dwPauseTime;
	DWORD i;
	for(i = 0 ;i<this->m_Snow.size();i++)
		m_Snow[i]->m_dwLifeBeginTime += dwElapseTime;
	m_iStatu = _SNOW_BEGIN;
	int nSelfVolume = m_iTargetAmount * 500 / LEAF_MAX_AMOUNT;
	if(nSelfVolume >120)
		nSelfVolume = 120;
	else
		if(nSelfVolume < 20)
			nSelfVolume = 20;
	DXSetVolume("sound/sand.wav",nSelfVolume,0,0); 
}
void CSnowSys::Init(void)
{
	m_iSnowAmount	=0;
	m_iStatu = _SNOW_NONE;
}

//--------------------------------------------------------------
void CSnowSys::Destroy(void)
{		
	for(DWORD i = 0 ;i<m_Snow.size();i++)	 
		SAFE_DELETE(m_Snow[i]); 	 
	m_Snow.clear();
	DXCloseSound("sound/sand.wav",0,0);
	Init();
	
}

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


BOOL CSnowSys::Create(int iWindDir, int iLevel,DWORD dwColor = 0x00ffffff)
{ 
	
	strcpy(m_szFileName,"Snow"); 
	m_dwPauseTime	= 0;	
	m_iSnowAmount	= 4;
	m_iTargetAmount = iLevel;
	m_iStatu		= _SNOW_BEGIN;
	m_iWindDir		= iWindDir;
	for(int i = 0;i< _MAX_AMOUNT ;i++)
	{
		CSnow * obj_snow = new CSnow();
		m_Snow.push_back(obj_snow);
	}
	int nSelfVolume = m_iSnowAmount * 200 / LEAF_MAX_AMOUNT;
	if(nSelfVolume >120)
		nSelfVolume = 120;
	else
		if(nSelfVolume < 20)
			nSelfVolume = 20;
		DXPlaySound("sound/sand.wav",0,0,0,-1,nSelfVolume); 
		
		
		return true;
}

//--------------------------------------------------------------
void CSnowSys::SetSnow(int nWindDir,int nLevel)
{
	if(m_iTargetAmount != nLevel)
	{
		m_iStatu = _SNOW_RESET;
		m_iTargetAmount = nLevel;
	
	}
	for(DWORD i=0;i<m_Snow.size();i++)
	{	 
		m_Snow[i]->m_fSinA				= SIN[(abs(nWindDir) + rand()%10)/10];
		if(nWindDir < 0)
			m_Snow[i]->m_fSinA = - m_Snow[i]->m_fSinA;
		m_Snow[i]->m_fCosA				= COS[(abs(nWindDir) + rand()%10)/10];		
	}
	this->m_iWindDir = nWindDir;
	
}
void CSnowSys::Reset(void)
{
	m_iSnowAmount	=4;
	for(DWORD i=0;i<m_Snow.size();i++)
	{
		m_Snow[i]->Reset();
	}
	int nSelfVolume = m_iSnowAmount * 400 / LEAF_MAX_AMOUNT;
	if(nSelfVolume >120)
		nSelfVolume = 120;
	else
		if(nSelfVolume < 20)
			nSelfVolume = 20;
	DXSetVolume("sound/sand.wav",nSelfVolume,0,0); 
		
}
void CSnowSys::SnowStop()
{
//	DXCloseSound("sound/sand.wav",0,0);
	m_iStatu = _SNOW_STOP;
}
//--------------------------------------------------------------


void CSnowSys::Process(int & nStatus)
{
	if(m_iStatu == _SNOW_NONE)
		return;
	if(m_iStatu == _SNOW_PAUSE)
		return;
	for (int i=0;i<m_iSnowAmount;i++)
	{	
		if(m_iStatu == _SNOW_BEGIN && m_iSnowAmount < m_iTargetAmount)
		{
			int nInternal = m_iSnowAmount ;
			if(nInternal >199)
				nInternal = 199;
			nInternal = 200 - nInternal;
			if(rand()%nInternal == 0)
			{
				m_iSnowAmount	++;
				int nSelfVolume = m_iSnowAmount * 4 *100 / LEAF_MAX_AMOUNT;
				if(nSelfVolume >120)
					nSelfVolume = 120;
				else
					if(nSelfVolume < 20)
						nSelfVolume = 20;
					DXSetVolume("sound/sand.wav",nSelfVolume,0,0); 
			}
		}
		else
			if(this->m_iStatu == _SNOW_STOP )
			{
				if(m_iSnowAmount > 1)
				{
					int nInternal = m_iSnowAmount ;
					if(nInternal >199)
						nInternal = 199;
					nInternal = 200 - nInternal;
					if(rand()%nInternal == 0)
					{
						m_iSnowAmount -=1;						
						int nSelfVolume = m_iSnowAmount * 400 / LEAF_MAX_AMOUNT;
						if(nSelfVolume >120)
							nSelfVolume = 120;
						else
							if(nSelfVolume < 20)
								nSelfVolume = 20;
							DXSetVolume("sound/sand.wav",nSelfVolume,0,0); 
					}

				}
				else
				{
					this->Destroy();
					nStatus = 0;
					return;
				}
				
			}
			else
				if(this->m_iStatu == _SNOW_RESET)
					if(this->m_iTargetAmount > m_iSnowAmount)
					{

						int nInternal = m_iSnowAmount ;
						if(nInternal >199)
							nInternal = 199;
						nInternal = 200 - nInternal;
						if(rand()%nInternal == 0)
						{
							m_iSnowAmount	++;
							int nSelfVolume = m_iSnowAmount * 400 / LEAF_MAX_AMOUNT;
							if(nSelfVolume >120)
								nSelfVolume = 120;
							else
								if(nSelfVolume < 20)
									nSelfVolume = 20;
								DXSetVolume("sound/sand.wav",nSelfVolume,0,0); 
						}
					}
					else					
						if(m_iSnowAmount >m_iTargetAmount && m_iSnowAmount >15)
						{
							int nInternal = m_iSnowAmount ;
							if(nInternal >199)
								nInternal = 199;
							nInternal = 200 - nInternal;
							if(rand()%nInternal == 0)
							{
								m_iSnowAmount -=1;						
								int nSelfVolume = m_iSnowAmount * 400 / LEAF_MAX_AMOUNT;
								if(nSelfVolume >120)
									nSelfVolume = 120;
								else
									if(nSelfVolume < 20)
										nSelfVolume = 20;
									DXSetVolume("sound/sand.wav",nSelfVolume,0,0); 
							}
						}
			if(m_iSnowAmount > _MAX_AMOUNT)
				m_iSnowAmount = _MAX_AMOUNT;
			if(m_iSnowAmount <0)
			{
				this->Destroy();
				return;
			}
			
			if(!m_Snow[i]->IsCreated())
			{
				int iPosX;
				if(m_iWindDir >= 5)			 
					iPosX	= rand() % (_SCR_WIDTH +  500)  - 500;
				else
					if(m_iWindDir < -2)
						iPosX	= rand() % (_SCR_WIDTH +400); 
					else
						iPosX = rand() % (_SCR_WIDTH +  300)  - 150;
					
					int iPosY		=-1*(rand()%50)-20;
					
					int iSceneDeepth=rand()%16+4;
					
					int fWind   = m_iWindDir - rand()%5;
					
					m_Snow[i]->Create(iPosX,iPosY,iSceneDeepth,fWind,1);
					m_Snow[i]->SetImageBmp(m_szFileName);									
			}
			
			m_Snow[i]->Process();						
	}
	
	return;
}


//--------------------------------------------------------------
//雨
//--------------------------------------------------------------

//--------------------------------------------------------------
CRain::CRain(void)
{
	m_iStatus		=_RAINSTATUS_NONE;
	return;
}

//--------------------------------------------------------------
void CRain::Reset(void)
{
	m_iStatus		=_RAINSTATUS_NONE;
}

//--------------------------------------------------------------
int	CRain::GetInt(double dValue)
{
	if((int)(dValue+0.5) > (int)dValue)
		return int(dValue)+1;
	else
		return int(dValue);
}

//--------------------------------------------------------------
BOOL CRain::Create(int iPosX,int iPosY,int iSceneDeepth,int fWind,int fGravity,int nLevel,DWORD dwColor)
{
	
	if(m_iStatus!=_RAINSTATUS_NONE)
		return FALSE;
	
	m_iStatus			=_RAINSTATUS_CREATE;
	m_iStartX			= iPosX;
	m_iStartY			=iPosY;
	m_iSceneDeepth		=iSceneDeepth;
	m_iSceneDeepth	   %=36;
	m_fWind				=fWind ; 
	m_dwLifeBeginTime	=TimeGet();
	m_dwElapseTime		=0;
	m_dwColor			=dwColor;
	
	m_iSize				=6+4*(36-m_iSceneDeepth)/36 ; 
	m_iSize += nLevel/400;
	m_fSpeed			= 1+36*m_iSceneDeepth/36; 
	m_fGravity			= fGravity*(36-m_iSceneDeepth)/9  ;	
	m_nLevel			= nLevel;		
	m_fSinA				= SIN[abs(m_fWind)/10];
	if(m_fWind < 0)
		m_fSinA = - m_fSinA;
	m_fCosA				= COS[abs(m_fWind)/10];
	int nBase = 3600;
	if(_SCR_WIDTH == 1024)
		nBase = 4600;
	
	m_dwLifeTime		= (nBase + abs(m_fSinA)/10)*(36-m_iSceneDeepth)/36 ;
	m_iSplashX			= 0;
	m_iSplashY			= 0;
	m_iRippleFrameIndex	= 0;
	m_iLastPosX			= 0;
	m_iLastPosY			= 0;
	
	return TRUE;
}

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


void CRain::Show()
{
	if(m_iStatus==_RAINSTATUS_NONE)
		return;
	
	m_dwElapseTime	=TimeGet()-m_dwLifeBeginTime;
	if(m_dwElapseTime >= m_dwLifeTime)
	{
		if(m_iStatus==_RAINSTATUS_CREATE)
		{
			m_dwLifeBeginTime	=TimeGet();
			m_dwElapseTime		=0;
			m_dwLifeTime		=1800*(36-m_iSceneDeepth)/36 + 10 * m_fSinA +80 ;
			m_iStatus			=_RAINSTATUS_SPLASH;
			
			WORD uMask;
			int nCellx,nCelly;
			g_objGameMap.World2Cell(this->m_iSplashX,this->m_iSplashY,nCellx,nCelly);
			
			CellInfo *c;
			c=g_objGameMap.GetCell(nCellx,nCelly);
			LayerInfo* pLayer = g_objGameMap.GetLastLayerInfo(c);
			this->m_bOnWater = 0;
			if(pLayer)
			{
				uMask = pLayer->usTerrain;
				if(uMask == 1)
					this->m_bOnWater = 1;	 
				
			}
			
		}
		else if(m_iStatus==_RAINSTATUS_SPLASH)
			m_iStatus	=_RAINSTATUS_NONE;
	}
	
	if(m_iStatus==_RAINSTATUS_CREATE)
	{		
		float dElapseTime	=(float)m_dwElapseTime/380.0;	
		float dOffsetA		=m_fSpeed*dElapseTime;
		float dOffsetB		=m_fGravity*dElapseTime*dElapseTime/2.0;
		float dOffset		=dOffsetA+dOffsetB;
		//	int 	dOffset		= (m_fSpeed * m_dwElapseTime * 1000  *  10 / 380/1000 ) + (m_fGravity* m_dwElapseTime * 1000/380   * m_dwElapseTime * 1000/380 * 10 /1000 / 1000 /2)  ;// *10
		
		if(dOffset<=0 && m_dwElapseTime)
		{
			m_iStatus	=_RAINSTATUS_NONE;
		}
		else
		{	
			int iX0	=m_iStartX + dOffset*m_fSinA * m_iSize/1000; 
			int iY0	=m_iStartY + dOffset*m_fCosA * m_iSize/1000; 
			
			int iX1	=iX0 + m_iSize*m_fSinA/1000 ;
			int iY1	=iY0 + m_iSize*m_fCosA/1000 ;		
			
			DWORD dwColor;
			int nAlpha;
			
			if(this->m_nLevel / (_MAX_AMOUNT/3) <1)
				nAlpha = 110  + (36-m_iSceneDeepth);		
			else if(this->m_nLevel /(_MAX_AMOUNT/3)<2)
				nAlpha = 130 + (36-m_iSceneDeepth);
			else
				nAlpha = 140 + (36-m_iSceneDeepth);		 
			
			if(m_dwColor == 0x00ffffff)
			{
				dwColor = 0x00000000;
				dwColor|=((36-m_iSceneDeepth + 2) *3 + 100)<< 16;
				dwColor|=((36-m_iSceneDeepth + 2) *3 + 100)<<8;
				dwColor|=((36-m_iSceneDeepth + 2) *3 + 100);
				dwColor|= nAlpha <<24;	
			}
			else
			{
				
				dwColor = m_dwColor;
				int nr = dwColor >>16 & 0x00ff;				
				nr = nr - m_iSceneDeepth ;
				if(nr<0)
					nr =0;
				int ng = dwColor >> 8 &0x0000ff;
				ng = ng - m_iSceneDeepth;
				if(ng<0)
					ng =0;
				int nb = dwColor &0x000000ff;
				nb = nb - m_iSceneDeepth;
				if(nb<0)  
					nb =0;
				dwColor = (nAlpha<<24)|(nr<<16)|(ng<<8)| nb;
			}			 
			CMyBitmap::ShowLine(iX0,iY0,iX1,iY1,dwColor);
			g_objGameMap.Screen2World(iX1,iY1,m_iSplashX,m_iSplashY);		 		
			m_iRippleFrameIndex	=0;
		}
	}
	else if(m_iStatus==_RAINSTATUS_SPLASH)
	{	
		
		int iScreenX,iScreenY;
		g_objGameMap.World2Screen(m_iSplashX,m_iSplashY,iScreenX,iScreenY);
		CMyBitmap::PrepareSprite();
		
		if(m_bOnWater)
		{	
			m_iRippleFrameIndex++;
			CAni * pAni = g_objGameDataSet.GetDataAni("ani/weather.ani",m_szFileName[1]);
			if(pAni)
			{
				if(m_dwColor!= 0x00ffffff)
				{
					CMyBitmap *pBmp = pAni->GetFrame(m_iRippleFrameIndex++);
					if(m_iRippleFrameIndex >= pAni->GetFrameAmount())
						m_iStatus	=_RAINSTATUS_NONE;
					int r,g,b;
					r= m_dwColor >>16 & 0xff;
					g = m_dwColor>>8 & 0xff;
					b = m_dwColor & 0xff;
					pBmp->SetColor(200,r,g,b);
					pBmp->Show(iScreenX,iScreenY);
				}
				else
					if(pAni->Show(m_iRippleFrameIndex,iScreenX,iScreenY))
					{
						m_iStatus	=_RAINSTATUS_NONE;
					}	
			}
		}
		else
		{
			CAni * pAni = g_objGameDataSet.GetDataAni("ani/weather.ani",m_szFileName[0]);
			if(pAni)
			{
				if(m_dwColor!= 0x00ffffff)
				{
					CMyBitmap *pBmp = pAni->GetFrame(m_iRippleFrameIndex++);
					if(m_iRippleFrameIndex >= pAni->GetFrameAmount())
						m_iStatus	=_RAINSTATUS_NONE;
					int r,g,b;
					r= m_dwColor >>16 & 0xff;
					g = m_dwColor>>8 & 0xff;

⌨️ 快捷键说明

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