8

我在 J2ME 中工作,我的游戏循环执行以下操作:

public void run() {
        Graphics g = this.getGraphics();
        while (running) {
            long diff = System.currentTimeMillis() - lastLoop;
            lastLoop = System.currentTimeMillis();
            input();
            this.level.doLogic();
            render(g, diff);
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                stop(e);
            }
        }
    }

所以它只是一个基本的游戏循环,该doLogic()函数调用场景中角色的所有逻辑函数并render(g, diff)调用场景animateChar中每个角色的animChar函数,然后,Character类中的函数将屏幕中的所有内容设置为:

protected void animChar(long diff) {
        this.checkGravity();
        this.move((int) ((diff * this.dx) / 1000), (int) ((diff * this.dy) / 1000));
        if (this.acumFrame > this.framerate) {
            this.nextFrame();
            this.acumFrame = 0;
        } else {
            this.acumFrame += diff;
        }
    }

这确保了我必须根据机器从一个周期到另一个周期所花费的时间来移动所有东西(记住它是一部手机,而不是游戏装备)。我确信这不是实现这种行为的最有效方法,所以我完全愿意在评论中批评我的编程技巧,但我的问题是:当我让我的角色跳跃时,我所做的就是把他的dy为负值,例如 -200,我将布尔跳转设置为 true,这使角色上升,然后我调用了这个函数checkGravity(),以确保上升的所有内容都必须下降,checkGravity同时检查角色是否在平台上,所以为了您的时间,我将把它删掉一点:

public void checkGravity() {
        if (this.jumping) {
            this.jumpSpeed += 10;
            if (this.jumpSpeed > 0) {
                this.jumping = false;
                this.falling = true;
            }
            this.dy = this.jumpSpeed;
        }
        if (this.falling) {
            this.jumpSpeed += 10;
            if (this.jumpSpeed > 200) this.jumpSpeed = 200;
            this.dy = this.jumpSpeed;
            if (this.collidesWithPlatform()) {
                this.falling = false;
                this.standing = true;
                this.jumping = false;
                this.jumpSpeed = 0;
                this.dy = this.jumpSpeed;
            }
        }
    }

所以,问题是,这个函数会更新dy而不管diff,使角色在慢速机器中像超人一样飞行,我不知道如何实现diff因子,这样当一个角色跳跃时,他的速度减慢与游戏速度成正比的方式。谁能帮我解决这个问题?或者给我指点如何在 J2ME 中以正确的方式进行 2D 跳转

4

4 回答 4

5

您不应该根据经过的时间调整 jumpSpeed 吗?也就是说,速度可能会变化 -75/秒,因此您的差异应该是应用于 jumpSpeed 的变化量的权重。

因此,将 diff 传递给 checkGrav 并执行类似... jumpSpeed += (diff * (rate_per_second)) / 1000;

(假设差异以毫秒为单位)

(理想情况下,这会让它就像真正的重力:D)

于 2009-05-29T00:20:44.457 回答
3

为什么不通过 diff 缩放所有常量?

顺便说一句,我很尴尬地这么说,但我在一个商业游戏中工作,其中重力对角色的下降是上升的两倍。出于某种原因,人们更喜欢这个。

于 2009-05-29T00:14:16.123 回答
0

这似乎更多是关于游戏设计的问题,而不是跳跃的数学问题。一个常见的问题是,在不同处理器上运行的游戏中,一个游戏会执行得更快,而在其他游戏上会执行得更慢(从而改变游戏的整体速度)。我不确定游戏中的常见做法是什么,但每当我制作自制的 2D 游戏(制作它们很有趣)时,我都会有游戏标记的概念。在更快的机器上

long diff = System.currentTimeMillis() - lastLoop;
lastLoop = System.currentTimeMillis();

会更低。等待时间将从差异中得出,以便游戏在大多数机器上以相同的速度运行。我也会在一个单独的线程中使用渲染方法,这样游戏速度就不会依赖于图形。

于 2009-05-29T00:25:38.147 回答
0

我可以给出这样的公式(我在任何地方都使用它)。X是它的参数,从零开始,到跳跃的长度结束。如果你想让某人在某个高度 (H) 和某个长度 (L) 处跳跃,那么跳跃的功能将如下所示(并且看起来永远不会有所不同):

y = 减(幂(x - 跳跃长度除以 2)乘以 4 并乘以跳跃高度)除以长度的幂并在最后加上跳跃高度。

y = -(xl/2)(xl/2)*4*h/(l*l) + h

如果你想让跳跃的物体落在某个东西上,那么你可以检查每个新的 X 是否大致站在一个平台上,如果它站在某个东西上,那么不要让它停下来,让它的 Y 位置正好等于平台的 Y。

如果您使用的是 Flash 或其他具有倒置 y 轴的底座,则将函数输出乘以 -1;

于 2010-04-22T13:19:00.543 回答