📄 weather.cpp
字号:
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 + -