Tugas 9 Dessert Clicker

Nama: Dafarel Fatih Wirayudha
NRP: 5025211120
Kelas: PPB A


Pada tugas kali ini saya membuat aplikasi dessert clicker

Berikut adalah penjelasan kodenya:

data class Dessert(val imageId: Int, val price: Int, val startProductionAmount: Int)

  • Menyimpan informasi untuk setiap jenis makanan penutup: gambar (imageId), harga (price), dan jumlah penjualan yang dibutuhkan untuk menampilkannya (startProductionAmount).

object Datasource {
val dessertList = listOf(
Dessert(R.drawable.cupcake, 5, 0),
Dessert(R.drawable.donut, 10, 5),
Dessert(R.drawable.eclair, 15, 20),
Dessert(R.drawable.froyo, 30, 50),
Dessert(R.drawable.gingerbread, 50, 100),
Dessert(R.drawable.honeycomb, 100, 200),
Dessert(R.drawable.icecreamsandwich, 500, 500),
Dessert(R.drawable.jellybean, 1000, 1000),
Dessert(R.drawable.kitkat, 2000, 2000),
Dessert(R.drawable.lollipop, 3000, 4000),
Dessert(R.drawable.marshmallow, 4000, 8000),
Dessert(R.drawable.nougat, 5000, 16000),
Dessert(R.drawable.oreo, 6000, 20000)
)
}

  • Menyediakan daftar lengkap semua makanan penutup (dessertList) yang tersedia di dalam aplikasi. Aplikasi akan menggunakan daftar ini untuk semua operasinya.
private fun DessertClickerApp(
desserts: List<Dessert>
) {
var revenue by rememberSaveable { mutableStateOf(0) }
var dessertsSold by rememberSaveable { mutableStateOf(0) }

val currentDessertIndex by rememberSaveable { mutableStateOf(0) }

var currentDessertPrice by rememberSaveable {
mutableStateOf(desserts[currentDessertIndex].price)
}
var currentDessertImageId by rememberSaveable {
mutableStateOf(desserts[currentDessertIndex].imageId)
}

Scaffold(
topBar = {
val intentContext = LocalContext.current
val layoutDirection = LocalLayoutDirection.current
DessertClickerAppBar(
onShareButtonClicked = {
shareSoldDessertsInformation(
intentContext = intentContext,
dessertsSold = dessertsSold,
revenue = revenue
)
},
modifier = Modifier
.fillMaxWidth()
.padding(
start = WindowInsets.safeDrawing.asPaddingValues()
.calculateStartPadding(layoutDirection),
end = WindowInsets.safeDrawing.asPaddingValues()
.calculateEndPadding(layoutDirection),
)
.background(MaterialTheme.colorScheme.primary)
)
}
) { contentPadding ->
DessertClickerScreen(
revenue = revenue,
dessertsSold = dessertsSold,
dessertImageId = currentDessertImageId,
onDessertClicked = {
revenue += currentDessertPrice
dessertsSold++

val dessertToShow = determineDessertToShow(desserts, dessertsSold)
currentDessertImageId = dessertToShow.imageId
currentDessertPrice = dessertToShow.price
},
modifier = Modifier.padding(contentPadding)
)
}
}

  • Manajemen Keadaan (State Management): Menggunakan rememberSaveable untuk membuat dan mengingat variabel keadaan seperti revenue (pendapatan) dan dessertsSold (jumlah terjual). rememberSaveable memastikan data ini tidak hilang saat aplikasi mengalami perubahan konfigurasi (misalnya, rotasi layar).
  • Struktur Utama: Membangun struktur visual dasar aplikasi menggunakan Scaffold, yang mencakup TopBar dan layar utama (DessertClickerScreen).

fun determineDessertToShow(
desserts: List<Dessert>,
dessertsSold: Int
): Dessert {
var dessertToShow = desserts.first()
for (dessert in desserts) {
if (dessertsSold >= dessert.startProductionAmount) {
dessertToShow = dessert
} else {
break
}
}

return dessertToShow
}

  • Menentukan makanan penutup mana yang seharusnya ditampilkan di layar berdasarkan jumlah total makanan penutup yang telah terjual (dessertsSold). Fungsi ini akan memeriksa daftar makanan penutup dan mengembalikan item yang sesuai dengan progres pemain.
fun DessertClickerScreen(
revenue: Int,
dessertsSold: Int,
@DrawableRes dessertImageId: Int,
onDessertClicked: () -> Unit,
modifier: Modifier = Modifier
) {
Box(modifier = modifier) {
Image(
painter = painterResource(R.drawable.bakery_back),
contentDescription = null,
contentScale = ContentScale.Crop
)
Column {
Box(
modifier = Modifier
.weight(1f)
.fillMaxWidth(),
) {
Image(
painter = painterResource(dessertImageId),
contentDescription = null,
modifier = Modifier
.width(dimensionResource(R.dimen.image_size))
.height(dimensionResource(R.dimen.image_size))
.align(Alignment.Center)
.clickable { onDessertClicked() },
contentScale = ContentScale.Crop,
)
}
TransactionInfo(
revenue = revenue,
dessertsSold = dessertsSold,
modifier = Modifier.background(MaterialTheme.colorScheme.secondaryContainer)
)
}
}
}
  • Menambah pendapatan (revenue) dan jumlah makanan yang terjual (dessertsSold) setiap kali gambar diklik.
  • Memanggil determineDessertToShow untuk memeriksa apakah sudah waktunya beralih ke makanan penutup berikutnya.
  • Memperbarui keadaan (state) untuk gambar dan harga makanan penutup, yang secara otomatis akan memicu Jetpack Compose untuk menggambar ulang UI dengan informasi yang baru.
Hasil: 

Video Demo:

Link Source Lengkap: GitHub

Comments

Popular posts from this blog

ETS

Tugas 7 Login Page

Tugas 6 Money Converter