From 5016b6a2f3794842277b06e2c9af6f106c002abb Mon Sep 17 00:00:00 2001 From: cmclark00 Date: Thu, 27 Mar 2025 00:54:04 -0400 Subject: [PATCH] fix: ensure line clear callbacks are properly connected in GameView.setGameBoard() --- app/src/main/java/com/mintris/MainActivity.kt | 11 ++++++- .../main/java/com/mintris/game/GameHaptics.kt | 29 ++++++++++++------- .../main/java/com/mintris/game/GameView.kt | 23 +++++++++++++++ .../main/java/com/mintris/model/GameBoard.kt | 16 +++++++++- 4 files changed, 67 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/mintris/MainActivity.kt b/app/src/main/java/com/mintris/MainActivity.kt index 205484d..25f57ba 100644 --- a/app/src/main/java/com/mintris/MainActivity.kt +++ b/app/src/main/java/com/mintris/MainActivity.kt @@ -104,9 +104,18 @@ class MainActivity : AppCompatActivity() { } gameView.onLineClear = { lineCount -> + android.util.Log.d("MainActivity", "Received line clear callback: $lineCount lines") // Use enhanced haptic feedback for line clears if (isSoundEnabled) { - gameHaptics.vibrateForLineClear(lineCount) + android.util.Log.d("MainActivity", "Sound is enabled, triggering haptic feedback") + try { + gameHaptics.vibrateForLineClear(lineCount) + android.util.Log.d("MainActivity", "Haptic feedback triggered successfully") + } catch (e: Exception) { + android.util.Log.e("MainActivity", "Error triggering haptic feedback", e) + } + } else { + android.util.Log.d("MainActivity", "Sound is disabled, skipping haptic feedback") } } diff --git a/app/src/main/java/com/mintris/game/GameHaptics.kt b/app/src/main/java/com/mintris/game/GameHaptics.kt index 41eaffb..9dc1e87 100644 --- a/app/src/main/java/com/mintris/game/GameHaptics.kt +++ b/app/src/main/java/com/mintris/game/GameHaptics.kt @@ -27,27 +27,36 @@ class GameHaptics(private val context: Context) { } fun vibrateForLineClear(lineCount: Int) { + android.util.Log.d("GameHaptics", "Attempting to vibrate for $lineCount lines") if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val duration = when (lineCount) { - 4 -> 100L // Tetris - 3 -> 80L - 2 -> 60L - 1 -> 40L + 4 -> 200L // Tetris - doubled from 100L + 3 -> 160L // Triples - doubled from 80L + 2 -> 120L // Doubles - doubled from 60L + 1 -> 80L // Singles - doubled from 40L else -> 0L } val amplitude = when (lineCount) { - 4 -> VibrationEffect.DEFAULT_AMPLITUDE - 3 -> (VibrationEffect.DEFAULT_AMPLITUDE * 0.8).toInt() - 2 -> (VibrationEffect.DEFAULT_AMPLITUDE * 0.6).toInt() - 1 -> (VibrationEffect.DEFAULT_AMPLITUDE * 0.4).toInt() + 4 -> 255 // Full amplitude for Tetris + 3 -> 230 // 90% amplitude for triples + 2 -> 180 // 70% amplitude for doubles + 1 -> 128 // 50% amplitude for singles else -> 0 } + android.util.Log.d("GameHaptics", "Vibration parameters - Duration: ${duration}ms, Amplitude: $amplitude") if (duration > 0 && amplitude > 0) { - val vibrationEffect = VibrationEffect.createOneShot(duration, amplitude) - vibrator.vibrate(vibrationEffect) + try { + val vibrationEffect = VibrationEffect.createOneShot(duration, amplitude) + vibrator.vibrate(vibrationEffect) + android.util.Log.d("GameHaptics", "Vibration triggered successfully") + } catch (e: Exception) { + android.util.Log.e("GameHaptics", "Error triggering vibration", e) + } } + } else { + android.util.Log.w("GameHaptics", "Device does not support vibration effects (Android < 8.0)") } } diff --git a/app/src/main/java/com/mintris/game/GameView.kt b/app/src/main/java/com/mintris/game/GameView.kt index 388c45b..b0a578f 100644 --- a/app/src/main/java/com/mintris/game/GameView.kt +++ b/app/src/main/java/com/mintris/game/GameView.kt @@ -138,6 +138,15 @@ class GameView @JvmOverloads constructor( // Connect our callbacks to the GameBoard gameBoard.onPieceMove = { onPieceMove?.invoke() } gameBoard.onPieceLock = { onPieceLock?.invoke() } + gameBoard.onLineClear = { lineCount -> + android.util.Log.d("GameView", "Received line clear from GameBoard: $lineCount lines") + try { + onLineClear?.invoke(lineCount) + android.util.Log.d("GameView", "Forwarded line clear callback") + } catch (e: Exception) { + android.util.Log.e("GameView", "Error forwarding line clear callback", e) + } + } // Force hardware acceleration - This is critical for performance setLayerType(LAYER_TYPE_HARDWARE, null) @@ -560,6 +569,20 @@ class GameView @JvmOverloads constructor( */ fun setGameBoard(board: GameBoard) { gameBoard = board + + // Reconnect callbacks to the new board + gameBoard.onPieceMove = { onPieceMove?.invoke() } + gameBoard.onPieceLock = { onPieceLock?.invoke() } + gameBoard.onLineClear = { lineCount -> + android.util.Log.d("GameView", "Received line clear from GameBoard: $lineCount lines") + try { + onLineClear?.invoke(lineCount) + android.util.Log.d("GameView", "Forwarded line clear callback") + } catch (e: Exception) { + android.util.Log.e("GameView", "Error forwarding line clear callback", e) + } + } + invalidate() } diff --git a/app/src/main/java/com/mintris/model/GameBoard.kt b/app/src/main/java/com/mintris/model/GameBoard.kt index a8db083..9858a3d 100644 --- a/app/src/main/java/com/mintris/model/GameBoard.kt +++ b/app/src/main/java/com/mintris/model/GameBoard.kt @@ -49,6 +49,7 @@ class GameBoard( var onPieceMove: (() -> Unit)? = null var onPieceLock: (() -> Unit)? = null var onNextPieceChanged: (() -> Unit)? = null + var onLineClear: ((Int) -> Unit)? = null init { spawnNextPiece() @@ -299,8 +300,21 @@ class GameBoard( java.util.Arrays.fill(grid[y], false) } - // If lines were cleared, calculate score in background + // If lines were cleared, calculate score in background and trigger callback if (shiftAmount > 0) { + android.util.Log.d("GameBoard", "Lines cleared: $shiftAmount") + // Trigger line clear callback on main thread + val mainHandler = android.os.Handler(android.os.Looper.getMainLooper()) + mainHandler.post { + android.util.Log.d("GameBoard", "Triggering onLineClear callback with $shiftAmount lines") + try { + onLineClear?.invoke(shiftAmount) + android.util.Log.d("GameBoard", "onLineClear callback completed successfully") + } catch (e: Exception) { + android.util.Log.e("GameBoard", "Error in onLineClear callback", e) + } + } + Thread { calculateScore(shiftAmount) }.start()