diff options
| author | Jakob L. Kreuze <jakob@memeware.net> | 2018-12-20 09:42:05 -0500 |
|---|---|---|
| committer | Jakob L. Kreuze <jakob@memeware.net> | 2018-12-20 09:42:05 -0500 |
| commit | 30d17197c169d7dc1c8b210e6c43fbfd698cdad6 (patch) | |
| tree | dcf1b6b4cd1fcbd425318b9fb8f19d0baac9ada0 /app/src/main/java/space | |
| parent | edfed0cf5065595d982c6a1d21f7c77b173ee2b5 (diff) | |
Initial pinch-to-zoom and tile revealing
Diffstat (limited to 'app/src/main/java/space')
| -rw-r--r-- | app/src/main/java/space/jakob/mines/GameActivity.kt | 60 |
1 files changed, 54 insertions, 6 deletions
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) } } |