Added buzzing & fixed first word bug
This commit is contained in:
@@ -17,6 +17,7 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
package="com.example.android.guesstheword">
|
||||
<uses-permission android:name="android.permission.VIBRATE" />
|
||||
|
||||
<application
|
||||
android:name=".GuessItApplication"
|
||||
|
||||
@@ -16,18 +16,24 @@
|
||||
|
||||
package com.example.android.guesstheword.screens.game
|
||||
|
||||
import android.content.Context
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.os.VibrationEffect
|
||||
import android.os.Vibrator
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.databinding.DataBindingUtil
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.lifecycle.Observer
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.ViewModelProviders
|
||||
import androidx.navigation.fragment.NavHostFragment.findNavController
|
||||
import com.example.android.guesstheword.R
|
||||
import com.example.android.guesstheword.databinding.GameFragmentBinding
|
||||
|
||||
|
||||
/**
|
||||
* Fragment where the game is played
|
||||
*/
|
||||
@@ -60,6 +66,13 @@ class GameFragment : Fragment() {
|
||||
}
|
||||
})
|
||||
|
||||
viewModel.eventBuzz.observe(this, Observer {
|
||||
if (it != BuzzType.NO_BUZZ) {
|
||||
buzz(it.pattern)
|
||||
viewModel.onBuzzComplete()
|
||||
}
|
||||
})
|
||||
|
||||
return binding.root
|
||||
|
||||
}
|
||||
@@ -72,4 +85,16 @@ class GameFragment : Fragment() {
|
||||
findNavController(this).navigate(action)
|
||||
}
|
||||
|
||||
private fun buzz(pattern: LongArray) {
|
||||
val vibrator = context?.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
|
||||
vibrator?.let {
|
||||
if (Build.VERSION.SDK_INT >= 26) {
|
||||
it.vibrate(VibrationEffect.createWaveform(pattern, VibrationEffect.DEFAULT_AMPLITUDE))
|
||||
} else {
|
||||
@Suppress("DEPRECATION")
|
||||
it.vibrate(100)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -7,12 +7,25 @@ import androidx.lifecycle.MutableLiveData
|
||||
import androidx.lifecycle.Transformations
|
||||
import androidx.lifecycle.ViewModel
|
||||
|
||||
private val CORRECT_BUZZ_PATTERN = longArrayOf(100, 100, 100, 100, 100, 100)
|
||||
private val PANIC_BUZZ_PATTERN = longArrayOf(0, 200)
|
||||
private val GAME_OVER_BUZZ_PATTERN = longArrayOf(0, 2000)
|
||||
private val NO_BUZZ_PATTERN = longArrayOf(0)
|
||||
|
||||
enum class BuzzType(val pattern: LongArray) {
|
||||
CORRECT(CORRECT_BUZZ_PATTERN),
|
||||
GAME_OVER(GAME_OVER_BUZZ_PATTERN),
|
||||
COUNTDOWN_PANIC(PANIC_BUZZ_PATTERN),
|
||||
NO_BUZZ(NO_BUZZ_PATTERN)
|
||||
}
|
||||
|
||||
class GameViewModel(): ViewModel() {
|
||||
|
||||
companion object {
|
||||
// These represent different important times
|
||||
// This is when the game is over
|
||||
const val DONE = 0L
|
||||
// This is the time when the phone will start buzzing each second
|
||||
private const val COUNTDOWN_PANIC_SECONDS = 10L
|
||||
// This is the number of milliseconds in a second
|
||||
const val ONE_SECOND = 1000L
|
||||
// This is the total time of the game
|
||||
@@ -37,6 +50,10 @@ class GameViewModel(): ViewModel() {
|
||||
DateUtils.formatElapsedTime(it / ONE_SECOND)
|
||||
};
|
||||
|
||||
private val _eventBuzz = MutableLiveData<BuzzType>()
|
||||
val eventBuzz: LiveData<BuzzType>
|
||||
get() = _eventBuzz
|
||||
|
||||
private val _eventGameFinished = MutableLiveData<Boolean>()
|
||||
val eventGameFinished: LiveData<Boolean>
|
||||
get() = _eventGameFinished
|
||||
@@ -45,16 +62,20 @@ class GameViewModel(): ViewModel() {
|
||||
private lateinit var wordList: MutableList<String>
|
||||
|
||||
init {
|
||||
resetList()
|
||||
nextWord()
|
||||
_eventGameFinished.value = false
|
||||
_word.value = ""
|
||||
_score.value = 0
|
||||
|
||||
resetList()
|
||||
nextWord()
|
||||
|
||||
timer = object : CountDownTimer(COUNTDOWN_TIME, ONE_SECOND) {
|
||||
|
||||
override fun onTick(millisUntilFinished: Long) {
|
||||
_gameTimer.value = millisUntilFinished
|
||||
if (millisUntilFinished / ONE_SECOND <= COUNTDOWN_PANIC_SECONDS) {
|
||||
_eventBuzz.value = BuzzType.COUNTDOWN_PANIC
|
||||
}
|
||||
}
|
||||
|
||||
override fun onFinish() {
|
||||
@@ -104,7 +125,6 @@ class GameViewModel(): ViewModel() {
|
||||
* Moves to the next word in the list
|
||||
*/
|
||||
private fun nextWord() {
|
||||
//Select and remove a word from the list
|
||||
if (wordList.isEmpty()) {
|
||||
endGame()
|
||||
} else {
|
||||
@@ -121,17 +141,23 @@ class GameViewModel(): ViewModel() {
|
||||
|
||||
fun onCorrect() {
|
||||
_score.value = (score.value)?.inc()
|
||||
_eventBuzz.value = BuzzType.CORRECT
|
||||
nextWord()
|
||||
}
|
||||
|
||||
fun endGame() {
|
||||
if (_gameTimer.value?.toInt() == 0) {
|
||||
timer.cancel()
|
||||
_gameTimer.value = DONE
|
||||
}
|
||||
_eventBuzz.value = BuzzType.GAME_OVER
|
||||
_eventGameFinished.value = true
|
||||
}
|
||||
|
||||
fun onGameFinishComplete() {
|
||||
_eventGameFinished.value = false
|
||||
}
|
||||
|
||||
fun onBuzzComplete() {
|
||||
_eventBuzz.value = BuzzType.NO_BUZZ
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user