// Mines is free software: you can redistribute it and/or modify it under the // terms of the GNU General Public License as published by the Free Software // Foundation, either version 3 of the License, or (at your option) any later // version. // Mines is distributed in the hope that it will be useful, but WITHOUT ANY // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR // A PARTICULAR PURPOSE. See the GNU General Public License for more details. // You should have received a copy of the GNU General Public License along with // Mines. If not, see . package space.jakob.mines 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() } return false } } // 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) var width = 8 var height = 8 var mines = 10 getIntent()?.let { width = it.getIntExtra("WIDTH", width) height = it.getIntExtra("HEIGHT", height) mines = it.getIntExtra("MINES", mines) } gameView = findViewById(R.id.view) as GameView gameView.grid = Grid(width, height, mines) gestureDetector = GestureDetectorCompat(this, gestureListener) scaleGestureDetector = ScaleGestureDetector(this, scaleListener) } }