游戏开发论坛

 找回密码
 立即注册
搜索
查看: 7045|回复: 9

如何实现类似剑侠情缘系列的平滑滚动?

[复制链接]

11

主题

49

帖子

55

积分

注册会员

Rank: 2

积分
55
发表于 2006-1-19 00:07:00 | 显示全部楼层 |阅读模式
正在做一个2D的RPG游戏,但是只要限制帧速,地图滚动的时候就有跳跃的感觉,而不限帧的话,不同机器速度就不一样,很郁闷。

有不少商业游戏地图滚动的时候都是跳得厉害,看了很不爽。

但是剑侠情缘系列,不论游戏速度怎么设置滚动都非常平滑,很想知道是怎么实现的。

这里有高人能指点一下吗?感激不尽!

2万

主题

2万

帖子

6万

积分

论坛元老

Rank: 8Rank: 8

积分
66489
QQ
发表于 2006-1-19 09:26:00 | 显示全部楼层

Re:如何实现类似剑侠情缘系列的平滑滚动?

不是《剑侠情缘》,N年前的《轩辕剑3》就已经做到了。

对地图的移动以象素为单位每一帧移动,而不是以角色每走一步才移动就可。

11

主题

49

帖子

55

积分

注册会员

Rank: 2

积分
55
 楼主| 发表于 2006-1-19 15:19:00 | 显示全部楼层

Re:如何实现类似剑侠情缘系列的平滑滚动?

呵呵,谢谢你和我讨论。
不过我说的就是在以象素为单位的前提下的平滑滚动。

在游戏循环中:
const int DELAY = 10;

void GameRun()
{
        static double DelayTick = DELAY * freq / 1000;
        static LARGE_INTEGER time;

        QueryPerformanceCounter(&time);
        now = (double)time.QuadPart;
        if(now < old + DelayTick )
                return;
        old=now;
       
        // 游戏主逻辑
}

11

主题

49

帖子

55

积分

注册会员

Rank: 2

积分
55
 楼主| 发表于 2006-1-19 15:20:00 | 显示全部楼层

Re:如何实现类似剑侠情缘系列的平滑滚动?

在游戏主逻辑中,我有类似以下的代码:

11

主题

49

帖子

55

积分

注册会员

Rank: 2

积分
55
 楼主| 发表于 2006-1-19 15:25:00 | 显示全部楼层

Re:如何实现类似剑侠情缘系列的平滑滚动?

if (GetAsyncKeyState(VK_LEFT))
{
x -= 1;
}

DrawMap();

问题是,在限制帧速的过程中,我只能限制下限,却限制不了上限。每次进入循环时,若每到刷新时刻则直接返回,但这样下一次进入循环的时候,可能已经超过了刷新时间。这种后果是,每次刷新的间隔不同,所以地图运动起来时快时慢。

11

主题

49

帖子

55

积分

注册会员

Rank: 2

积分
55
 楼主| 发表于 2006-1-19 15:50:00 | 显示全部楼层

Re: 如何实现类似剑侠情缘系列的平滑滚动?

贴一个滚动不平滑的演示,左右箭头控制地图滚动,Esc退出。

sf_2006119154938.rar

634.62 KB, 下载次数:

2万

主题

2万

帖子

6万

积分

论坛元老

Rank: 8Rank: 8

积分
66489
QQ
发表于 2006-1-20 17:11:00 | 显示全部楼层

Re:如何实现类似剑侠情缘系列的平滑滚动?

我不知道你的逻辑循环是否和画面刷新同步.

你不要收到按钮后就移动坐标值.应该是在每次重绘画面时移动坐标值.

11

主题

49

帖子

55

积分

注册会员

Rank: 2

积分
55
 楼主| 发表于 2006-1-21 09:48:00 | 显示全部楼层

Re: 如何实现类似剑侠情缘系列的平滑滚动?

演示的主循环代码如下:
void GameRun()
{
        const int DELAY = 16;
        static double DelayTick = DELAY * freq / 1000;
        static int x = 0, y = 0;
        static double now, old;

        LARGE_INTEGER time;
        QueryPerformanceCounter(&time);
        now = (double)time.QuadPart;

        if (now - old < DelayTick)
        {
                return;
        }
        old = now;

        GetGraphics()->ClearScreenMMX(0);
        GetGraphics()->DrawBitmapMMX(x, y, bg, SCREENBUFFER);
        GetGraphics()->DrawBitmapMMX(x - 640, y, bg, SCREENBUFFER);
        GetGraphics()->DrawBitmapMMX(x + 640, y, bg, SCREENBUFFER);

        GetGraphics()->UpdateScreen();
        GetGraphics()-&gtresent();


        if (GetAsyncKeyState(VK_LEFT))
        {
                x -= 2;
                if (x < -640)
                        x = 0;
        }
        if (GetAsyncKeyState(VK_RIGHT))
        {
                x += 2;
                if (x > 640)
                        x = 0;
        }
}

能详细指点一下吗?谢谢!

11

主题

49

帖子

55

积分

注册会员

Rank: 2

积分
55
 楼主| 发表于 2006-1-21 09:51:00 | 显示全部楼层

Re:如何实现类似剑侠情缘系列的平滑滚动?

程序主循环是这样写的:

while (true)
        {
                if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) )
                {
                        if( !GetMessage( &msg, NULL, 0, 0 ) )
                        {
                                break;
                        }
                        TranslateMessage( &msg );
                        DispatchMessage( &msg );
                }

                GameRun();
        }

2万

主题

2万

帖子

6万

积分

论坛元老

Rank: 8Rank: 8

积分
66489
QQ
发表于 2006-1-21 15:48:00 | 显示全部楼层

Re:如何实现类似剑侠情缘系列的平滑滚动?

你必须限制帧数,因为某些配置存在垂画同步关闭状态!

保证每帧只移动1或2个点,就可以保证平滑移动.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-24 07:12

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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