Fixed canvas offset
This commit is contained in:
parent
9c65627445
commit
2d36517acb
1 changed files with 29 additions and 9 deletions
|
|
@ -14,6 +14,13 @@ import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.graphics.asImageBitmap
|
import androidx.compose.ui.graphics.asImageBitmap
|
||||||
import androidx.compose.ui.graphics.drawscope.Stroke
|
import androidx.compose.ui.graphics.drawscope.Stroke
|
||||||
import androidx.compose.ui.input.pointer.pointerInput
|
import androidx.compose.ui.input.pointer.pointerInput
|
||||||
|
import androidx.compose.ui.text.ParagraphStyle
|
||||||
|
import androidx.compose.ui.text.SpanStyle
|
||||||
|
import androidx.compose.ui.text.buildAnnotatedString
|
||||||
|
import androidx.compose.ui.text.drawText
|
||||||
|
import androidx.compose.ui.text.rememberTextMeasurer
|
||||||
|
import androidx.compose.ui.text.style.TextAlign
|
||||||
|
import androidx.compose.ui.text.withStyle
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun MapCanvas(
|
fun MapCanvas(
|
||||||
|
|
@ -25,13 +32,13 @@ fun MapCanvas(
|
||||||
) {
|
) {
|
||||||
val offsetX = rememberSaveable { mutableFloatStateOf(0F) }
|
val offsetX = rememberSaveable { mutableFloatStateOf(0F) }
|
||||||
val offsetY = rememberSaveable { mutableFloatStateOf(0F) }
|
val offsetY = rememberSaveable { mutableFloatStateOf(0F) }
|
||||||
|
val textMeasurer = rememberTextMeasurer()
|
||||||
Canvas(
|
Canvas(
|
||||||
modifier = modifier.fillMaxSize()
|
modifier = modifier.fillMaxSize()
|
||||||
.pointerInput(Unit) {
|
.pointerInput(Unit) {
|
||||||
detectDragGestures { _, distance ->
|
detectDragGestures { _, distance ->
|
||||||
offsetX.floatValue += distance.x
|
offsetX.floatValue -= distance.x
|
||||||
offsetY.floatValue += distance.y
|
offsetY.floatValue -= distance.y
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
) {
|
) {
|
||||||
|
|
@ -40,8 +47,8 @@ fun MapCanvas(
|
||||||
size = size
|
size = size
|
||||||
)
|
)
|
||||||
|
|
||||||
val tileOffsetX = offsetX.floatValue.toInt() / TILE_SIZE.toInt()
|
val tileOffsetX = (offsetX.floatValue / TILE_SIZE).toInt()
|
||||||
val tileOffsetY = offsetY.floatValue.toInt() / TILE_SIZE.toInt()
|
val tileOffsetY = (offsetY.floatValue / TILE_SIZE).toInt()
|
||||||
|
|
||||||
val strippedOffsetX = offsetX.floatValue % TILE_SIZE
|
val strippedOffsetX = offsetX.floatValue % TILE_SIZE
|
||||||
val strippedOffsetY = offsetY.floatValue % TILE_SIZE
|
val strippedOffsetY = offsetY.floatValue % TILE_SIZE
|
||||||
|
|
@ -59,10 +66,10 @@ fun MapCanvas(
|
||||||
|
|
||||||
for (cellX in 0 .. gridWidth + 2) {
|
for (cellX in 0 .. gridWidth + 2) {
|
||||||
val tileX = tileOffsetX + cellX
|
val tileX = tileOffsetX + cellX
|
||||||
val offsetX = TILE_SIZE * (cellX - 1)
|
val localOffsetX = TILE_SIZE * (cellX - 1)
|
||||||
for (cellY in 0 .. gridHeight + 2) {
|
for (cellY in 0 .. gridHeight + 2) {
|
||||||
val tileY = tileOffsetY + cellY
|
val tileY = tileOffsetY + cellY
|
||||||
val offsetY = TILE_SIZE * (cellY - 1)
|
val localOffsetY = TILE_SIZE * (cellY - 1)
|
||||||
|
|
||||||
val bitmap = tiles.find { it.x == tileX && it.y == tileY && it.level == level }?.getBitmap()
|
val bitmap = tiles.find { it.x == tileX && it.y == tileY && it.level == level }?.getBitmap()
|
||||||
|
|
||||||
|
|
@ -70,16 +77,29 @@ fun MapCanvas(
|
||||||
val imageBitmap = bitmap.asImageBitmap()
|
val imageBitmap = bitmap.asImageBitmap()
|
||||||
drawImage(
|
drawImage(
|
||||||
image = imageBitmap,
|
image = imageBitmap,
|
||||||
topLeft = offset + Offset(offsetX, offsetY)
|
topLeft = Offset(localOffsetX, localOffsetY) - offset
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
drawRect(
|
drawRect(
|
||||||
color = gridColor,
|
color = gridColor,
|
||||||
size = Size(TILE_SIZE, TILE_SIZE),
|
size = Size(TILE_SIZE, TILE_SIZE),
|
||||||
topLeft = offset + Offset(offsetX, offsetY),
|
topLeft = Offset(localOffsetX, localOffsetY) - offset,
|
||||||
style = Stroke(width = 4F)
|
style = Stroke(width = 4F)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
drawText(
|
||||||
|
textMeasurer = textMeasurer,
|
||||||
|
text = buildAnnotatedString {
|
||||||
|
withStyle(ParagraphStyle(textAlign = TextAlign.Center)) {
|
||||||
|
withStyle(SpanStyle(color = gridColor)) {
|
||||||
|
append("x:%d, y:%d".format(tileX, tileY))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
topLeft = Offset(localOffsetX, localOffsetY) - offset,
|
||||||
|
size = Size(TILE_SIZE, TILE_SIZE)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue