I’m writing a little game as part of a programming assignment. I’ve got my sprites/images moving the way I want to, except they’re very jerky. Here’s how I’m loading up the image:
//missile and paint are private members of the animation thread
missile = Bitmap.createBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.missile));
paint = new Paint();
paint.setAntiAlias(true);
startTime = new Date().getTime();
The run method of my thread is like this:
@Override
public void run() {
while(running) {
Canvas canvas = null;
try {
canvas = surfaceHolder.lockCanvas(null);
synchronized (surfaceHolder) {
updatePhysics();
doDraw(canvas);
}
} finally {
if(canvas != null) {
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
}
}
updatePhysics simply performs calculations and stores the value inside a private member of the thread called projectilePosition:
function updatePhysics() {
projectilePosition = interceptionCalculationService.positionAtTime((startTime - new Date().getTime()) / 1000);
}
Then, in my doDraw method I do:
private void doDraw(Canvas canvas) {
canvas.drawColor(Color.BLACK);
...
//I update the position of the missile
canvas.drawBitmap(missile, (int) projectilePosition.getDistance() * 2, (int) (getHeight() - (95 + projectilePosition.getHeight())), paint);
canvas.restore();
}
The problem is that the animation is extremely jerky. The missile follows the correct path, but it’s not smooth at all. I assume that’s because I don’t really control the interval when the thread’s run method is called. How can I make my animation more smooth? I was looking at TranslateAnimation, but I can’t figure out how to use it.
This is my first time writing a game and doing graphics/animation, so I’m not well aware of the best practices or even the tools. I got this far by looking up numerous tutorials.
My solution was to stop relying on the system time and to use a variable (that is a private member of the thread) called
currentTimethat gets incremented in eitherdoDraworupdatePhysics. SoupdatePhysicsbecomes:currentTimeis initialized to 0 in the constructor of the thread. This made my animation smooth.