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