游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1785|回复: 5

一个背景循环滚动的问题,真见鬼...

[复制链接]

14

主题

61

帖子

65

积分

注册会员

Rank: 2

积分
65
发表于 2006-4-19 21:26:00 | 显示全部楼层 |阅读模式
背景宽是屏幕宽,足够高(至少两屏高),从底端向定端滚动。主要思想是把屏幕分上、下两部分。正常状态(就是没有滚动到边界)时,上半部分高为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(明显的一条黑线)
sf_200641921269.jpg

14

主题

61

帖子

65

积分

注册会员

Rank: 2

积分
65
 楼主| 发表于 2006-4-19 21:50:00 | 显示全部楼层

Re: 一个背景循环滚动的问题,真见鬼...

效果图2(黑线变淡...)
sf_2006419215011.jpg

14

主题

61

帖子

65

积分

注册会员

Rank: 2

积分
65
 楼主| 发表于 2006-4-19 22:27:00 | 显示全部楼层

Re: 一个背景循环滚动的问题,真见鬼...

效果图3(完美...可惜只有一瞬间)
sf_2006419222635.jpg

64

主题

855

帖子

856

积分

高级会员

Rank: 4

积分
856
QQ
发表于 2006-4-20 09:51:00 | 显示全部楼层

Re:一个背景循环滚动的问题,真见鬼...

怀疑是Rect的范围少了一行像素

14

主题

61

帖子

65

积分

注册会员

Rank: 2

积分
65
 楼主| 发表于 2006-4-20 11:01:00 | 显示全部楼层

Re:一个背景循环滚动的问题,真见鬼...

楼上,那第三张图怎么解释。。
我的背景是640*1536,上下矩形高的和应该是480(这点比较郁闷,明明同时增减的top和bottom,有时候高居然不是480)。

0

主题

12

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2006-4-21 20:18:00 | 显示全部楼层

Re:一个背景循环滚动的问题,真见鬼...

应该就是浮点数的问题,改改试试?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-24 07:04

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表