多人游戏编程

5

我正在开发一个多人同时游玩的游戏。这是一个2D游戏,所有角色都应该能够在屏幕上看到彼此移动。 目前,所有设备只需将彼此的坐标发布并获取到服务器上。这是通过运行两个线程来完成的:

public void StartCoordinatorFetcherThread(final Sprite Object)
{
    Thread CoordinateStarter = new Thread()
    {
        public void run()
        {           
            while(true)
            {
                Object.testing = Object.InternetObject.GetMessages();
                try {
                    Thread.sleep(20);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    };
    CoordinateStarter.start();
}

public void StartCoordinatorPosterThread(final Sprite Object)
{
    Thread CoordinatePoster = new Thread()
    {
        public void run()
        {           
            while(true)
            {
                Object.InternetObject.PostCoordinates(Object.x,Object.y);
                try {
                    Thread.sleep(20);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    };
    CoordinatePoster.start();
}

无论如何,我希望角色的移动更加流畅,因为这样做可能会有一些“延迟”。有人有想法能够实现这个目标吗? 也许我应该有一种坐标堆栈,只需不断地将坐标推入其中,然后在游戏运行时弹出值? 任何帮助都将不胜感激。 问候!
2个回答

3

1
好的参考资料,我强烈推荐! - Araw

2

谢谢,看起来线性插值可以帮上忙。在这里找到一个例子http://www.racer.nl/tech/multiplayer.html - Araw
这个想法听起来怎么样: 我使用线性插值并确定每次屏幕更新时应移动多少帧。因此,如果(我只关注此示例的X坐标)先前的坐标为40(角色在屏幕上的位置),当前坐标为60(角色应该移动到的位置),并且每次更新的帧间隔为5个坐标。这意味着在角色到达60之前,我将获得4(4 * 5)次更新。因此,我只会将这些移动添加到给定角色的事件列表中,“延迟”部分将被虚拟消除 :) - Araw
基本上,这是一个处理以前数据(插值)并猜测在接收到下一组数据之前会发生什么(外推)的过程。如果网络刷新速率为10 FPS,您的更新循环为60 FPS,那么您必须外推(猜测)5个点,并考虑先前的移动,以便获得平滑的遍历线路。当您从网络获取下一个点时,您将在以前的点集上对实际数据进行插值,然后再次外推(猜测)下一个5个点,以此类推。这有意义吗? - Marko Hlebar
我想我明白你告诉我的内容 :) 但是我猜我必须重写我的代码,因为我的思路是错误的 :-/ - Araw
1
如果您可以存储/访问当前和上一个“刻度”的一阶偏导数(即速度),我强烈建议研究三次样条插值。我在星系模拟器中使用它,即使每个“刻度”渲染50帧,效果也非常出色。 - Philip Guin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接