📄 weather.cpp
字号:
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;
}
}
}
return;
}
//--------------------------------------------------------------
void CRain::Destroy(void)
{
return;
}
void CRain::Process()
{
Show();
return;
}
//--------------------------------------------------------------
CRainSys::CRainSys()
{
m_iStatu =_RAIN_NONE;
}
void CRainSys::Pause()
{
DXSetVolume("sound/rain.wav",0,0,0);
m_iStatu = _RAIN_PAUSE;
m_dwPauseTime = TimeGet();
}
void CRainSys::Continue()
{
int nSelfVolume = m_iTargetAmount *4* 100 / _MAX_AMOUNT;
if(nSelfVolume >140)
nSelfVolume = 140;
else
if(nSelfVolume < 65)
nSelfVolume = 65;
DXSetVolume("sound/rain.wav",nSelfVolume,0,0);
if(m_iStatu != _RAIN_PAUSE)
return;
DWORD dwElapseTime = TimeGet() - m_dwPauseTime;
DWORD i;
for(i = 0 ;i<this->m_Rain.size();i++)
m_Rain[i]->m_dwLifeBeginTime += dwElapseTime;
m_iStatu = _RAIN_BEGIN;
}
void CRainSys::SetColor(DWORD dwColor)
{
for(DWORD i=0;i<m_Rain.size();i++)
m_Rain[i]->m_dwColor=dwColor;
}
void CRainSys::SetRain(int nWindDir,int nLevel)
{
if(m_iRainAmount != nLevel)
{
m_iStatu = _RAIN_RESET;
m_iTargetAmount = nLevel;
}
for(DWORD i=0;i<m_Rain.size();i++)
{
m_Rain[i]->m_fSinA = SIN[(abs(nWindDir) + rand()%10)/10];
if(nWindDir < 0)
m_Rain[i]->m_fSinA = - m_Rain[i]->m_fSinA;
m_Rain[i]->m_fCosA = COS[(abs(nWindDir) + rand()%10)/10];
}
m_nWindDirection = nWindDir;
}
int CRainSys::RendBMP(DWORD dwColor)
{
return 1;
}
BOOL CRainSys::Create(int nWindDir= 30 ,int nLevel = 200,DWORD dwColor=0x00ffffff)
{
if(nLevel > _MAX_AMOUNT )
nLevel = _MAX_AMOUNT;
m_iStatu = _RAIN_BEGIN;
m_iRainAmount = 4;
m_dwPauseTime = 0;
m_dwColor = dwColor;
m_iTargetAmount = nLevel;
m_nWindDirection = nWindDir;
for(int i = 0;i< _MAX_AMOUNT ;i++)
{
CRain * rain = new CRain();
m_Rain.push_back(rain);
}
strcpy(m_szFileName[0],"Ripple");
strcpy(m_szFileName[1],"RippleWater");
int nSelfVolume = m_iRainAmount*4 * 100 / _MAX_AMOUNT;
if(nSelfVolume >140)
nSelfVolume = 140;
else
if(nSelfVolume < 35)
nSelfVolume = 35;
DXPlaySound("sound/rain.wav",0,0,0,-1,nSelfVolume);
return TRUE;
}
//----------------------------------------------------------------
void CRainSys::Reset(void)
{
m_iStatu = _RAIN_BEGIN;
m_iRainAmount = 4;
for(DWORD i=0;i<m_Rain.size();i++)
m_Rain[i]->Reset();
int nSelfVolume = m_iRainAmount * 4 *100 / _MAX_AMOUNT;
if(nSelfVolume >140)
nSelfVolume = 140;
else
if(nSelfVolume < 35)
nSelfVolume = 35;
DXSetVolume("sound/rain.wav",nSelfVolume,0,0);
}
//--------------------------------------------------------------
void CRainSys::Process(int & nStatus)
{
if(m_iStatu == _RAIN_NONE)
return;
if(m_iStatu == _RAIN_PAUSE)
return;
for (int i=0;i<this->m_iRainAmount ; i++)
{
if(this->m_iStatu == _RAIN_BEGIN && m_iRainAmount< m_iTargetAmount)
{
int nInternal = m_iRainAmount ;
if(nInternal >199)
nInternal = 199;
nInternal = 200 - nInternal;
if(nInternal < 100)
nInternal = 100;
if(rand()%nInternal == 0)
{
m_iRainAmount +=1;
int nSelfVolume = m_iRainAmount * 3 *100 / _MAX_AMOUNT;
if(nSelfVolume >140)
nSelfVolume = 140;
else
if(nSelfVolume < 55)
nSelfVolume = 55;
DXSetVolume("sound/rain.wav",nSelfVolume,0,0);
}
}
else
if(this->m_iStatu == _RAIN_STOP )
{
if(m_iRainAmount >1)
{
int nInternal = m_iRainAmount ;
if(nInternal >199)
nInternal = 199;
nInternal = 200 - nInternal;
if(nInternal < 100)
nInternal = 100;
if(rand()%nInternal == 0)
{
m_iRainAmount -=1;
int nSelfVolume = m_iRainAmount *3 *100 / _MAX_AMOUNT;
if(nSelfVolume >140)
nSelfVolume = 140;
else
if(nSelfVolume < 55)
nSelfVolume = 55;
DXSetVolume("sound/rain.wav",nSelfVolume,0,0);
}
}
else
{
Destroy();
nStatus = 0;
return ;
}
}
else
{
if(this->m_iStatu == _RAIN_RESET)
if(this->m_iTargetAmount > m_iRainAmount)
{
int nInternal = m_iRainAmount ;
if(nInternal >199)
nInternal = 199;
nInternal = 200 - nInternal;
if(nInternal < 100)
nInternal = 100;
if(rand()%nInternal == 0)
{
m_iRainAmount +=1;
int nSelfVolume = m_iRainAmount * 3 *100 / _MAX_AMOUNT;
if(nSelfVolume >140)
nSelfVolume = 140;
else
if(nSelfVolume < 55)
nSelfVolume = 55;
DXSetVolume("sound/rain.wav",nSelfVolume,0,0);
}
}
else
if(m_iRainAmount > 2 && this->m_iTargetAmount < m_iRainAmount)
{
int nInternal = m_iRainAmount ;
if(nInternal >199)
nInternal = 199;
nInternal = 200 - nInternal;
if(nInternal < 100)
nInternal = 100;
if(rand()%nInternal == 0)
{
m_iRainAmount -=1;
int nSelfVolume = m_iRainAmount * 3 *100 / _MAX_AMOUNT;
if(nSelfVolume >140)
nSelfVolume = 140;
else
if(nSelfVolume < 55)
nSelfVolume = 55;
DXSetVolume("sound/rain.wav",nSelfVolume,0,0);
}
}
}
if(m_iRainAmount > _MAX_AMOUNT)
m_iRainAmount = _MAX_AMOUNT;
if(m_iRainAmount < 0 )
{
Destroy();
nStatus = 0;
return ;
}
if(!m_Rain[i]->IsCreated())
{
int iPosX;
if(this->m_nWindDirection >= 0)
iPosX = rand() % (_SCR_WIDTH + 12* this->m_nWindDirection) - 12 * this->m_nWindDirection;
else
iPosX = rand() % (_SCR_WIDTH - 12* this->m_nWindDirection)+10;
int iSceneDeepth;
if(rand()%2==1)
iSceneDeepth = rand()%16 + 20;
else
iSceneDeepth = rand()%35 + 1 ;
int iPosY =-10;
m_Rain[i]->Create(iPosX,iPosY,iSceneDeepth,this->m_nWindDirection ,1,this->m_iTargetAmount,m_dwColor);
m_Rain[i]->SetRipple(m_szFileName);
}
m_Rain[i]->Process( );
}
return;
}
void CRainSys::RainStop()
{
// DXCloseSound("sound/rain.wav",0,0);
this->m_iStatu = _RAIN_STOP;
}
void CRainSys::Destroy()
{
DXCloseSound("sound/rain.wav",0,0);
for(DWORD i = 0 ;i<m_Rain.size();i++)
SAFE_DELETE(m_Rain[i]);
m_Rain.clear();
this->m_iStatu = _RAIN_NONE;
}
//--------------------------------------------------------------
//--------------------------------------------------------------
//沙
//--------------------------------------------------------------
//--------------------------------------------------------------
CSand::CSand(void)
{
m_iStatus =_SANDSTATUS_NONE;
return;
}
//--------------------------------------------------------------
void CSand::Reset(void)
{
m_iStatus =_SANDSTATUS_NONE;
}
//--------------------------------------------------------------
int CSand::GetInt(double dValue)
{
if((int)(dValue+0.5) > (int)dValue)
return int(dValue)+1;
else
return int(dValue);
}
//--------------------------------------------------------------
BOOL CSand::Create(int iPosX,int iPosY,int iSceneDeepth,int fWind,int fGravity,int nLevel)
{
if(m_iStatus!=_RAINSTATUS_NONE)
return FALSE;
m_iStatus =_SANDSTATUS_CREATE;
m_iStartX = iPosX;
m_iStartY = iPosY;
m_iSceneDeepth = iSceneDeepth;
m_fWind = fWind;
m_dwLifeBeginTime =TimeGet();
m_dwElapseTime =0;
m_iSceneDeepth %=36;
m_iSize =4+2*(36-m_iSceneDeepth)/36 ;
m_fSpeed =4+36*m_iSceneDeepth/36;
m_fGravity = 1;
this->m_nLevel = nLevel;
m_fSinA = SIN[(abs(m_fWind) + rand()%10)/10];
if(m_fWind < 0)
m_fSinA = - m_fSinA;
m_fCosA = COS[(abs(m_fWind) + rand()%10)/10];
m_dwLifeTime = 2000 + 10 *abs(m_fSinA)/1000 +rand()%8 ;
return TRUE;
}
//--------------------------------------------------------------
void CSand::Show()
{
if(m_iStatus==_SANDSTATUS_NONE)
return;
m_dwElapseTime =TimeGet()-m_dwLifeBeginTime;
if(m_dwElapseTime >= m_dwLifeTime)
{
m_iStatus =_SANDSTATUS_NONE;
}
if(m_iStatus==_SANDSTATUS_CREATE)
{
int dOffset = (m_fSpeed * m_dwElapseTime * 1000 * 10 / 60/1000 ) + (m_fGravity* m_dwElapseTime * 1000/60 * m_dwElapseTime * 1000/60 * 10 /1000 / 1000 /2) ;// *10
if(dOffset<=0 && m_dwElapseTime)
{
m_iStatus =_SANDSTATUS_NONE;
}
else
{
int iX0 =m_iStartX + dOffset*m_fCosA * m_iSize/2 * m_nDir/10/1000 +rand()%50;
int iY0 =m_iStartY + dOffset*m_fSinA * m_iSize/20/10/1000 - rand()%50;
int iX1 = iX0 + m_fCosA * m_iSize/2 /1000* m_nDir;
int iY1 = iY0 - m_fSinA * m_iSize/2/1000 ;
if(this->m_nLevel / (_MAX_AMOUNT/3) <1)
{
CMyBitmap::ShowLine(iX0,iY0,iX1,iY1, 0xffffff00);
DWORD dwColor = ((150 + m_iSceneDeepth * 2)<< 24) |(225<<16)|(225<<8)|0;
CMyBitmap::ShowLine(iX0+15* m_nDir,iY0+12,iX1+15* m_nDir,iY1+12, dwColor);
dwColor = ((120 + m_iSceneDeepth * 2)<< 24) |(205<<16)|(205<<8)|0;
CMyBitmap::ShowLine(iX0+10* m_nDir,iY0+5,iX1+10* m_nDir,iY1+5, dwColor);
dwColor = ((100 + m_iSceneDeepth * 2)<< 24) |(205<<16)|(205<<8)|0;
CMyBitmap::ShowLine(iX0 + 60 * m_nDir,iY0+10, iX0 + 60 * m_nDir,iY1+11, dwColor);
}
else if(this->m_nLevel /(_MAX_AMOUNT/3)<2)
{
CMyBitmap::PrepareLine();
DWORD dwColor = (120 + m_iSceneDeepth * 2)<< 24;
dwColor |= 0x00ffad00;
CMyBitmap::ShowRect(iX0, iY0, iX0 + 1, iY0+1,dwColor );
int nOff = rand()% 10 * m_nDir;
dwColor = (150 + m_iSceneDeepth * 2)<<24 | 0x00ffad00;
CMyBitmap::ShowRect(iX0 + nOff, iY0 + nOff, iX0 + 1 + nOff, iY0 + 1 + nOff, dwColor );
CMyBitmap::ShowLine(iX0,iY0,iX1,iY1, 0xffffff00);
dwColor = ((150 + m_iSceneDeepth * 2)<< 24) |(225<<16)|(225<<8)|0;
CMyBitmap::ShowLine(iX0+15* m_nDir,iY0+12,iX1+15* m_nDir,iY1+12, dwColor);
dwColor = ((120 + m_iSceneDeepth * 2)<< 24) |(205<<16)|(205<<8)|0;
CMyBitmap::ShowLine(iX0+10* m_nDir,iY0+5,iX1+10* m_nDir,iY1+5, dwColor);
dwColor = ((100 + m_iSceneDeepth * 2)<< 24) |(205<<16)|(205<<8)|0;
CMyBitmap::ShowLine(iX0 + 60 * m_nDir,iY0+10, iX0 + 60 * m_nDir,iY1+11, dwColor);
}
m_iSplashX =iX0;
m_iSplashY =iY0;
}
}
return;
}
//--------------------------------------------------------------
void CSand::Destroy(void)
{
return;
}
//--------------------------------------------------------------
void CSand::Process()
{
Show();
return;
}
//--------------------------------------------------------------
void CSandSys::Pause()
{
DXSetVolume("sound/sand.wav",0,0,0);
m_iStatu = _SAND_PAUSE;
m_dwPauseTime = TimeGet();
}
void CSandSys::Continue()
{
if(m_iStatu != _SAND_PAUSE)
return;
DWORD dwElapseTime = TimeGet() - m_dwPauseTime;
DWORD i;
for(i = 0 ;i<this->m_Sand.size();i++)
m_Sand[i]->m_dwLifeBeginTime += dwElapseTime;
int nSelfVolume = m_nLevel * 4 *100 / _MAX_AMOUNT;
if(nSelfVolume >140)
nSelfVolume = 140;
else
if(nSelfVolume < 20)
nSelfVolume = 20;
DXSetVolume("sound/sand.wav",nSelfVolume,0,0);
m_iStatu = _SAND_BEGIN;
}
void CSandSys::SetSand(int nWindDir,int nLevel)
{
if(m_nLevel != nLevel)
{
m_iStatu = _SAND_RESET;
m_nLevel = nLevel;
}
for(DWORD i=0;i<m_Sand.size();i++)
{
m_Sand[i]->m_fSinA = SIN[(abs(nWindDir) + rand()%10)/10];
if(nWindDir < 0)
m_Sand[i]->m_fSinA = - m_Sand[i]->m_fSinA;
m_Sand[i]->m_fCosA = COS[(abs(nWindDir) + rand()%10)/10];
}
m_nWindDirection = nWindDir;
}
BOOL CSandSys::Create(int nWindDir= -30 ,int nLevel = 200)
{
m_dwPauseTime = 0;
m_iStatu = _SAND_BEGIN;
m_iSandAmount = 10;
if(nLevel > _MAX_AMOUNT)
nLevel = _MAX_AMOUNT;
m_nLevel = nLevel;
m_iTargetAmount = m_nLevel;
m_nWindDirection = nWindDir;
for(int i = 0;i< _MAX_AMOUNT ;i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -