【问题标题】:Multiplayer game programming多人游戏编程
【发布时间】:2012-03-29 10:20:41
【问题描述】:

我正在开发一款应该可以同时让多个玩家玩的游戏。这是一个2D 游戏,所有角色都应该能够看到彼此在屏幕上移动。 就像现在的游戏一样,所有设备都只是发布并相互获取coordinates 到服务器。这是通过运行到线程来完成的:

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();
}

无论如何,我希望角色移动更顺畅,因为这样做可能有点像"laggy"。有人知道我如何实现这个目标吗?

也许我应该有一种坐标堆栈,它总是将坐标推送到它,然后在游戏运行时弹出值?

我们将不胜感激。

您好!

【问题讨论】:

    标签: android network-programming multiplayer


    【解决方案1】:

    我知道这是 Flash,但这是一个很好的教程来改进玩家的移动: http://playerio.com/documentation/tutorials/building-flash-multiplayer-games-tutorial/

    【讨论】:

    • 很好的参考,我强烈推荐!
    【解决方案2】:

    查看线性插值/外插方法以帮助平滑运动。 http://en.wikipedia.org/wiki/Linear_interpolation

    这里有一些关于如何在实践中实现许多数值算法的资源 http://www.nr.com/

    祝你好运!

    【讨论】:

    • 谢谢,看起来线性插值可以帮上忙。在 racer.nl/tech/multiplayer.html 上找到了一个例子
    • 这个想法听起来如何:我正在使用线性插值并确定每次屏幕更新时它应该移动多少帧。因此,如果(本例中我只关注 X 坐标)之前的坐标是 40(角色现在在屏幕上的位置),当前坐标是 60(角色应该移动到的位置),并且每次更新的帧更新间隔为 5 个坐标。这意味着我将在角色达到 60 之前获得 4 (4*5) 次更新。所以我只会将此动作添加到给定角色的事件列表中,而“滞后”部分将几乎消失 :)跨度>
    • 基本上这是一个处理先前数据的过程(插值)并猜测在接收到下一组数据之前会发生什么(外插)。如果网络刷新率为 10 FPS 并且您的更新循环为 60 FPS,则您必须在考虑之前的移动的情况下推断(猜测)5 个点,以便获得平滑的遍历线。当您从网络中获得下一个点时,您对前一组点的实际数据进行插值,然后再次外推(猜测)接下来的 5 个点,依此类推。这有意义吗?
    • 我想我明白你在告诉我什么 :) 但我想在这种情况下我必须重写我的代码,因为我的思维方式是错误的:-/
    • 如果您可以存储/访问当前和最后一个“滴答声”的一阶偏导数(iow、速度),我强烈建议您研究三次样条插值。我在星系模拟器中使用它,即使每次渲染 50 帧,它看起来也很棒。
    猜你喜欢
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多