First of all, I am aware that there's no camera in OpenGL (ES 2), but from my understanding proper manipulation of the projection matrix can simulate the concept of a camera.
What I'm trying to do is make my camera follow my character. My game is 2D, btw. I think the principle is the following (take Super Mario Bros or Doodle Jump as reference - actually I'm trying to replicate the mechanics of the latter): when the caracter goes beyond the center of the screen (in the positive axis/direction), update the camera to be centred on the character. Else keep the camera still. I did accomplish that, however the camera movement is noticeably jittery and I ran out of ideas how to make it smoother.
First of all, my game loop (following this article):
private int TICKS_PER_SECOND = 30;
private int SKIP_TICKS = 1000 / TICKS_PER_SECOND;
private int MAX_FRAMESKIP = 5;
@Override
public void run() {
loops = 0;
if(firstLoop) {
nextGameTick = SystemClock.elapsedRealtime();
firstLoop = false;
}
while(SystemClock.elapsedRealtime() > nextGameTick && loops < MAX_FRAMESKIP) {
step();
nextGameTick += SKIP_TICKS;
loops++;
}
interpolation = ( SystemClock.elapsedRealtime() + SKIP_TICKS - nextGameTick ) / (float)SKIP_TICKS;
draw();
}
And the following code deals with moving the camera. I was unsure whether to place it in step()
or draw()
, but it doesn't make a difference to my problem at the moment, as I tried both and neither seemed to fix it. center
just represents the y
coordinate of the centre of the screen at any time. Initially it is 0
. The camera object is my own custom "camera" which basically is a class that just manipulates the view and projection matrices.
if(character.getVerticalSpeed() >= 0) { //only update camera if going up
float[] projectionMatrix = camera.getProjectionMatrix();
if( character.getY() > center) {
center += character.getVerticalSpeed();
cameraBottom = center + camera.getBottom();
cameraTop = center + camera.getTop();
Matrix.orthoM(projectionMatrix, 0, camera.getLeft(), camera.getRight(), center + camera.getBottom(), center + camera.getTop(), camera.getNear(), camera.getFar());
}
}
Any thought about what I should try or what I am doing wrong?
Update 1: I think I updated every value you can see on screen to check whether the jittery movement is affected by that, but nothing changed, so something must be fundamentally flawed with my approach/calculations.