diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml new file mode 100644 index 0000000..fd2a24b --- /dev/null +++ b/.idea/deploymentTargetDropDown.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0269028..cf53e4e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,7 +1,8 @@ - + + + + \ No newline at end of file diff --git a/app/src/main/java/com/example/shakecraft/BossFragment.kt b/app/src/main/java/com/example/shakecraft/BossFragment.kt index e29b92d..357e326 100644 --- a/app/src/main/java/com/example/shakecraft/BossFragment.kt +++ b/app/src/main/java/com/example/shakecraft/BossFragment.kt @@ -1,5 +1,6 @@ package com.example.shakecraft +import android.hardware.SensorManager import android.os.Bundle import androidx.fragment.app.Fragment import android.view.LayoutInflater @@ -17,16 +18,10 @@ private const val ARG_PARAM2 = "param2" * create an instance of this fragment. */ class BossFragment : 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 +32,4 @@ class BossFragment : Fragment() { return inflater.inflate(R.layout.fragment_boss, 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 BossFragment. - */ - // TODO: Rename and change types and number of parameters - @JvmStatic - fun newInstance(param1: String, param2: String) = - BossFragment().apply { - arguments = Bundle().apply { - putString(ARG_PARAM1, param1) - putString(ARG_PARAM2, param2) - } - } - } } \ No newline at end of file diff --git a/app/src/main/java/com/example/shakecraft/CollectFragment.kt b/app/src/main/java/com/example/shakecraft/CollectFragment.kt index edb20ad..28d0a7c 100644 --- a/app/src/main/java/com/example/shakecraft/CollectFragment.kt +++ b/app/src/main/java/com/example/shakecraft/CollectFragment.kt @@ -1,59 +1,127 @@ package com.example.shakecraft +import android.annotation.SuppressLint +import android.content.Context +import android.content.Context.SENSOR_SERVICE +import android.content.pm.ActivityInfo +import android.hardware.Sensor +import android.hardware.SensorEvent +import android.hardware.SensorEventListener +import android.hardware.SensorManager import android.os.Bundle +import android.os.Vibrator import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.animation.AlphaAnimation +import android.widget.ImageView +import android.widget.ProgressBar +import android.widget.TextView +import androidx.core.content.ContextCompat.getSystemService +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.example.shakecraft.data.Stub +import com.example.shakecraft.model.GeneratorLoot +import com.example.shakecraft.model.Player +import com.example.shakecraft.view.adapter.AdapterInventory +import kotlin.math.pow +import kotlin.math.sqrt -// 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 [CollectFragment.newInstance] factory method to - * create an instance of this fragment. - */ -class CollectFragment : Fragment() { - // TODO: Rename and change types of parameters - private var param1: String? = null - private var param2: String? = null + +class CollectFragment(var player: Player) : Fragment() { + var stubdata = Stub().load(); + private lateinit var sensorManager: SensorManager + private lateinit var accelerometer: Sensor + private lateinit var accelerometerEventListener: SensorEventListener + private lateinit var progressBar: ProgressBar override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - arguments?.let { - param1 = it.getString(ARG_PARAM1) - param2 = it.getString(ARG_PARAM2) - } + + } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_collect, container, false) - } + // Récupérez une référence à la ProgressBar dans la vue + val view = inflater.inflate(R.layout.fragment_collect, container, false) + + progressBar = view.findViewById(R.id.progressBar) + 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 + } + + @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) + ) + if(progressBar.progress == 100){ + val vibrator = context?.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator + vibrator.vibrate(100) + + + + val item = GeneratorLoot.generateLootCollection(); + println(item); - 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 CollectFragment. - */ - // TODO: Rename and change types and number of parameters - @JvmStatic - fun newInstance(param1: String, param2: String) = - CollectFragment().apply { - arguments = Bundle().apply { - putString(ARG_PARAM1, param1) - putString(ARG_PARAM2, param2) + 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 + val fadeIn = AlphaAnimation(0f, 1f) + fadeIn.duration = 200 + maVue.startAnimation(fadeIn) + maVue.postDelayed({ + maVue.visibility = View.GONE + image.setImageResource(item.image) + name.text = item.name + + }, 3000) + + + player.addItem(item); + progressBar.progress = 0; + } + 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 } } + } + + // Enregistrez l'écouteur de capteur d'accéléromètre + 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 + sensorManager.unregisterListener(accelerometerEventListener) + val activity = requireActivity() + activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED } } \ No newline at end of file diff --git a/app/src/main/java/com/example/shakecraft/InventoryFragment.kt b/app/src/main/java/com/example/shakecraft/InventoryFragment.kt index d156962..7592f22 100644 --- a/app/src/main/java/com/example/shakecraft/InventoryFragment.kt +++ b/app/src/main/java/com/example/shakecraft/InventoryFragment.kt @@ -8,22 +8,13 @@ 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 -// 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 [InventoryFragment.newInstance] factory method to - * create an instance of this fragment. - */ -class InventoryFragment : Fragment() { +class InventoryFragment(var player: Player) : Fragment( ) { - var stubdata = Stub().load(); override fun onCreateView( @@ -35,7 +26,7 @@ class InventoryFragment : Fragment() { val recyclerView: RecyclerView = view.findViewById(R.id.recyclerviewInventory) with(recyclerView) { layoutManager = LinearLayoutManager(view.context) - adapter = AdapterInventory(stubdata) + adapter = AdapterInventory(player.items) } return view } diff --git a/app/src/main/java/com/example/shakecraft/MainActivity.kt b/app/src/main/java/com/example/shakecraft/MainActivity.kt index 8da29ac..3c7b1ef 100644 --- a/app/src/main/java/com/example/shakecraft/MainActivity.kt +++ b/app/src/main/java/com/example/shakecraft/MainActivity.kt @@ -18,6 +18,7 @@ class MainActivity : AppCompatActivity() { private var progressValue = 20 private var lastShakePosition = 0f + var currentPlayer = Stub().currentPlayer; // Function to hide NavigationBar @RequiresApi(Build.VERSION_CODES.R) @@ -52,11 +53,11 @@ class MainActivity : AppCompatActivity() { true } R.id.inventory -> { - loadFragment(InventoryFragment()) + loadFragment(InventoryFragment(currentPlayer)) true } R.id.plus -> { - loadFragment(CollectFragment()) + loadFragment(CollectFragment(currentPlayer)) true } else -> false diff --git a/app/src/main/java/com/example/shakecraft/data/Stub.kt b/app/src/main/java/com/example/shakecraft/data/Stub.kt index c8023d2..c3de05e 100644 --- a/app/src/main/java/com/example/shakecraft/data/Stub.kt +++ b/app/src/main/java/com/example/shakecraft/data/Stub.kt @@ -1,17 +1,22 @@ package com.example.shakecraft.data +import com.example.shakecraft.R import com.example.shakecraft.model.Item +import com.example.shakecraft.model.Player class Stub { fun load() : List{ val items : MutableList = mutableListOf() - items.add(Item(name = "Beech Log", rarity = 0, stack = 1)); - items.add(Item(name = "Bronze Ore", rarity = 0, stack = 1)); - items.add(Item(name = "Iron Ore", rarity = 0, stack = 1)); - items.add(Item(name = "Diamond", rarity = 0, stack = 1)); + items.add(Item(name = "Beech Log", rarity = 0, stack = 1, R.drawable.ic_anvil)); + items.add(Item(name = "Bronze Ore", rarity = 0, stack = 1, R.drawable.ic_anvil)); + items.add(Item(name = "Iron Ore", rarity = 0, stack = 1, R.drawable.ic_anvil)); + items.add(Item(name = "Diamond", rarity = 0, stack = 1, R.drawable.ic_anvil)); return items; } + + var currentPlayer : Player = Player("Winker",0); + } \ No newline at end of file diff --git a/app/src/main/java/com/example/shakecraft/model/GeneratorLoot.kt b/app/src/main/java/com/example/shakecraft/model/GeneratorLoot.kt new file mode 100644 index 0000000..1f7208c --- /dev/null +++ b/app/src/main/java/com/example/shakecraft/model/GeneratorLoot.kt @@ -0,0 +1,29 @@ +package com.example.shakecraft.model + +import com.example.shakecraft.R +import kotlin.random.Random + +class GeneratorLoot { + + companion object { + fun generateLootCollection(): Item { + val possibleLoot: List> = listOf( + Pair(Item(name = "Beech Log", rarity = 0, stack = 1, R.drawable.log2), 0.6), + Pair(Item(name = "Bronze Ore", rarity = 0, stack = 1, R.drawable.bronze_ore), 0.25), + Pair(Item(name = "Iron Ore", rarity = 0, stack = 1, R.drawable.iron_ore), 0.10), + Pair(Item(name = "Diamond", rarity = 0, stack = 1, R.drawable.diamond), 0.05), + ) + val rand = Random.nextDouble() + + var cumulativeProb = 0.0 + for (element in possibleLoot) { + cumulativeProb += element.second + if (rand < cumulativeProb) { + return element.first + } + } + // Si aucun élément n'a été choisi, retourner le dernier élément de la liste + return possibleLoot.last().first + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/shakecraft/model/Item.kt b/app/src/main/java/com/example/shakecraft/model/Item.kt index ea6f857..f73a6a1 100644 --- a/app/src/main/java/com/example/shakecraft/model/Item.kt +++ b/app/src/main/java/com/example/shakecraft/model/Item.kt @@ -1,9 +1,12 @@ package com.example.shakecraft.model +import android.media.Image + data class Item( var name: String, var rarity: Int, var stack: Int, + var image: Int, ) diff --git a/app/src/main/java/com/example/shakecraft/model/Player.kt b/app/src/main/java/com/example/shakecraft/model/Player.kt new file mode 100644 index 0000000..ff7bc5e --- /dev/null +++ b/app/src/main/java/com/example/shakecraft/model/Player.kt @@ -0,0 +1,32 @@ +package com.example.shakecraft.model + +class Player(val pseudo: String, var xp: Int = 0) { + var level: Int = 1 + private set + + val items: MutableList = mutableListOf() + + fun addItem(item: Item) { + var findItem = items.find { it.name == item.name } + if(findItem!= null){ + findItem.stack += 1; + } + else{items.add(item)} + } + + fun removeItem(item: Item) { + items.remove(item) + } + + fun increaseXp(amount: Int) { + xp += amount + if (xp >= 100 * level) { + levelUp() + } + } + + private fun levelUp() { + level++ + println("$pseudo a atteint le niveau $level !") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/shakecraft/view/adapter/AdapterInventory.kt b/app/src/main/java/com/example/shakecraft/view/adapter/AdapterInventory.kt index 9e74a14..c1f9877 100644 --- a/app/src/main/java/com/example/shakecraft/view/adapter/AdapterInventory.kt +++ b/app/src/main/java/com/example/shakecraft/view/adapter/AdapterInventory.kt @@ -3,6 +3,7 @@ package com.example.shakecraft.view.adapter import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.ImageView import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.Adapter @@ -15,13 +16,21 @@ class AdapterInventory(private val inventory: List) : RecyclerView.Adapter class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { val textView: TextView + val textViewNumber: TextView + var imageView: ImageView + init { // Define click listener for the ViewHolder's View + textView = view.findViewById(R.id.item_name) + textViewNumber = view.findViewById(R.id.item_stock) + imageView = view.findViewById(R.id.item_image) } fun bind(item: Item) { textView.text = item.name + textViewNumber.text = item.stack.toString() + imageView.setImageResource(item.image) } } diff --git a/app/src/main/res/drawable/bronze_ore.png b/app/src/main/res/drawable/bronze_ore.png new file mode 100644 index 0000000..2fe78d9 Binary files /dev/null and b/app/src/main/res/drawable/bronze_ore.png differ diff --git a/app/src/main/res/drawable/diamond.png b/app/src/main/res/drawable/diamond.png new file mode 100644 index 0000000..d86f073 Binary files /dev/null and b/app/src/main/res/drawable/diamond.png differ diff --git a/app/src/main/res/drawable/iron_ore.png b/app/src/main/res/drawable/iron_ore.png new file mode 100644 index 0000000..a5a7a16 Binary files /dev/null and b/app/src/main/res/drawable/iron_ore.png differ diff --git a/app/src/main/res/drawable/item_background.xml b/app/src/main/res/drawable/item_background.xml new file mode 100644 index 0000000..d11eca4 --- /dev/null +++ b/app/src/main/res/drawable/item_background.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/log2.png b/app/src/main/res/drawable/log2.png new file mode 100644 index 0000000..195af4f Binary files /dev/null and b/app/src/main/res/drawable/log2.png differ diff --git a/app/src/main/res/drawable/toast_notification.xml b/app/src/main/res/drawable/toast_notification.xml new file mode 100644 index 0000000..5622a8e --- /dev/null +++ b/app/src/main/res/drawable/toast_notification.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_collect.xml b/app/src/main/res/layout/fragment_collect.xml index 03ce752..ca25ea6 100644 --- a/app/src/main/res/layout/fragment_collect.xml +++ b/app/src/main/res/layout/fragment_collect.xml @@ -59,28 +59,224 @@ app:layout_constraintTop_toBottomOf="@+id/frameLayout" /> - + app:layout_constraintTop_toBottomOf="@+id/progressBar"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/list_item.xml b/app/src/main/res/layout/list_item.xml index 283ad88..55970a4 100644 --- a/app/src/main/res/layout/list_item.xml +++ b/app/src/main/res/layout/list_item.xml @@ -1,6 +1,7 @@ @@ -36,7 +37,6 @@ android:id="@+id/item_name" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="Beech Log" android:textColor="@color/white" android:textStyle="bold" /> @@ -50,11 +50,18 @@ android:id="@+id/item_stock" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="1,6K" android:textColor="@color/grey_300" android:textStyle="bold" /> + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index f64a5d3..7b76b62 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -10,6 +10,7 @@ #6D8DFC #1D1C22 #343339 + #302F35 #2D2C32 #ADACB2 #FF3D3D diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3838a80..753c4d0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -3,6 +3,5 @@ Inventory Home Plus - Hello blank fragment \ No newline at end of file