fix: prevent crash in game over animation by checking for zero blur radius

This commit is contained in:
cmclark00 2025-03-30 19:14:16 -04:00
parent 292ea656f8
commit 7dccad8d12

View file

@ -57,6 +57,15 @@ class GameView @JvmOverloads constructor(
isAntiAlias = true isAntiAlias = true
} }
private val borderGlowPaint = Paint().apply {
color = Color.WHITE
alpha = 60
isAntiAlias = true
style = Paint.Style.STROKE
strokeWidth = 2f
maskFilter = BlurMaskFilter(8f, BlurMaskFilter.Blur.OUTER)
}
private val ghostBlockPaint = Paint().apply { private val ghostBlockPaint = Paint().apply {
color = Color.WHITE color = Color.WHITE
alpha = 80 // 30% opacity alpha = 80 // 30% opacity
@ -89,15 +98,6 @@ class GameView @JvmOverloads constructor(
maskFilter = BlurMaskFilter(12f, BlurMaskFilter.Blur.OUTER) maskFilter = BlurMaskFilter(12f, BlurMaskFilter.Blur.OUTER)
} }
private val borderGlowPaint = Paint().apply {
color = Color.WHITE
alpha = 60
isAntiAlias = true
style = Paint.Style.STROKE
strokeWidth = 2f
maskFilter = BlurMaskFilter(8f, BlurMaskFilter.Blur.OUTER)
}
// Add a new paint for the pulse effect // Add a new paint for the pulse effect
private val pulsePaint = Paint().apply { private val pulsePaint = Paint().apply {
color = Color.CYAN color = Color.CYAN
@ -410,12 +410,6 @@ class GameView @JvmOverloads constructor(
} }
override fun onDraw(canvas: Canvas) { override fun onDraw(canvas: Canvas) {
// Skip drawing if paused or game over - faster return
if (isPaused || gameBoard.isGameOver) {
super.onDraw(canvas)
return
}
// Set hardware layer type during draw for better performance // Set hardware layer type during draw for better performance
val wasHardwareAccelerated = isHardwareAccelerated val wasHardwareAccelerated = isHardwareAccelerated
if (!wasHardwareAccelerated) { if (!wasHardwareAccelerated) {
@ -447,12 +441,28 @@ class GameView @JvmOverloads constructor(
if (isGameOverAnimating) { if (isGameOverAnimating) {
val gameOverPaint = Paint().apply { val gameOverPaint = Paint().apply {
color = Color.WHITE color = Color.WHITE
alpha = (128 * gameOverAlpha).toInt() alpha = (200 * gameOverAlpha).toInt() // Increased from 128 to 200
isAntiAlias = true isAntiAlias = true
style = Paint.Style.FILL style = Paint.Style.FILL
maskFilter = BlurMaskFilter(48f * gameOverAlpha, BlurMaskFilter.Blur.OUTER) // Only apply blur if alpha is greater than 0
if (gameOverAlpha > 0) {
maskFilter = BlurMaskFilter(64f * gameOverAlpha, BlurMaskFilter.Blur.OUTER) // Increased from 48f to 64f
}
} }
canvas.drawRect(0f, 0f, width.toFloat(), height.toFloat(), gameOverPaint) canvas.drawRect(0f, 0f, width.toFloat(), height.toFloat(), gameOverPaint)
// Add a second layer for more intensity
val gameOverPaint2 = Paint().apply {
color = Color.WHITE
alpha = (100 * gameOverAlpha).toInt()
isAntiAlias = true
style = Paint.Style.FILL
// Only apply blur if alpha is greater than 0
if (gameOverAlpha > 0) {
maskFilter = BlurMaskFilter(32f * gameOverAlpha, BlurMaskFilter.Blur.OUTER)
}
}
canvas.drawRect(0f, 0f, width.toFloat(), height.toFloat(), gameOverPaint2)
} }
} }
@ -1163,8 +1173,8 @@ class GameView @JvmOverloads constructor(
gameHaptics?.vibrateForGameOver() gameHaptics?.vibrateForGameOver()
// Create new game over animation // Create new game over animation
gameOverAnimator = ValueAnimator.ofFloat(0f, 1f, 0.7f).apply { gameOverAnimator = ValueAnimator.ofFloat(0f, 1f, 0.8f).apply {
duration = 1500L // 1.5 seconds total duration = 1000L // 1 second total
interpolator = LinearInterpolator() interpolator = LinearInterpolator()
addUpdateListener { animation -> addUpdateListener { animation ->
@ -1177,7 +1187,7 @@ class GameView @JvmOverloads constructor(
addListener(object : android.animation.AnimatorListenerAdapter() { addListener(object : android.animation.AnimatorListenerAdapter() {
override fun onAnimationEnd(animation: android.animation.Animator) { override fun onAnimationEnd(animation: android.animation.Animator) {
isGameOverAnimating = false isGameOverAnimating = false
gameOverAlpha = 0.7f // Keep at 70% opacity gameOverAlpha = 0.8f // Keep at 80% opacity
invalidate() invalidate()
Log.d(TAG, "Game over animation ended") Log.d(TAG, "Game over animation ended")
} }