|
|
背景宽是屏幕宽,足够高(至少两屏高),从底端向定端滚动。主要思想是把屏幕分上、下两部分。正常状态(就是没有滚动到边界)时,上半部分高为0,下半部分就是在背景图片中的矩形;到边界循环时,上半部分是底端的相应矩形,下半部分是定端的相应矩形。滚动的过程就是不断的改变上、下两部分矩形的top、bottom值,在分别画出来。
现在的问题是在滚动到边界的时候画出来的效果是交界处“隐约”有一条黑线。说他“隐
约”有是因为时有时无(好象是循环的有亮到暗),非常奇怪,我怀疑是浮点数的问题,
大伙帮我看看:
void MapSystem::ScrollMap( double s ) //s:每次滚动的距离
{
m_dTopPos += s; //m_dTopPos:屏幕上沿相对于背景底端的距离
m_dBottomPos += s; //m_dBottomPos:屏幕下沿相对于背景底端的距离
switch( m_State )
{
case MS_NORMAL:
m_pLowerHalfBG->GetRect()->top = m_pBackGround->GetRect()->bottom - m_dTopPos;
m_pLowerHalfBG->GetRect()->bottom = m_pBackGround->GetRect()->bottom - m_dBottomPos;
if( m_pLowerHalfBG->GetRect()->top < m_pBackGround->GetRect()->top )
{
m_State = MS_LOOP;
m_dTopPos = (long)m_dTopPos - m_pBackGround->GetHeight();
m_dBottomPos = (long)m_dBottomPos;
m_pUpperHalfBG->GetRect()->top = m_pBackGround->GetRect()->bottom - m_dTopPos;
m_pUpperHalfBG->GetRect()->bottom = m_pBackGround->GetRect()->bottom;
m_pLowerHalfBG->GetRect()->top = m_pBackGround->GetRect()->top;
}
break;
case MS_LOOP:
m_pLowerHalfBG->GetRect()->bottom = m_pBackGround->GetRect()->bottom - m_dBottomPos;
if( m_pLowerHalfBG->GetRect()->bottom <= m_pBackGround->GetRect()->top )
{
m_State = MS_NORMAL;
m_dBottomPos = (long)m_dBottomPos - m_pBackGround->GetHeight();
m_dTopPos = (long)m_dTopPos;
m_pUpperHalfBG->GetRect()->top = m_pUpperHalfBG->GetRect()->bottom = 0;
m_pLowerHalfBG->GetRect()->bottom = m_pBackGround->GetRect()->bottom - m_dBottomPos;
m_pLowerHalfBG->GetRect()->top = m_pBackGround->GetRect()->bottom - m_dTopPos;
}
else
{
m_pUpperHalfBG->GetRect()->top = m_pBackGround->GetRect()->bottom - m_dTopPos;
}
break;
default:
exit( 0 );
break;
}
}
void MapSystem::UpdateGround()
{
m_pGame->GetDisplay()->DrawSurface( m_pLowerHalfBG, 0, m_pUpperHalfBG->GetHeight(),
m_fStretchRate, m_fStretchRate );//画下半部分
m_pGame->GetDisplay()->DrawSurface( m_pUpperHalfBG, 0, 0, m_fStretchRate, m_fStretchRate );//画上半部分
}
void MapSystem::SetBackGround( LPSURFACE2D bg )
{
m_State = MAP_STATE::MS_NORMAL;
m_pBackGround = bg;
m_lLastTime = GetTickCount();
m_fStretchRate = (float)g_nScreenWidth / (float)m_pBackGround->GetWidth();
m_nMapHeight = (float)g_nScreenHeight / m_fStretchRate; //实际一屏在背景图片中的高
SAFE_DELETE( m_pUpperHalfBG );
SAFE_DELETE( m_pLowerHalfBG );
m_pUpperHalfBG = new Surface2D( *m_pBackGround );
m_pLowerHalfBG = new Surface2D( *m_pBackGround );
RECT rect = MakeRect(
m_pBackGround->GetRect()->left,
m_pBackGround->GetRect()->bottom - m_nMapHeight,
m_pBackGround->GetRect()->right,
m_pBackGround->GetRect()->bottom );
m_pUpperHalfBG->GetRect()->top = m_pUpperHalfBG->GetRect()->bottom = 0;
m_pLowerHalfBG->GetRect()->top = m_pBackGround->GetRect()->bottom - m_nMapHeight;//这里m_nMapHeight=480
m_pLowerHalfBG->GetRect()->bottom = m_pBackGround->GetRect()->bottom;
m_dBottomPos = 0.f;
m_dTopPos = 0.f + (double)m_nMapHeight;
}
图中一些数据的说明:
1、Map Height:上下两矩形的高度和,应该时刻等于480(背景图片宽是640),但有时候是
479、481、482,奇怪;
2、Top,Bottom:就是m_dTopPos和m_dBottomPos的值,奇怪的是这两个量的小数部分居然不是时刻相等的;
3、UpHalf,LowHalf:就是上下矩形各点的坐标。
效果图1(明显的一条黑线)
|
-
|