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:
Comments
Post a Comment