我在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
函数,这个,Character类中的animChar
函数设置屏幕中的所有内容:
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,这使得角色上升,然后我将这个函数称为{{1}确保所有上升的东西都必须降下来,checkGravity()
还会检查角色是否在平台上,所以为了你的时间我会把它剥掉一点:
checkGravity
所以,问题是,无论 diff ,这个函数都会更新 dy ,使得角色在慢速机器中像超人一样飞翔,我不知道如何实现 diff 因子,这样当一个角色跳跃时,他的速度会以与游戏速度成比例的方式递减。任何人都可以帮我解决这个问题吗?或者指出如何以正确的方式在J2ME中进行2D跳转。
答案 0 :(得分:5)
你不应该根据经过的时间调整jumpSpeed吗?也就是说,速度可能会以-75 /秒的速度变化,因此你的差值应该是应用于jumpSpeed的变化量的权重。
因此将diff传递给checkGrav并执行类似... jumpSpeed + =(diff *(rate_per_second))/ 1000;
(假设以毫秒为单位的差异)
(理想情况下,这会使它像真正的引力一样:D)
答案 1 :(得分:3)
为什么不通过diff缩放所有常量?
顺便说一句,我很尴尬地说这个,但我参与了一个商业游戏,其中重力是人物下降的两倍。出于某种原因,人们更喜欢这个。
答案 2 :(得分:0)
这似乎更像是一个关于游戏设计的问题而不是跳跃的数学问题。一个常见的问题是,在不同处理器上运行的游戏中,一个游戏将被更快地执行,而在其他游戏中,它将被执行得更慢(从而改变游戏的整个速度)。我不确定游戏中的常见做法是什么,但每当我制作自制的2D游戏(它们制作起来都很有趣)时,我会想到游戏的概念。在更快的机器上
long diff = System.currentTimeMillis() - lastLoop;
lastLoop = System.currentTimeMillis();
会更低。等待时间将来自差异,以便游戏在大多数机器上以相同的速度运行。我也将渲染方法放在一个单独的线程中,以便游戏速度不依赖于图形。
答案 3 :(得分:0)
我可以给出这样的公式(我到处使用它)。 X是从零开始到跳跃长度结束的参数。 如果你想让某人跳到某个高度(H)和某个长度(L),那么跳跃的功能将会是这样(并且它不会看起来不同):
y =负(功率(x - 跳跃长度除以2)乘以4和 乘以跳跃的高度除以长度的幂并加上 最后跳跃的高度。
y = - (x-1/2)(x-l / 2)* 4 * h /(l * l)+ h
如果你想让跳跃的物体落在某物上,那么你可以检查每一个新的X是否大约站在一个平台上,如果它站在什么东西上,那么就不要让它停下来,让它成为Y的位置完全等于平台的Y.
如果您正在使用Flash或其他具有y轴反转的基础,则将函数输出乘以-1;