Bouncing Ball on the Z axis: I can't fix a math error without help. (GIF)

Here’s a GIF depicting the way I want my ball to bounce.

And here’s the code, the problem currently unsolved. “dstRect” is a custom class that allows me to blit a bitmap onto the Canvas:


	private void jump() {
		double value = Math.cos(radians + Math.PI) * multiplier;
		dstRect.left -= position[2] + oldXOffset;
		dstRect.right += position[2] + oldXOffset;
		dstRect.top -= position[2] + oldXOffset;
		dstRect.bottom += position[2] + oldXOffset;
		position[2] = (float) value + 8;
		radians += 0.1 * radianSpeed;
		if (radians > 2 * Math.PI) {
			multiplier -= 4;
			value = Math.cos(radians + Math.PI) * multiplier; 
			oldXOffset += position[2] - (float) value + 8;
			radians = 0;
			radianSpeed += 2;
			if (multiplier < 2.0) {
				jumping = false;
				multiplier = 8;
				oldXOffset = 0f;
				radianSpeed = 1;
				position[2] = 0f;
				for (int i = 0; i < 2; i++)
					speed[i] = 0f;
			}
		}
	}

The problem is this:

It starts off by triggering a switch, where the ball itself goes into a jumping state.

  • On the first jump, it is normal. Ball starts jumping from the ground, flies into the air, and back down to the ground.
  • On the second jump, it starts glitching out. Ball starts from the middle in the air, flies even higher, and back to the middle.
  • On the third and last jump, the ball starts 1/3 from the peak of its jump, flies up to its peak, and back down 1/3 from its peak.

After that, the ball exits the jumping state, the ball goes back to the ground.

I wished I could think more on this. :frowning:

I was playing an NDS game, when suddenly an inspiration popped into my head after looking at a in-game statue sprite.

After tinkering with the idea, I finally fixed the problem. Here’s the code.



float radians;
float radianSpeed;
float multipler;
float result;

public void calculate(){
	result = (float) Math.cos(radians + Math.PI) * multipler + multipler;
	radians += 0.2f * radianSpeed;
	if (radians > 2 * Math.PI){
		radianSpeed += 1;
		radians = 0f;
		multipler -= 1;
		if (multipler <= 0){
			multipler = 0f;
			radians = 0f;
		}
	}
}

// Rest of the code, it's up the developer's implementation.