From 30d17197c169d7dc1c8b210e6c43fbfd698cdad6 Mon Sep 17 00:00:00 2001 From: "Jakob L. Kreuze" Date: Thu, 20 Dec 2018 09:42:05 -0500 Subject: Initial pinch-to-zoom and tile revealing --- .../main/java/space/jakob/mines/GameActivity.kt | 60 +++++++++++++++++++--- 1 file changed, 54 insertions(+), 6 deletions(-) (limited to 'app/src/main/java/space/jakob') diff --git a/app/src/main/java/space/jakob/mines/GameActivity.kt b/app/src/main/java/space/jakob/mines/GameActivity.kt index 49b301e..7e8313c 100644 --- a/app/src/main/java/space/jakob/mines/GameActivity.kt +++ b/app/src/main/java/space/jakob/mines/GameActivity.kt @@ -16,33 +16,80 @@ import android.support.v7.app.AppCompatActivity import android.support.v4.view.GestureDetectorCompat import android.os.Bundle import android.view.GestureDetector +import android.view.ScaleGestureDetector import android.view.MotionEvent import android.util.Log class GameActivity : AppCompatActivity() { lateinit var gameView: GameView lateinit var gestureDetector: GestureDetectorCompat + lateinit var scaleGestureDetector: ScaleGestureDetector // Implements the callbacks for gestureDetector. val gestureListener = object : GestureDetector.SimpleOnGestureListener() { + override fun onDown(e: MotionEvent): Boolean { + with (gameView) { + grid?.let { + val (x, y) = toGridCoordinates(e.x.toInt(), e.y.toInt()) + it.reveal(x, y) + invalidate() + } + } + return false + } + override fun onScroll(e1: MotionEvent, e2: MotionEvent, dx: Float, dy: Float): Boolean { with (gameView) { cameraX = (cameraX + dx / 100.0).coerceIn(0.0, gameView.maxCameraX) cameraY = (cameraY + dy / 100.0).coerceIn(0.0, gameView.maxCameraY) + invalidate() } - gameView.invalidate() return false } } - override fun onTouchEvent(event: MotionEvent): Boolean { - return if (gestureDetector.onTouchEvent(event)) { - true - } else { - super.onTouchEvent(event) + // Implements the callbacks for scaleGestureDetector. + val scaleListener = object : ScaleGestureDetector.SimpleOnScaleGestureListener() { + override fun onScale(scaleGestureDetector: ScaleGestureDetector) : Boolean { + with (gameView) { + grid?.let { + val factor = scaleGestureDetector.getScaleFactor() + + var currentDistance = sightX - cameraX + var desiredDistance = currentDistance / factor + var deltaDistance = Math.abs(desiredDistance - currentDistance) / 2 + + if (factor < 1.0) { + cameraX = (cameraX - deltaDistance).coerceAtLeast(0.0) + sightX = (sightX + deltaDistance).coerceAtMost(it.width.toDouble() - cameraX) + } else { + cameraX = cameraX + deltaDistance + sightX = sightX - deltaDistance + } + + currentDistance = sightY - cameraY + desiredDistance = currentDistance / factor + deltaDistance = Math.abs(desiredDistance - currentDistance) / 2 + + if (factor < 1.0) { + cameraY = (cameraY - deltaDistance).coerceAtLeast(0.0) + sightY = (sightY + deltaDistance).coerceAtMost(it.height.toDouble() - cameraY) + } else { + cameraY = cameraY + deltaDistance + sightY = sightY - deltaDistance + } + } + } + return false } } + override fun onTouchEvent(event: MotionEvent): Boolean { + return gestureDetector.onTouchEvent(event) + || scaleGestureDetector.onTouchEvent(event) + || super.onTouchEvent(event) + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_game) @@ -61,5 +108,6 @@ class GameActivity : AppCompatActivity() { gameView.grid = Grid(width, height, mines) gestureDetector = GestureDetectorCompat(this, gestureListener) + scaleGestureDetector = ScaleGestureDetector(this, scaleListener) } } -- cgit v1.3