diff --git a/app/src/main/java/dev/baseio/composeplayground/MainActivity.kt b/app/src/main/java/dev/baseio/composeplayground/MainActivity.kt index 7ee3217..b0de322 100644 --- a/app/src/main/java/dev/baseio/composeplayground/MainActivity.kt +++ b/app/src/main/java/dev/baseio/composeplayground/MainActivity.kt @@ -9,6 +9,7 @@ import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material.MaterialTheme @@ -41,6 +42,7 @@ import dev.baseio.composeplayground.ui.animations.anmolverma.BellAnimation import dev.baseio.composeplayground.ui.animations.anmolverma.ShootingStarsAnimation import dev.baseio.composeplayground.ui.animations.anmolverma.planetarysystem.PlanetarySystem import dev.baseio.composeplayground.ui.animations.anmolverma.pulltorefresh.PullToRefreshOne +import dev.baseio.composeplayground.ui.animations.niket.dino_game.game.DinoGameView import dev.baseio.composeplayground.ui.theme.ComposePlaygroundTheme class MainActivity : ComponentActivity() { @@ -81,7 +83,7 @@ class MainActivity : ComponentActivity() { ) { HorizontalPager( modifier = Modifier.fillMaxSize(), - count = 15, state = pagerState, + count = 21, state = pagerState, ) { page -> // Our page content when (page) { @@ -183,6 +185,18 @@ class MainActivity : ComponentActivity() { ShubhamSingh(modifier = Modifier.align(Alignment.BottomCenter)) } } + 20 -> { + BoxWithConstraints( + modifier = Modifier + .fillMaxSize() + ) { + DinoGameView( + windowResource = applicationContext.resources, + maxWidth = maxWidth, + maxHeight = maxHeight, + ) + } + } } } } diff --git a/app/src/main/java/dev/baseio/composeplayground/contributors/NiketJain.kt b/app/src/main/java/dev/baseio/composeplayground/contributors/NiketJain.kt new file mode 100644 index 0000000..8c04cc2 --- /dev/null +++ b/app/src/main/java/dev/baseio/composeplayground/contributors/NiketJain.kt @@ -0,0 +1,32 @@ +package dev.baseio.composeplayground.contributors + +import androidx.compose.foundation.layout.* +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import dev.baseio.composeplayground.R +import dev.baseio.composeplayground.ui.theme.Typography + + +const val niketJainImageUrl = "https://avatars.githubusercontent.com/u/52085669?v=4" + +@Composable +fun NiketJain(modifier: Modifier = Modifier) { + Row(verticalAlignment = Alignment.CenterVertically, modifier = modifier.padding(4.dp)) { + CoilImageBox(Modifier.size(64.dp), niketJainImageUrl) + Column(verticalArrangement = Arrangement.Center, modifier = Modifier.padding(8.dp)) { + Text( + text = stringResource(id = R.string.niket_name), + style = Typography.h6.copy(MaterialTheme.colors.onSurface), + ) + Text( + text = stringResource(id = R.string.niket_email), + style = Typography.subtitle1.copy(MaterialTheme.colors.onSurface), + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/dev/baseio/composeplayground/ui/animations/niket/dino_game/game/DinoGameState.kt b/app/src/main/java/dev/baseio/composeplayground/ui/animations/niket/dino_game/game/DinoGameState.kt new file mode 100644 index 0000000..bb963da --- /dev/null +++ b/app/src/main/java/dev/baseio/composeplayground/ui/animations/niket/dino_game/game/DinoGameState.kt @@ -0,0 +1,141 @@ +package dev.baseio.composeplayground.ui.animations.niket.dino_game.game + +import androidx.compose.animation.core.Animatable +import androidx.compose.animation.core.LinearEasing +import androidx.compose.animation.core.animateFloat +import androidx.compose.animation.core.infiniteRepeatable +import androidx.compose.animation.core.rememberInfiniteTransition +import androidx.compose.animation.core.tween +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import dev.baseio.composeplayground.ui.animations.niket.dino_game.model.CactusObstacles +import dev.baseio.composeplayground.ui.animations.niket.dino_game.model.CloudCoordinates +import dev.baseio.composeplayground.ui.animations.niket.dino_game.model.CloudModel +import dev.baseio.composeplayground.ui.animations.niket.dino_game.model.DinoGameModel +import dev.baseio.composeplayground.ui.animations.niket.dino_game.model.DinoModel +import dev.baseio.composeplayground.ui.animations.niket.dino_game.model.ObstacleModel + +/* + Various methods to handle and change the state of the + different objects. + */ +@Composable +fun dinoGameState( + obstaclesList: MutableList, + cloudList: MutableList, +): DinoGameModel { + val animationScope = rememberCoroutineScope() + + val obstaclesList = createRandomGameObstacles(obstaclesList = obstaclesList) + val cloudList = createRandomClouds(cloudList = cloudList) + + // Create Dino + val dinoXPosition by remember { mutableStateOf(200f) } + val dinoYPosition by remember { mutableStateOf(1320f) } + val animatableDinoX = remember { Animatable(initialValue = dinoXPosition) } + val animatableDinoY = remember { Animatable(initialValue = dinoYPosition) } + val isRunning by remember { mutableStateOf(true) } + val isJumping by remember { mutableStateOf(false) } + val isCollided by remember { mutableStateOf(false) } + + val infiniteTransition = rememberInfiniteTransition() + val runningDinoAnimationState = infiniteTransition.animateFloat( + initialValue = 0f, + targetValue = 5f, + animationSpec = infiniteRepeatable( + animation = tween( + durationMillis = 400, + easing = LinearEasing + ) + ) + ) + + val dino = DinoModel( + xPosition = dinoXPosition, + yPosition = dinoYPosition, + isRunning = isRunning, + isJumping = isJumping, + isCollided = isCollided, + animateX = animatableDinoX, + animateY = animatableDinoY, + dinoState = runningDinoAnimationState + ) + + return DinoGameModel( + dino = dino, + coroutineScope = animationScope, + obstaclesList = obstaclesList, + cloudList = cloudList + ) +} + +@Composable +fun createRandomClouds(cloudList: MutableList): MutableList { + + val isMoving by remember { mutableStateOf(true) } + val cloudStateList = mutableListOf() + + for (cloud: CloudCoordinates in cloudList) { + val infiniteTransition = rememberInfiniteTransition() + val floatingCloudToLeftInfiniteTransition = infiniteTransition.animateFloat( + initialValue = cloud.xPosition, + targetValue = -cloud.xPosition, + animationSpec = infiniteRepeatable( + animation = tween( + durationMillis = (cloud.xPosition * 15).toInt() / 2, + easing = LinearEasing + ) + ) + ) + + cloudStateList.add( + CloudModel( + cloudCoordinates = cloud, + isMoving = isMoving, + cloudState = floatingCloudToLeftInfiniteTransition + ) + ) + } + + return cloudStateList +} + + +@Composable +fun createRandomGameObstacles( + obstaclesList: MutableList +): MutableList { + val cactusObstaclesList = mutableListOf() + + for (obstacles: ObstacleModel in obstaclesList) { + val isCollision by remember { + mutableStateOf(false) + } + + val infiniteObstaclesTransition = rememberInfiniteTransition() + val obstaclesTransition = infiniteObstaclesTransition.animateFloat( + initialValue = obstacles.xPosition, + targetValue = -obstacles.xPosition.div(1000f), + animationSpec = infiniteRepeatable( + animation = tween( + durationMillis = (obstacles.xPosition * 5).toInt() / 2, + easing = LinearEasing + ) + ) + ) + + cactusObstaclesList.add( + CactusObstacles( + obstacleModel = obstacles, + isCollision = isCollision, + isPassedOutOfScreen = false, + cactusObstaclesState = obstaclesTransition + ) + ) + } + + return cactusObstaclesList +} \ No newline at end of file diff --git a/app/src/main/java/dev/baseio/composeplayground/ui/animations/niket/dino_game/game/DinoGameView.kt b/app/src/main/java/dev/baseio/composeplayground/ui/animations/niket/dino_game/game/DinoGameView.kt new file mode 100644 index 0000000..ce73313 --- /dev/null +++ b/app/src/main/java/dev/baseio/composeplayground/ui/animations/niket/dino_game/game/DinoGameView.kt @@ -0,0 +1,124 @@ +package dev.baseio.composeplayground.ui.animations.niket.dino_game.game + +import android.content.res.Resources +import androidx.compose.animation.core.LinearOutSlowInEasing +import androidx.compose.animation.core.tween +import androidx.compose.foundation.Canvas +import androidx.compose.foundation.background +import androidx.compose.foundation.gestures.detectTapGestures +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.drawscope.DrawScope +import androidx.compose.ui.input.pointer.pointerInput +import androidx.compose.ui.unit.Dp +import dev.baseio.composeplayground.ui.animations.niket.dino_game.model.CactusObstacles +import dev.baseio.composeplayground.ui.animations.niket.dino_game.model.CloudModel +import dev.baseio.composeplayground.ui.animations.niket.dino_game.model.DinoGameModel +import dev.baseio.composeplayground.ui.animations.niket.dino_game.util.createRandomCloudsList +import dev.baseio.composeplayground.ui.animations.niket.dino_game.util.createRandomObstaclesList +import dev.baseio.composeplayground.contributors.NiketJain +import dev.baseio.composeplayground.ui.theme.DarkDinoGameBackground +import kotlinx.coroutines.launch + +@Composable +fun DinoGameView( + windowResource: Resources, + maxWidth: Dp, + maxHeight: Dp, +) { + val dinoGameState = dinoGameState( + createRandomObstaclesList(maxHeight), + createRandomCloudsList(maxWidth) + ) + + /** + * Drawing every object at the canvas + */ + Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.BottomCenter + ) { + CreateGameCanvas( + gameState = dinoGameState, + drawGameView = { drawScope -> + drawScope.drawGround(resource = windowResource) + drawScope.drawDino( + gameState = dinoGameState, + resource = windowResource + ) + removeThePassedObstacles(dinoGameState) + for (obstacles: CactusObstacles in dinoGameState.obstaclesList) { + drawScope.drawObstacles( + resource = windowResource, + obstacles = obstacles, + dinoGameState = dinoGameState + ) + } + for (cloud: CloudModel in dinoGameState.cloudList) { + drawScope.drawCloud( + resources = windowResource, + cloudModel = cloud + ) + } + } + ) + NiketJain() + } +} + +@Composable +private fun CreateGameCanvas( + gameState: DinoGameModel, + drawGameView: (DrawScope) -> Unit +) { + Canvas( + modifier = Modifier + .fillMaxSize() + .background( + color = DarkDinoGameBackground + ) + .pointerInput(Unit) { + /** When Clicked make the Dino Jump **/ + detectTapGestures { + gameState.dino.isJumping = true + if (gameState.dino.isJumping) { + gameState.coroutineScope.launch { + gameState.dino.isRunning = false + gameState.dino.animateY.animateTo( + targetValue = gameState.dino.yPosition - 175, + animationSpec = tween( + durationMillis = 275, + easing = LinearOutSlowInEasing + ) + ) + gameState.dino.animateY.animateTo( + targetValue = gameState.dino.yPosition, + animationSpec = tween( + durationMillis = 325, + easing = LinearOutSlowInEasing + ) + ) + gameState.dino.isRunning = true + gameState.dino.isJumping = false + } + } + } + }, + ) { + drawGameView(this) + } +} + +/* + Removing the Obstacles to save the Resources + We are removing the item that has been passed the X-axis screen. + */ +fun removeThePassedObstacles(gameState: DinoGameModel) { + gameState.obstaclesList.removeAll { obstacles -> + obstacles.isPassedOutOfScreen && (obstacles.obstacleModel.xPosition <= 0) + } + +} diff --git a/app/src/main/java/dev/baseio/composeplayground/ui/animations/niket/dino_game/game/GameStateController.kt b/app/src/main/java/dev/baseio/composeplayground/ui/animations/niket/dino_game/game/GameStateController.kt new file mode 100644 index 0000000..e19bb4b --- /dev/null +++ b/app/src/main/java/dev/baseio/composeplayground/ui/animations/niket/dino_game/game/GameStateController.kt @@ -0,0 +1,167 @@ +package dev.baseio.composeplayground.ui.animations.niket.dino_game.game + +import android.content.res.Resources +import android.util.Log +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.graphics.ImageBitmap +import androidx.compose.ui.graphics.Paint +import androidx.compose.ui.graphics.drawscope.DrawScope +import androidx.compose.ui.res.imageResource +import dev.baseio.composeplayground.ui.animations.niket.dino_game.model.CactusObstacles +import dev.baseio.composeplayground.ui.animations.niket.dino_game.model.CloudModel +import dev.baseio.composeplayground.ui.animations.niket.dino_game.model.DinoGameModel +import dev.baseio.composeplayground.ui.animations.niket.dino_game.util.getDinoRunningResource +import dev.baseio.composeplayground.ui.animations.niket.dino_game.util.randomCactiObstaclesListItem +import dev.baseio.composeplayground.R + +fun DrawScope.drawDino( + resource: Resources, + gameState: DinoGameModel +) { + val paint = Paint().asFrameworkPaint() + with(gameState) { + + /** + * This is to debug the code, use to display the coordinates of the animating objects. + */ +// paint.apply { +// isAntiAlias = true +// textSize = 24f +// typeface = Typeface.create(Typeface.DEFAULT, Typeface.BOLD) +// } +// drawIntoCanvas { +// it.nativeCanvas.drawText( +// "${gameState.dino.xPosition}, ${gameState.dino.yPosition}", +// gameState.dino.xPosition, +// gameState.dino.yPosition - 10, +// paint +// ) +// } + + drawImage( + image = ImageBitmap.imageResource( + id = getDinoRunningResource( + dinoState = dino.dinoState, + isCollided = dino.isCollided, + isJumping = dino.isJumping + ), + res = resource + ), + Offset( + x = dino.animateX.value, + y = dino.animateY.value + ) + ) + } +} + +fun DrawScope.drawGround( + resource: Resources +) { + drawImage( + image = ImageBitmap.imageResource( + id = R.drawable.dino_game_ground, + res = resource + ), + Offset( + x = 0f, + y = 1400f + ) + ) +} + +fun DrawScope.drawCloud( + resources: Resources, + cloudModel: CloudModel, +) { + with(cloudModel) { + cloudModel.cloudCoordinates.xPosition = cloudState.value + drawImage( + image = ImageBitmap.imageResource( + id = R.drawable.dino_game_cloud, + res = resources, + ), + Offset( + x = cloudCoordinates.xPosition, + y = cloudCoordinates.yPosition, + ), + ) + } +} + +fun DrawScope.drawObstacles( + resource: Resources, + obstacles: CactusObstacles, + dinoGameState: DinoGameModel +) { + val paint = Paint().asFrameworkPaint() + with(obstacles) { + isCollision = detectCollision(dinoGameState) + checkCollisionAndBehindObstaclesState(dinoGameState, isCollision, obstacles) + obstacleModel.xPosition = cactusObstaclesState.value + val randomObstacles = randomCactiObstaclesListItem() + + /** + * This is to debug the code, use to display the coordinates of the Moving objects. + */ +// paint.apply { +// isAntiAlias = true +// textSize = 24f +// typeface = Typeface.create(Typeface.DEFAULT, Typeface.BOLD) +// } +// drawIntoCanvas { +// it.nativeCanvas.drawText( +// "${obstacles.obstacleModel.xPosition}, ${obstacles.obstacleModel.yPosition}", +// obstacles.obstacleModel.xPosition, +// obstacles.obstacleModel.yPosition - 10, +// paint +// ) +// } + + drawImage( + image = ImageBitmap.imageResource( + res = resource, + id = R.drawable.cacti_small_1 + ), + Offset( + x = obstacleModel.xPosition, + y = 1350f + ) + ) + } +} + +/** + * This is WIP + */ +fun CactusObstacles.detectCollision(dinoGameState: DinoGameModel): Boolean { + return (dinoGameState.dino.xPosition <= obstacleModel.xPosition && dinoGameState.dino.xPosition == obstacleModel.xPosition + 5) + && (dinoGameState.dino.yPosition <= this.obstacleModel.yPosition && dinoGameState.dino.yPosition - 5 >= this.obstacleModel.yPosition) +} + +fun checkCollisionAndBehindObstaclesState( + dinoGameState: DinoGameModel, + collision: Boolean, + queriedObstacles: CactusObstacles +) { + if (collision) { + dinoGameState.obstaclesList.find { obstacle -> + obstacle.obstacleModel.id == queriedObstacles.obstacleModel.id + }?.apply { + dinoGameState.dino.isRunning = false + dinoGameState.dino.isCollided = true + Log.d( + "Collision", + "checkCollisionAndBehindObstaclesState: ${dinoGameState.dino.isCollided}" + ) + } + } + + if (queriedObstacles.obstacleModel.xPosition <= 0) { + dinoGameState.obstaclesList.find { obstacle -> + obstacle.obstacleModel.id == queriedObstacles.obstacleModel.id + }?.apply { + isPassedOutOfScreen = true + } + } +} diff --git a/app/src/main/java/dev/baseio/composeplayground/ui/animations/niket/dino_game/model/CactusObstacles.kt b/app/src/main/java/dev/baseio/composeplayground/ui/animations/niket/dino_game/model/CactusObstacles.kt new file mode 100644 index 0000000..6948708 --- /dev/null +++ b/app/src/main/java/dev/baseio/composeplayground/ui/animations/niket/dino_game/model/CactusObstacles.kt @@ -0,0 +1,10 @@ +package dev.baseio.composeplayground.ui.animations.niket.dino_game.model + +import androidx.compose.runtime.State + +data class CactusObstacles( + var obstacleModel: ObstacleModel, + var isCollision : Boolean = false, + var isPassedOutOfScreen : Boolean = false, + var cactusObstaclesState : State +) \ No newline at end of file diff --git a/app/src/main/java/dev/baseio/composeplayground/ui/animations/niket/dino_game/model/CloudCoordinates.kt b/app/src/main/java/dev/baseio/composeplayground/ui/animations/niket/dino_game/model/CloudCoordinates.kt new file mode 100644 index 0000000..31c831e --- /dev/null +++ b/app/src/main/java/dev/baseio/composeplayground/ui/animations/niket/dino_game/model/CloudCoordinates.kt @@ -0,0 +1,6 @@ +package dev.baseio.composeplayground.ui.animations.niket.dino_game.model + +data class CloudCoordinates( + var xPosition : Float = 500f, + val yPosition : Float = 500f, +) \ No newline at end of file diff --git a/app/src/main/java/dev/baseio/composeplayground/ui/animations/niket/dino_game/model/CloudModel.kt b/app/src/main/java/dev/baseio/composeplayground/ui/animations/niket/dino_game/model/CloudModel.kt new file mode 100644 index 0000000..9970f93 --- /dev/null +++ b/app/src/main/java/dev/baseio/composeplayground/ui/animations/niket/dino_game/model/CloudModel.kt @@ -0,0 +1,10 @@ +package dev.baseio.composeplayground.ui.animations.niket.dino_game.model + +import androidx.compose.runtime.State +import dev.baseio.composeplayground.ui.animations.niket.dino_game.model.CloudCoordinates + +data class CloudModel( + var cloudCoordinates: CloudCoordinates, + var isMoving : Boolean = true, + var cloudState : State +) \ No newline at end of file diff --git a/app/src/main/java/dev/baseio/composeplayground/ui/animations/niket/dino_game/model/DinoGameModel.kt b/app/src/main/java/dev/baseio/composeplayground/ui/animations/niket/dino_game/model/DinoGameModel.kt new file mode 100644 index 0000000..2e00d7d --- /dev/null +++ b/app/src/main/java/dev/baseio/composeplayground/ui/animations/niket/dino_game/model/DinoGameModel.kt @@ -0,0 +1,12 @@ +package dev.baseio.composeplayground.ui.animations.niket.dino_game.model + +import kotlinx.coroutines.CoroutineScope + +data class DinoGameModel( + val obstaclesList : MutableList, + val dino : DinoModel, + val cloudList : MutableList, + val coroutineScope: CoroutineScope, + val currentScore : Int = 0, + val highestScore : Int = 0 +) \ No newline at end of file diff --git a/app/src/main/java/dev/baseio/composeplayground/ui/animations/niket/dino_game/model/DinoModel.kt b/app/src/main/java/dev/baseio/composeplayground/ui/animations/niket/dino_game/model/DinoModel.kt new file mode 100644 index 0000000..1f5ac35 --- /dev/null +++ b/app/src/main/java/dev/baseio/composeplayground/ui/animations/niket/dino_game/model/DinoModel.kt @@ -0,0 +1,16 @@ +package dev.baseio.composeplayground.ui.animations.niket.dino_game.model + +import androidx.compose.animation.core.Animatable +import androidx.compose.animation.core.AnimationVector1D +import androidx.compose.runtime.State + +data class DinoModel( + var xPosition : Float, + var yPosition : Float = 1400f, + var isRunning : Boolean = true, + var isJumping : Boolean = false, + var isCollided : Boolean = false, + var animateX : Animatable, + var animateY : Animatable, + var dinoState : State +) \ No newline at end of file diff --git a/app/src/main/java/dev/baseio/composeplayground/ui/animations/niket/dino_game/model/ObstacleModel.kt b/app/src/main/java/dev/baseio/composeplayground/ui/animations/niket/dino_game/model/ObstacleModel.kt new file mode 100644 index 0000000..dabe863 --- /dev/null +++ b/app/src/main/java/dev/baseio/composeplayground/ui/animations/niket/dino_game/model/ObstacleModel.kt @@ -0,0 +1,7 @@ +package dev.baseio.composeplayground.ui.animations.niket.dino_game.model + +data class ObstacleModel( + val id: Long, + var xPosition: Float, + var yPosition: Float = 1400f, +) diff --git a/app/src/main/java/dev/baseio/composeplayground/ui/animations/niket/dino_game/util/CommonDinoGameElements.kt b/app/src/main/java/dev/baseio/composeplayground/ui/animations/niket/dino_game/util/CommonDinoGameElements.kt new file mode 100644 index 0000000..ea002bc --- /dev/null +++ b/app/src/main/java/dev/baseio/composeplayground/ui/animations/niket/dino_game/util/CommonDinoGameElements.kt @@ -0,0 +1,40 @@ +package dev.baseio.composeplayground.ui.animations.niket.dino_game.util + +import androidx.compose.runtime.State +import dev.baseio.composeplayground.R + +/** + * Animate Dino at specific conditions. + */ +fun getDinoRunningResource( + dinoState: State, + isCollided: Boolean, + isJumping : Boolean +): Int { + + if (isCollided) { + return R.drawable.dino_collided_2 + } + if (isJumping){ + return R.drawable.dino_1_still + } + when (dinoState.value) { + in 0.0f..1.0f -> { + return (R.drawable.dino_right_leg) + } + in 1.0f..2.0f -> { + return (R.drawable.dino_left_leg) + } + in 2.0f..3.0f -> { + return (R.drawable.dino_right_leg) + } + in 3.0f..4.0f -> { + return (R.drawable.dino_left_leg) + } + in 4.0f..5.0f -> { + return (R.drawable.dino_right_leg) + } + } + + return R.drawable.dino_1_still +} \ No newline at end of file diff --git a/app/src/main/java/dev/baseio/composeplayground/ui/animations/niket/dino_game/util/createRandomObstaclesList.kt b/app/src/main/java/dev/baseio/composeplayground/ui/animations/niket/dino_game/util/createRandomObstaclesList.kt new file mode 100644 index 0000000..82db093 --- /dev/null +++ b/app/src/main/java/dev/baseio/composeplayground/ui/animations/niket/dino_game/util/createRandomObstaclesList.kt @@ -0,0 +1,65 @@ +package dev.baseio.composeplayground.ui.animations.niket.dino_game.util + +import androidx.compose.ui.unit.Dp +import dev.baseio.composeplayground.ui.animations.niket.dino_game.model.CloudCoordinates +import dev.baseio.composeplayground.ui.animations.niket.dino_game.model.ObstacleModel +import dev.baseio.composeplayground.R +import kotlin.random.Random + +/** + * This create the Random Cactus Obstacles, + * The Random Number btw 800-1000 help us to get essentials gap btw consecutive obstacles. + * MaxScreen Width value is btw 600-700 that's why we multiply it with 2.5F value + */ +fun createRandomObstaclesList( + maxScreenWidth: Dp +): MutableList { + val cactusObstaclesList = mutableListOf() + val cactusNumber = Random.nextInt(100, 150) + for (i in 1..cactusNumber) { + cactusObstaclesList.add( + element = ObstacleModel( + id = i * System.currentTimeMillis(), + xPosition = maxScreenWidth.value * 2.5f + (i * Random.nextInt(600, 800)), + yPosition = 1400f + ) + ) + } + return cactusObstaclesList +} + +/** + * This create the Random Clouds Obstacles, + * The Random Number btw 500-1000 help us to get essentials gap btw consecutive clouds. + * MaxScreen Width value is btw 600-700 that's why we multiply it with 2.5F value + */ +fun createRandomCloudsList( + maxScreenWidth: Dp +): MutableList { + + val cloudList = mutableListOf() + val cloudNumber = Random.nextInt(from = 4, 10) + for (i in 0..cloudNumber) { + cloudList.add( + element = CloudCoordinates( + xPosition = maxScreenWidth.value * 2.5f + (i * Random.nextInt(500, 1000)), + yPosition = Random.nextInt(150, 750).toFloat(), + ) + ) + } + + return cloudList +} + +fun randomCactiObstaclesListItem(): Int { + val randomCactiObstaclesList = mutableListOf( + R.drawable.cacti_large_1, + R.drawable.cacti_large_2, + R.drawable.cacti_small_1, + R.drawable.cacti_small_2, + R.drawable.cacti_small_3, + R.drawable.cacti_group, + ) + + return randomCactiObstaclesList.random() +} diff --git a/app/src/main/java/dev/baseio/composeplayground/ui/theme/Color.kt b/app/src/main/java/dev/baseio/composeplayground/ui/theme/Color.kt index d1b0ad3..4afa9a9 100644 --- a/app/src/main/java/dev/baseio/composeplayground/ui/theme/Color.kt +++ b/app/src/main/java/dev/baseio/composeplayground/ui/theme/Color.kt @@ -5,4 +5,5 @@ import androidx.compose.ui.graphics.Color val Purple200 = Color(0xFFBB86FC) val Purple500 = Color(0xFF6200EE) val Purple700 = Color(0xFF3700B3) -val Teal200 = Color(0xFF03DAC5) \ No newline at end of file +val Teal200 = Color(0xFF03DAC5) +val DarkDinoGameBackground = Color(0xFF2D4263) \ No newline at end of file diff --git a/app/src/main/res/drawable-mdpi/cacti_group.png b/app/src/main/res/drawable-mdpi/cacti_group.png new file mode 100644 index 0000000..795fa22 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/cacti_group.png differ diff --git a/app/src/main/res/drawable-mdpi/cacti_large_1.png b/app/src/main/res/drawable-mdpi/cacti_large_1.png new file mode 100644 index 0000000..d002ac8 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/cacti_large_1.png differ diff --git a/app/src/main/res/drawable-mdpi/cacti_large_2.png b/app/src/main/res/drawable-mdpi/cacti_large_2.png new file mode 100644 index 0000000..b2ec8c9 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/cacti_large_2.png differ diff --git a/app/src/main/res/drawable-mdpi/cacti_small_1.png b/app/src/main/res/drawable-mdpi/cacti_small_1.png new file mode 100644 index 0000000..18534a4 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/cacti_small_1.png differ diff --git a/app/src/main/res/drawable-mdpi/cacti_small_2.png b/app/src/main/res/drawable-mdpi/cacti_small_2.png new file mode 100644 index 0000000..9952701 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/cacti_small_2.png differ diff --git a/app/src/main/res/drawable-mdpi/cacti_small_3.png b/app/src/main/res/drawable-mdpi/cacti_small_3.png new file mode 100644 index 0000000..48353c8 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/cacti_small_3.png differ diff --git a/app/src/main/res/drawable-mdpi/dino_1_still.png b/app/src/main/res/drawable-mdpi/dino_1_still.png new file mode 100644 index 0000000..b065319 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/dino_1_still.png differ diff --git a/app/src/main/res/drawable-mdpi/dino_2.png b/app/src/main/res/drawable-mdpi/dino_2.png new file mode 100644 index 0000000..2b2b33f Binary files /dev/null and b/app/src/main/res/drawable-mdpi/dino_2.png differ diff --git a/app/src/main/res/drawable-mdpi/dino_collided.png b/app/src/main/res/drawable-mdpi/dino_collided.png new file mode 100644 index 0000000..3dc22d1 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/dino_collided.png differ diff --git a/app/src/main/res/drawable-mdpi/dino_collided_2.png b/app/src/main/res/drawable-mdpi/dino_collided_2.png new file mode 100644 index 0000000..9a7551c Binary files /dev/null and b/app/src/main/res/drawable-mdpi/dino_collided_2.png differ diff --git a/app/src/main/res/drawable-mdpi/dino_game_cloud.png b/app/src/main/res/drawable-mdpi/dino_game_cloud.png new file mode 100644 index 0000000..f6fd638 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/dino_game_cloud.png differ diff --git a/app/src/main/res/drawable-mdpi/dino_game_ground.png b/app/src/main/res/drawable-mdpi/dino_game_ground.png new file mode 100644 index 0000000..be13348 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/dino_game_ground.png differ diff --git a/app/src/main/res/drawable-mdpi/dino_left_leg.png b/app/src/main/res/drawable-mdpi/dino_left_leg.png new file mode 100644 index 0000000..872142a Binary files /dev/null and b/app/src/main/res/drawable-mdpi/dino_left_leg.png differ diff --git a/app/src/main/res/drawable-mdpi/dino_right_leg.png b/app/src/main/res/drawable-mdpi/dino_right_leg.png new file mode 100644 index 0000000..6ba88a0 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/dino_right_leg.png differ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0acc2bb..4c8a8cf 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -4,6 +4,8 @@ anmol.verma@mutualmobile.com\nanmol.verma4@gmail.com Shubham Singh shubham.singh@mutualmobile.com + \@nikeight_ + niket.jain@mutualmobile.com LOADING \ No newline at end of file