mirror of
https://github.com/cmclark00/mintris.git
synced 2025-05-18 08:35:20 +01:00
fix: ensure line clear callbacks are properly connected in GameView.setGameBoard()
This commit is contained in:
parent
b068de76f5
commit
5016b6a2f3
4 changed files with 67 additions and 12 deletions
|
@ -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")
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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)")
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue