mirror of
https://github.com/cmclark00/mintris.git
synced 2025-05-18 14:15:20 +01:00
133 lines
No EOL
4.5 KiB
Kotlin
133 lines
No EOL
4.5 KiB
Kotlin
package com.pixelmintdrop.game
|
|
|
|
import android.content.Context
|
|
import android.graphics.BlurMaskFilter
|
|
import android.graphics.Canvas
|
|
import android.graphics.Color
|
|
import android.graphics.Paint
|
|
import android.util.AttributeSet
|
|
import android.view.View
|
|
import com.pixelmintdrop.model.GameBoard
|
|
import kotlin.math.min
|
|
|
|
/**
|
|
* View that displays the currently held piece
|
|
*/
|
|
class HoldPieceView @JvmOverloads constructor(
|
|
context: Context,
|
|
attrs: AttributeSet? = null,
|
|
defStyleAttr: Int = 0
|
|
) : View(context, attrs, defStyleAttr) {
|
|
|
|
private var gameView: GameView? = null
|
|
private var gameBoard: GameBoard? = null
|
|
|
|
// Rendering
|
|
private val blockPaint = Paint().apply {
|
|
color = Color.WHITE
|
|
isAntiAlias = true
|
|
style = Paint.Style.FILL
|
|
}
|
|
|
|
private val glowPaint = Paint().apply {
|
|
color = Color.WHITE
|
|
alpha = 40
|
|
isAntiAlias = true
|
|
style = Paint.Style.STROKE
|
|
strokeWidth = 1.5f
|
|
maskFilter = BlurMaskFilter(8f, BlurMaskFilter.Blur.OUTER)
|
|
}
|
|
|
|
private val blockGlowPaint = Paint().apply {
|
|
color = Color.WHITE
|
|
alpha = 60
|
|
isAntiAlias = true
|
|
style = Paint.Style.FILL
|
|
maskFilter = BlurMaskFilter(12f, BlurMaskFilter.Blur.OUTER)
|
|
}
|
|
|
|
/**
|
|
* Set the game view reference
|
|
*/
|
|
fun setGameView(view: GameView) {
|
|
gameView = view
|
|
gameBoard = view.getGameBoard()
|
|
}
|
|
|
|
/**
|
|
* Get the game board reference
|
|
*/
|
|
private fun getGameBoard(): GameBoard? = gameBoard
|
|
|
|
override fun onDraw(canvas: Canvas) {
|
|
super.onDraw(canvas)
|
|
|
|
// Get the held piece from game board
|
|
gameBoard?.let {
|
|
it.getHoldPiece()?.let { piece ->
|
|
val width = piece.getWidth()
|
|
val height = piece.getHeight()
|
|
|
|
// Calculate block size for the preview (smaller than main board)
|
|
val previewBlockSize = min(
|
|
canvas.width.toFloat() / (width + 2),
|
|
canvas.height.toFloat() / (height + 2)
|
|
)
|
|
|
|
// Center the piece in the preview area
|
|
val previewLeft = (canvas.width - width * previewBlockSize) / 2
|
|
val previewTop = (canvas.height - height * previewBlockSize) / 2
|
|
|
|
// Draw subtle background glow
|
|
val glowPaint = Paint().apply {
|
|
color = Color.WHITE
|
|
alpha = 10
|
|
maskFilter = BlurMaskFilter(previewBlockSize * 0.5f, BlurMaskFilter.Blur.OUTER)
|
|
}
|
|
canvas.drawRect(
|
|
previewLeft - previewBlockSize,
|
|
previewTop - previewBlockSize,
|
|
previewLeft + width * previewBlockSize + previewBlockSize,
|
|
previewTop + height * previewBlockSize + previewBlockSize,
|
|
glowPaint
|
|
)
|
|
|
|
// Draw the held piece
|
|
for (y in 0 until height) {
|
|
for (x in 0 until width) {
|
|
if (piece.isBlockAt(x, y)) {
|
|
val left = previewLeft + x * previewBlockSize
|
|
val top = previewTop + y * previewBlockSize
|
|
val right = left + previewBlockSize
|
|
val bottom = top + previewBlockSize
|
|
|
|
// Draw outer glow
|
|
blockGlowPaint.color = Color.WHITE
|
|
canvas.drawRect(
|
|
left - 2f,
|
|
top - 2f,
|
|
right + 2f,
|
|
bottom + 2f,
|
|
blockGlowPaint
|
|
)
|
|
|
|
// Draw block
|
|
blockPaint.color = Color.WHITE
|
|
canvas.drawRect(left, top, right, bottom, blockPaint)
|
|
|
|
// Draw inner glow
|
|
glowPaint.color = Color.WHITE
|
|
canvas.drawRect(
|
|
left + 1f,
|
|
top + 1f,
|
|
right - 1f,
|
|
bottom - 1f,
|
|
glowPaint
|
|
)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |