Я работаю в J2ME, мой gameloop делает следующее:
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, и я установил логическое значение jumping в значение 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 , так что когда персонаж прыгает, его скорость уменьшается пропорционально скорости игры. Может кто-нибудь помочь мне решить эту проблему? Или подскажите, как правильно сделать 2D-прыжок в J2ME .