From 7c4b6cb1484901f8230c5ec0a695816e69393d38 Mon Sep 17 00:00:00 2001 From: Lucas Delanier Date: Sun, 12 Mar 2023 17:40:48 +0100 Subject: [PATCH] Clean the code in function for better maintenance :nail_care: --- .../com/example/shakecraft/BossFragment.kt | 174 +++++++++--------- .../com/example/shakecraft/CollectFragment.kt | 108 +++++------ .../com/example/shakecraft/HomeFragment.kt | 57 +++--- .../example/shakecraft/InventoryFragment.kt | 18 +- .../com/example/shakecraft/PlusFragment.kt | 39 +--- 5 files changed, 189 insertions(+), 207 deletions(-) diff --git a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/BossFragment.kt b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/BossFragment.kt index 3591ff7..cb4b3a7 100644 --- a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/BossFragment.kt +++ b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/BossFragment.kt @@ -19,7 +19,10 @@ import android.widget.TextView import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.example.shakecraft.model.Boss import com.example.shakecraft.model.Generator +import com.example.shakecraft.model.Item +import com.example.shakecraft.model.Player import com.example.shakecraft.view.adapter.AdapterBossLoot import kotlin.math.pow import kotlin.math.sqrt @@ -27,38 +30,61 @@ import kotlin.math.sqrt class BossFragment() : Fragment() { - private lateinit var sensorManager: SensorManager private lateinit var accelerometer: Sensor private lateinit var accelerometerEventListener: SensorEventListener private lateinit var progressBar: ProgressBar private lateinit var image: ImageView + private lateinit var buttonCollect: TextView + private lateinit var recyclerView: RecyclerView + private lateinit var boss: Boss override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - - } - override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - val player = (activity as MainActivity).currentPlayer - + val currentPlayer = (activity as MainActivity).currentPlayer val view = inflater.inflate(R.layout.fragment_boss, container, false) - val buttonCollect = view.findViewById(R.id.backbutton) + + // Initialize views + initializeViews(view) + + // Set up boss + boss = Generator.generateBoss() + setUpBoss(boss) + + // Set up RecyclerView for boss loot + setUpRecyclerView(view) + + // Set up accelerometer listener + setUpAccelerometerListener(view, currentPlayer) + + // Set up activity orientation + setUpActivityOrientation() + + // Return fragment view + return view + } + private fun initializeViews(view: View) { + progressBar = view.findViewById(R.id.progressBar) + image = view.findViewById(R.id.imageBoss) + buttonCollect = view.findViewById(R.id.backbutton) buttonCollect.setOnClickListener{ findNavController().navigate(R.id.action_bossFragment_to_homeFragment) } - val imageView = view.findViewById(R.id.imageBoss) - imageView.scaleX = 1.2f - imageView.scaleY = 1.2f + } + private fun setUpBoss(boss: Boss) { + progressBar.max = boss.maxlife + progressBar.progress = boss.life + image.setImageResource(boss.image) -// Créez une animation qui modifie la propriété scaleX et scaleY de l'image + // Create scale animation for boss image val scaleAnimation = ScaleAnimation( - 1.2f, // de 2.0 à 1.0 + 1.2f, // from 1.2 to 1.0 1.0f, 1.2f, 1.0f, @@ -67,110 +93,84 @@ class BossFragment() : Fragment() { Animation.RELATIVE_TO_SELF, 0.5f ) - - scaleAnimation.duration = 1000 // dure 1 seconde - scaleAnimation.repeatCount = Animation.INFINITE // répéter indéfiniment - scaleAnimation.repeatMode = Animation.REVERSE // inverser la direction de l'animation - -// Appliquez l'animation à l'image - imageView.startAnimation(scaleAnimation) - - - progressBar = view.findViewById(R.id.progressBar) - sensorManager = requireActivity().getSystemService(Context.SENSOR_SERVICE) as SensorManager - accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) - var boss = Generator.generateBoss() - progressBar.max = boss.maxlife - progressBar.progress = boss.life - imageView.setImageResource(boss.image) - - - val recyclerView: RecyclerView = view.findViewById(R.id.recyclerviewBossLoot) + scaleAnimation.duration = 1000 // lasts 1 second + scaleAnimation.repeatCount = Animation.INFINITE // repeat indefinitely + scaleAnimation.repeatMode = Animation.REVERSE // reverse animation direction + image.startAnimation(scaleAnimation) + } + private fun setUpRecyclerView(view: View) { + recyclerView = view.findViewById(R.id.recyclerviewBossLoot) with(recyclerView) { layoutManager = LinearLayoutManager(view.context) adapter = AdapterBossLoot(boss.possibleLoot) } - - - // Créez un écouteur de capteur d'accéléromètre pour écouter les secousses + } + private fun setUpActivityOrientation(){ + val activity = requireActivity() + activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT + } + private fun displayToast(view: View, item: Item){ + val toastView = view.findViewById(R.id.toast) + val lootImage = toastView.findViewById(R.id.imageViewLoot) + val lootName = toastView.findViewById(R.id.nameLoot) + val xpReward = toastView.findViewById(R.id.xpRewarded) + toastView.visibility = View.VISIBLE + lootImage.setImageResource(item.image) + lootName.text = item.name + xpReward.text = boss.xpReward.toString() + toastView.postDelayed({ + toastView.visibility = View.GONE + }, 3000) + } + private fun setUpAccelerometerListener(view: View, currentPlayer: Player) { + sensorManager = requireActivity().getSystemService(Context.SENSOR_SERVICE) as SensorManager + accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) accelerometerEventListener = object : SensorEventListener { override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) { - // Ne faites rien ici + // Do nothing } - override fun onSensorChanged(event: SensorEvent?) { - val acceleration = sqrt( - event!!.values[0].pow(2) + event.values[1].pow(2) + event.values[2].pow(2) - ) - if(boss.life <= 0){ - val item = Generator.generateLootBoss(boss.possibleLoot) - println(item) - player.addItem(item) - player.gainXp(boss.xpReward) - val maVue = view.findViewById(R.id.toast) - val image = maVue.findViewById(R.id.imageViewLoot) - val name = maVue.findViewById(R.id.nameLoot) - val xp = maVue.findViewById(R.id.xpRewarded) - maVue.visibility = View.VISIBLE - image.setImageResource(item.image) - name.text = item.name - xp.text = boss.xpReward.toString() - maVue.postDelayed({ - maVue.visibility = View.GONE - - }, 3000) - boss = Generator.generateBoss() - println(boss) - imageView.setImageResource(boss.image) + val acceleration = sqrt(event!!.values[0].pow(2) + event.values[1].pow(2) + event.values[2].pow(2)) + if (boss.life <= 0) { + + //Vibration to signal the death of the boss val vibrator = context?.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator vibrator.vibrate(100) - progressBar.max = boss.maxlife - progressBar.progress = boss.life - with(recyclerView) { - layoutManager = LinearLayoutManager(view.context) - adapter = AdapterBossLoot(boss.possibleLoot) - } - - - // Définissez la propriété scaleX et scaleY de l'image sur 0.5f - + // Generate a loot item and XP reward + val item = Generator.generateLootBoss(boss.possibleLoot) + currentPlayer.addItem(item) + currentPlayer.gainXp(boss.xpReward) + // Show loot toast view for 3 seconds + displayToast(view,item) + // Spawn new boss and reset progress bar + boss = Generator.generateBoss() + setUpBoss(boss) + //Update displayed information + setUpRecyclerView(view) - } - if (acceleration > 40) { - boss.takeDamage((acceleration/80).toInt()) + } else { + // Reduce boss life based on acceleration value + boss.takeDamage((acceleration / 80).toInt()) progressBar.progress = boss.life - } - - } } - + // Register accelerometer sensor earphone with manager sensorManager.registerListener( accelerometerEventListener, accelerometer, SensorManager.SENSOR_DELAY_GAME ) - - - - return view - } - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) - - val activity = requireActivity() - activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT } override fun onDestroy() { super.onDestroy() - // Désenregistrez l'écouteur de capteur d'accéléromètre lorsque le fragment est détruit + // Unregister the accelerometer sensor listener when the fragment is destroyed sensorManager.unregisterListener(accelerometerEventListener) val activity = requireActivity() activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED diff --git a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/CollectFragment.kt b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/CollectFragment.kt index 951cb10..9011b6e 100644 --- a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/CollectFragment.kt +++ b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/CollectFragment.kt @@ -1,6 +1,6 @@ package com.example.shakecraft -import android.annotation.SuppressLint + import android.content.Context import android.content.pm.ActivityInfo import android.hardware.Sensor @@ -20,6 +20,9 @@ import android.widget.TextView import androidx.navigation.fragment.findNavController import com.example.shakecraft.model.Generator +import com.example.shakecraft.model.Item +import com.example.shakecraft.model.Player + import kotlin.math.pow import kotlin.math.sqrt @@ -30,101 +33,102 @@ class CollectFragment() : Fragment() { private lateinit var accelerometer: Sensor private lateinit var accelerometerEventListener: SensorEventListener private lateinit var progressBar: ProgressBar + private lateinit var buttonCollect: TextView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - - - - } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - val player = (activity as MainActivity).currentPlayer - // Récupérez une référence à la ProgressBar dans la vue + + val currentPlayer = (activity as MainActivity).currentPlayer val view = inflater.inflate(R.layout.fragment_collect, container, false) + // Initialize views + initializeViews(view) + + // Set up accelerometer listener + setUpAccelerometerListener(view,currentPlayer) + + // Set up activity orientation + setUpActivityOrientation() - val buttonCollect = view.findViewById(R.id.backbutton) + // Return fragment view + return view + } + private fun initializeViews(view: View) { + progressBar = view.findViewById(R.id.progressBar) + buttonCollect = view.findViewById(R.id.backbutton) buttonCollect.setOnClickListener{ findNavController().navigate(R.id.action_collectFragment_to_homeFragment) } - - progressBar = view.findViewById(R.id.progressBar) + } + private fun setUpActivityOrientation(){ + val activity = requireActivity() + activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT + } + private fun displayToast(view: View, item: Item){ + val maVue = view.findViewById(R.id.toast) + val image = maVue.findViewById(R.id.imageViewLoot) + val name = maVue.findViewById(R.id.nameLoot) + val xp = maVue.findViewById(R.id.xpRewarded) + maVue.visibility = View.VISIBLE + image.setImageResource(item.image) + name.text = item.name + xp.text = item.xpReward.toString() + maVue.postDelayed({ + maVue.visibility = View.GONE + + }, 3000) + } + private fun setUpAccelerometerListener(view: View, currentPlayer: Player) { sensorManager = requireActivity().getSystemService(Context.SENSOR_SERVICE) as SensorManager accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) - - // Créez un écouteur de capteur d'accéléromètre pour écouter les secousses accelerometerEventListener = object : SensorEventListener { override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) { - // Ne faites rien ici + // Do nothing } - - @SuppressLint("ServiceCast") override fun onSensorChanged(event: SensorEvent?) { - val acceleration = sqrt( - event!!.values[0].pow(2) + event.values[1].pow(2) + event.values[2].pow(2) - ) + val acceleration = sqrt(event!!.values[0].pow(2) + event.values[1].pow(2) + event.values[2].pow(2)) if(progressBar.progress == 100){ - val item = Generator.generateLootCollection() - println(item) - player.addItem(item) - player.gainXp(item.xpReward) - progressBar.progress = 0 + //Vibration to signal collect of the resource val vibrator = context?.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator vibrator.vibrate(100) + // Generate a resource item and XP reward + val item = Generator.generateLootCollection() + currentPlayer.addItem(item) + currentPlayer.gainXp(item.xpReward) + //reset to 0 the progress bar + progressBar.progress = 0 - - val maVue = view.findViewById(R.id.toast) - val image = maVue.findViewById(R.id.imageViewLoot) - val name = maVue.findViewById(R.id.nameLoot) - val xp = maVue.findViewById(R.id.xpRewarded) - maVue.visibility = View.VISIBLE - image.setImageResource(item.image) - name.text = item.name - xp.text = item.xpReward.toString() - maVue.postDelayed({ - maVue.visibility = View.GONE - - }, 3000) - - + // Show loot toast view for 3 seconds + displayToast(view,item) } if (acceleration > 40) { - // Le téléphone a été secoué, mettre à jour la barre de chargement ici - progressBar.progress += (acceleration/20).toInt() // Incrémente la progression de la barre de 10 unités + // raise the progress bar based on acceleration value + progressBar.progress += (acceleration/20).toInt() } } } - // Enregistrez l'écouteur de capteur d'accéléromètre + // Register accelerometer sensor earphone with manager sensorManager.registerListener( accelerometerEventListener, accelerometer, SensorManager.SENSOR_DELAY_GAME ) - - - // Retournez la vue de fragment - return view - } - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) - - val activity = requireActivity() - activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT } override fun onDestroy() { super.onDestroy() - // Désenregistrez l'écouteur de capteur d'accéléromètre lorsque le fragment est détruit + // Unregister the accelerometer sensor listener when the fragment is destroyed sensorManager.unregisterListener(accelerometerEventListener) val activity = requireActivity() activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED diff --git a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/HomeFragment.kt b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/HomeFragment.kt index 321024c..11d7ca2 100644 --- a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/HomeFragment.kt +++ b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/HomeFragment.kt @@ -5,55 +5,62 @@ import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup - import android.widget.ProgressBar import android.widget.TextView import androidx.constraintlayout.widget.ConstraintLayout import androidx.navigation.NavOptions import androidx.navigation.fragment.findNavController - - +import com.example.shakecraft.model.Player class HomeFragment : Fragment() { - + private lateinit var pseudo : TextView + private lateinit var progressbar : ProgressBar + private lateinit var level : TextView + private lateinit var rank : TextView + private lateinit var maxXp : TextView + private lateinit var xp : TextView + private lateinit var buttonCollect : ConstraintLayout + private lateinit var buttonBoss : ConstraintLayout override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) } - override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - val player = (activity as MainActivity).currentPlayer - + val currentPlayer = (activity as MainActivity).currentPlayer val view = inflater.inflate(R.layout.fragment_home,container,false) - val buttonCollect = view.findViewById(R.id.buttonCollect) + + // Initialize views + initializeViews(view, currentPlayer) + + return view + } + private fun initializeViews(view: View, currentPlayer : Player) { + pseudo = view.findViewById(R.id.pseudoTextView) + progressbar = view.findViewById(R.id.levelProgressBar) + level = view.findViewById(R.id.levelTextView) + rank = view.findViewById(R.id.rankTextView) + maxXp = view.findViewById(R.id.maxXpTextView) + xp = view.findViewById(R.id.xpTextView) + buttonCollect = view.findViewById(R.id.buttonCollect) buttonCollect.setOnClickListener{ findNavController().navigate(R.id.action_homeFragment_to_collectFragment, null, NavOptions.Builder().setPopUpTo(R.id.homeFragment, false).build()) } - val buttonBoss = view.findViewById(R.id.buttonBoss) + buttonBoss = view.findViewById(R.id.buttonBoss) buttonBoss.setOnClickListener{ findNavController().navigate(R.id.action_homeFragment_to_bossFragment, null, NavOptions.Builder().setPopUpTo(R.id.homeFragment, false).build()) } - - val pseudo = view.findViewById(R.id.pseudoTextView) - val progressbar = view.findViewById(R.id.levelProgressBar) - val level = view.findViewById(R.id.levelTextView) - val rank = view.findViewById(R.id.rankTextView) - val maxXp = view.findViewById(R.id.maxXpTextView) - val xp = view.findViewById(R.id.xpTextView) - pseudo.text = player.pseudo - level.text = player.level.toString() - rank.text = player.rank - xp.text = player.xp.toString() - maxXp.text = (player.level*100).toString() - progressbar.progress = player.xp - progressbar.max = player.level*100 - - return view + pseudo.text = currentPlayer.pseudo + level.text = currentPlayer.level.toString() + rank.text = currentPlayer.rank + xp.text = currentPlayer.xp.toString() + maxXp.text = (currentPlayer.level*100).toString() + progressbar.progress = currentPlayer.xp + progressbar.max = currentPlayer.level*100 } diff --git a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/InventoryFragment.kt b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/InventoryFragment.kt index e4d1a5e..f886ce0 100644 --- a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/InventoryFragment.kt +++ b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/InventoryFragment.kt @@ -7,32 +7,36 @@ import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import com.example.shakecraft.data.Stub import com.example.shakecraft.model.Player import com.example.shakecraft.view.adapter.AdapterInventory class InventoryFragment() : Fragment( ) { + private lateinit var recyclerView: RecyclerView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) } - - override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - var player = (activity as MainActivity).currentPlayer + val currentPlayer = (activity as MainActivity).currentPlayer val view = inflater.inflate(R.layout.fragment_inventory, container, false) - val recyclerView: RecyclerView = view.findViewById(R.id.recyclerviewInventory) + + // Initialize views + setUpRecyclerView(view, currentPlayer) + + return view + } + private fun setUpRecyclerView(view: View, currentPlayer: Player) { + recyclerView = view.findViewById(R.id.recyclerviewInventory) with(recyclerView) { layoutManager = LinearLayoutManager(view.context) - adapter = AdapterInventory(player.items) + adapter = AdapterInventory(currentPlayer.items) } - return view } } \ No newline at end of file diff --git a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/PlusFragment.kt b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/PlusFragment.kt index 58149fc..b85fb1d 100644 --- a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/PlusFragment.kt +++ b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/PlusFragment.kt @@ -6,27 +6,12 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -// TODO: Rename parameter arguments, choose names that match -// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER -private const val ARG_PARAM1 = "param1" -private const val ARG_PARAM2 = "param2" - -/** - * A simple [Fragment] subclass. - * Use the [PlusFragment.newInstance] factory method to - * create an instance of this fragment. - */ class PlusFragment : Fragment() { - // TODO: Rename and change types of parameters - private var param1: String? = null - private var param2: String? = null + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - arguments?.let { - param1 = it.getString(ARG_PARAM1) - param2 = it.getString(ARG_PARAM2) - } + } override fun onCreateView( @@ -37,23 +22,5 @@ class PlusFragment : Fragment() { return inflater.inflate(R.layout.fragment_plus, container, false) } - companion object { - /** - * Use this factory method to create a new instance of - * this fragment using the provided parameters. - * - * @param param1 Parameter 1. - * @param param2 Parameter 2. - * @return A new instance of fragment PlusFragment. - */ - // TODO: Rename and change types and number of parameters - @JvmStatic - fun newInstance(param1: String, param2: String) = - PlusFragment().apply { - arguments = Bundle().apply { - putString(ARG_PARAM1, param1) - putString(ARG_PARAM2, param2) - } - } - } + } \ No newline at end of file