일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- binding
- tabbar
- 계측
- LifeCycle
- 앱바
- Navigation
- ScrollView
- drift
- 테스트
- DART
- Dialog
- textfield
- 안드로이드
- Flutter
- Coroutines
- activity
- TEST
- viewmodel
- android
- Button
- Kotlin
- scroll
- livedata
- CustomScrollView
- appbar
- Compose
- textview
- data
- 앱
- intent
- Today
- Total
Study Record
[안드로이드] 쥬디의 찜질방 게임 만들기 - 4. 게임 만들기 (1) 본문
1. 각 요소들의 위치 정보 저장
얼음방, 불꽃방, 마사지, 라이트, 물, 달걀, 쓰레기통, 의자1, 의자2, 의자3, 쥬디의 위치정보를 저장한다.
손님은 불꽃방, 마사지, 라이트, 의자1, 의자2, 의자3 에 위치할 수 있다.
GameActivity.kt - 각 요소들의 위치 저장 + 손님이 갈 수 있는 위치 저장
/* 각 요소들의 위치정보를 저장한다. <data class ItemPoint(var x: Float = 0f, var y: Float = 0f, var width: Int = 0, var height: Int = 0)>
[0] 얼음방, [1] 불꽃방, [2] 마사지, [3] 라이트, [4] 의자1 , [5] 의자2, [6] 의자3, [7] 물 [8] 달걀 [9] 쓰레기통 */
private val mItemPosition = Array<ItemPoint>(10) { ItemPoint() }
/* 손님이 있을 수 있는 위치를 저장한 배열 < data class XYPosition(var x: Float, var y: Float) >
0 : 얼음방, 1 : 불꽃방, 2 : 마사지, 3 : 라이트, 4 : 의자1 , 5 : 의자2 , 6 : 의자3 */
val mCustomerExistPosition = Array<XYPosition>(7) { XYPosition(0F, 0F) }
// 각 요소(서비스 : 얼음방, 불꽃방, 마사지, 라이트)에서 손님이 다가갔을 때, 서비스를 받을 수 있다는 표시인 하얀색 테두리가 있는 그림으로 바뀌거나,
// 손님이 서비스를 받고 있는 게이지를 나타내는 프로그레스바를 컨트롤하는 클래스 = EvenItemControl.kt 를 담고 있는 배열이다.
lateinit var mItemControlList: ArrayList<EventItemControl>
/* 각 요소(의자1, 의자2, 의자3)에 손님이 다가갔을때, 앉을 수 있다는 표시를 해주는 것을 컨트롤하는 클래스를 담은 배열 */
lateinit var mStandControlList: ArrayList<EventStandControl>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 각 요소들의 위치정보를 가져온다.
getItemPosition(binding.iceRoom, 0)
getItemPosition(binding.fireRoom, 1)
getItemPosition(binding.masa, 2)
getItemPosition(binding.light, 3)
getItemPosition(binding.stand1, 4)
getItemPosition(binding.stand2, 5)
getItemPosition(binding.stand3, 6)
getItemPosition(binding.water, 7)
getItemPosition(binding.egg, 8)
getItemPosition(binding.waste, 9)
}
// 각 요소의 위치를 설정한다.
private fun getItemPosition(view: View, index: Int){
val viewTreeObserver = view.viewTreeObserver
viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener{
override fun onGlobalLayout() {
mItemPosition[index].x = view.x
mItemPosition[index].y = view.y
mItemPosition[index].width = view.measuredWidth
mItemPosition[index].height = view.measuredHeight
when(index){
in 0..1 -> {
// 얼음방, 불꽃방
mItemControlList[index].setItemPosition(view.x, view.y, view.measuredWidth, view.measuredHeight)
mCustomerExistPosition[index].x = if(index == 1) view.x else view.x + view.measuredWidth/2
mCustomerExistPosition[index].y = view.y + view.measuredHeight/2
}
in 2..3 -> {
// 마사지, 라이트
mItemControlList[index].setItemPosition(view.x, view.y, view.measuredWidth, view.measuredHeight)
mCustomerExistPosition[index].x = view.x
mCustomerExistPosition[index].y = view.y
}
in 4..6 -> {
// 의자일 경우 - 의자1, 의자2, 의자3
mStandControlList[index - 4].setPosition(view.x, view.y, view.measuredWidth, view.measuredHeight)
mCustomerExistPosition[index].x = view.x - view.measuredWidth/3
mCustomerExistPosition[index].y = view.y - view.measuredHeight * 1.5F
}
}
view.viewTreeObserver.removeOnGlobalLayoutListener(this)
}
})
}
GameActivity.kt - 쥬디의 초기위치 정보
// 쥬디가 사용자가 선택한 곳으로 움직이는 애니메이션 관련 변수
private lateinit var mJudyAnimation: JudyAnimation
// 쥬디가 이동해야할 경로가 담겨있는 큐이다.
private val mJudyclickQueue: Queue<Int> = LinkedList<Int>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 쥬디의 초기위치 정보 저장
getJudyInitPosition()
}
// 쥬디의 초기위치 가져오기
private fun getJudyInitPosition(){
val viewTreeObserver = binding.judy.viewTreeObserver
viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener{
override fun onGlobalLayout() {
mJudyAnimation = JudyAnimation(binding.judy, mJudyclickQueue, this@GameActivity)
mJudyAnimation.setJudyInitPosition(binding.judy.x, binding.judy.y)
binding.judy.viewTreeObserver.removeOnGlobalLayoutListener(this)
}
})
}
2. 쥬디의 찜질방에 오신 손님이 선택하는 서비스
쥬디의 찜질방에 오신 손님은 서비스 영역(얼음방, 불꽃방, 마사지, 라이트) 중 하나의 서비스를 선택할 수 있으며, 한 번 받은 서비스는 다시 선택하지 않는다. 손님은 무조건 이 4개의 서비스 중에서 랜덤으로 3개의 서비스를 받은 뒤, 계산을 해야한다.
RunItem.kt
class RunItem {
private var iceRoom = false // 0
private var fireRoom = false // 1
private var masa = false // 2
private var light = false // 3
private var count = 0 // 손님이 받은 서비스 개수 : 서비스는 3번 받는다.
// 손님이 다음 서비스 받을 것을 선택한다. -> 숫자로 리턴받는다. (0,1,2,3)
fun nextRun(now : Int) : Int{
if(now != -1) {
// 현재 받은 서비스는 서비스를 받았다고 표시한다.
valueChange(now, true)
}
if(count < 3) {
// 서비스를 선택한다.
val random = Random()
var number = random.nextInt(4)
while (indexToCheck(number)) number = random.nextInt(4)
valueChange(number, true)
count++
return number
}
return -1
}
// 서비스를 받았는지 안받았는지 설정한다.
fun valueChange(num : Int, value : Boolean){
when(num){
0 -> iceRoom = value
1 -> fireRoom = value
2 -> masa = value
3 -> light = value
}
}
// 이미 받은 서비스는 받을 수 없으므로 이미 받은 서비스인지 확인한다.
fun indexToCheck(number : Int) : Boolean{
return when(number) {
0 -> iceRoom
1 -> fireRoom
2 -> masa
3 -> light
else -> false
}
}
// 선택한 서비스(0,1,2,3)의 이미지를 리턴한다.
fun indexToResource(number : Int) : Int {
return when(number){
0 -> R.drawable.iceitem
1 -> R.drawable.fireitem
2 -> R.drawable.masaitem
3 -> R.drawable.lightitem
else -> R.drawable.money
}
}
}
3. 쥬디가 이동하는 경로
쥬디가 이동하는 경로는 사용자가 서비스 영역(얼음방, 불꽃방, 마사지, 라이트), 의자1, 의자2, 의자3, 물, 달걀, 쓰레기통으로 이동할 수 있다. 사용자가 각 요소들이 있는 위치를 앱 화면 위에 터치하면 체크 표시가 생기면서 그쪽으로 이동한다. 이동을 마치면 체크가 사라진다. 이러한 기능을 구현하기 위해, 쥬디가 이동할 경로 정보를 담은 Queue(큐)를 사용했다. 사용자가 앱 화면 위에 터치했을 때 그 위치가 쥬디가 움직일 수 있는 곳이면 Queue(큐)에 경로 정보를 넣고, 쥬디가 먼저 큐에 들어갔던 경로부터 차례로 이동할 수 있다.
JudyAnimation.kt
class JudyAnimation(val character: View, val orderQueue : Queue<Int>, val activity: GameActivity) : Animation.AnimationListener {
var positionX : Float = 0F
var positionY : Float = 0F
var version = 0
var judyInitX : Float = 0F
var judyInitY : Float = 0F
var animationFlag = false // 애니메이션이 시작했으면 true, 끝났으면 false
fun setPositionValue(version: Int, X: Float, Y: Float){
//version : 0. iceRoom 1. FireRoom 2. masa 3. light 4. water 5. egg 6. waste
this.positionX = X
this.positionY = Y
this.version = version
}
fun setJudyInitPosition(X: Float, Y: Float){
this.judyInitX = X
this.judyInitY = Y
}
fun startAnimation(){
// 현재 쥬디위치에서 이동할 곳(positionX, positonY)까지 애니메이션으로 이동한다.
val X = positionX - character.x
val Y = positionY - character.y
val adni = TranslateAnimation(0f, X, 0f, Y).apply {
duration = 2000
}
adni.setAnimationListener(this)
character.startAnimation(adni)
}
override fun onAnimationStart(animation: Animation?) {
this.animationFlag = true
}
@RequiresApi(Build.VERSION_CODES.N)
override fun onAnimationEnd(animation: Animation?) {
if(!activity.mfinish){
// 쥬디가 이동해야할 곳으로 애니메이션이 완료하면, 위치를 이동해야할 곳으로 바꾼다.
character.x = positionX
character.y = positionY
// 쥬디가 이동을 완료했으니 체크박스는 없어져야 한다.
activity.indexToCheckBox(version).visibility = ImageView.GONE
if(this.version <= 3){
// 쥬디가 0. iceRoom 1. FireRoom 2. masa 3. light 중 한 영역에 다가갔을 경우
activity.getCustomerMoneyOrSnackCheck(this.version)
}
else {
// 쥬디가 4. water , 5. egg , 6. waste 에 다가갔을 경우
activity.snackClickControl(this.version)
}
// 쥬디가 이동을 완료했으니 이동해야할 경로도 지워준다.
orderQueue.remove()
if(orderQueue.size != 0){
// 앞으로 쥬디가 이동해야할 경로가 아직 남아있으면 그쪽으로 이동한다.
activity.judyAnimationStart(orderQueue.element())
} else {
// 쥬디가 가야할 곳이 더이상 없으면 초기 위치로 돌아간다.
val X = judyInitX - character.x
val Y = judyInitY - character.y
val adni = TranslateAnimation(0f, X, 0f, Y).apply {
duration = 2000
}
adni.setAnimationListener(object : Animation.AnimationListener{
override fun onAnimationStart(animation: Animation?) {}
override fun onAnimationEnd(animation: Animation?) {
// 초기위치로 이동하는 애니메이션이 끝나면 초기위치로 이동한다.
character.x = judyInitX
character.y = judyInitY
this@JudyAnimation.animationFlag = false
// 앞으로 쥬디가 이동해야할 경로가 아직 남아있으면 그쪽으로 이동한다.
if(orderQueue.size != 0) activity.judyAnimationStart(orderQueue.element())
}
override fun onAnimationRepeat(animation: Animation?) {}
})
character.startAnimation(adni)
}
}
}
override fun onAnimationRepeat(animation: Animation?) {
}
}
GameActivity.kt
// 쥬디가 사용자가 선택한 곳으로 움직이는 애니메이션 관련 변수
private lateinit var mJudyAnimation: JudyAnimation
// 쥬디가 이동해야할 경로가 담겨있는 큐이다.
private val mJudyclickQueue: Queue<Int> = LinkedList<Int>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
/* 쥬디가 움직일 수 있는 곳을 클릭했을 때, 쥬디가 갈 경로정보를 저장하고 한곳씩 움직이는 애니메이션을 작동한다. */
binding.water.setOnClickListener {
if (indexToCheckBox(4).visibility != ImageView.VISIBLE) {
judyAnimationAdd(4)
}
}
binding.waste.setOnClickListener {
if (indexToCheckBox(6).visibility != ImageView.VISIBLE) {
judyAnimationAdd(6)
}
}
binding.egg.setOnClickListener {
if (indexToCheckBox(5).visibility != ImageView.VISIBLE) {
judyAnimationAdd(5)
}
}
binding.fireRoom.setOnClickListener {
if (indexToCheckBox(1).visibility != ImageView.VISIBLE) {
judyAnimationAdd(1)
}
}
binding.iceRoom.setOnClickListener {
if (indexToCheckBox(0).visibility != ImageView.VISIBLE) {
judyAnimationAdd(0)
}
}
binding.masa.setOnClickListener {
if (indexToCheckBox(2).visibility != ImageView.VISIBLE) {
judyAnimationAdd(2)
}
}
binding.light.setOnClickListener {
if (indexToCheckBox(3).visibility != ImageView.VISIBLE) {
judyAnimationAdd(3)
}
}
}
// 체크박스
fun indexToCheckBox(version: Int): ImageView {
return when (version) {
0 -> binding.checkBoxIceRoom
1 -> binding.checkBoxFireRoom
2 -> binding.checkBoxMasa
3 -> binding.checkBoxLight
4 -> binding.checkBoxWater
5 -> binding.checkBoxEgg
6 -> binding.checkBoxWaste
else -> binding.checkBoxIceRoom
}
}
private fun judyAnimationAdd(version: Int) {
// 쥬디가 움직여야 할 곳을 표시한다. (체크표시)
indexToCheckBox(version).visibility = ImageView.VISIBLE
// 쥬디가 움직여야하는 경로를 담고있는 큐에 경로를 추가한다.
mJudyclickQueue.add(version)
// 쥬디가 움직이지 않고 있었는데 새로운 경로를 추가한 경우
if (mJudyclickQueue.size == 1 && !mJudyAnimation.animationFlag) {
// 쥬디가 직접 움직이도록 해준다.
judyAnimationStart(version)
}
}
// 쥬디 위치 이동하기 애니메이션
fun judyAnimationStart(version: Int) {
/* version : 0. iceRoom 1. FireRoom 2. masa 3. light 4. water 5. egg 6. waste */
/* mItemPosition : [0]얼음방, [1]불꽃방, [2]마사지, [3]라이트, [4]의자1 , [5]의자2, [6]의자3, [7] 물 [8] 달걀 [9] 쓰레기통 */
when(version){
0 -> mJudyAnimation.setPositionValue(version, mItemPosition[version].x + mItemPosition[version].width/2, mItemPosition[version].y + mItemPosition[version].height/2)
1 -> mJudyAnimation.setPositionValue(version, mItemPosition[version].x + mItemPosition[version].width/3, mItemPosition[version].y + mItemPosition[version].height/2)
2 -> mJudyAnimation.setPositionValue(version, mItemPosition[version].x + mItemPosition[version].width/2, mItemPosition[version].y + mItemPosition[version].height/2)
3 -> mJudyAnimation.setPositionValue(version, mItemPosition[version].x - mItemPosition[version].width/2, mItemPosition[version].y + mItemPosition[version].height/2)
else -> {
mJudyAnimation.setPositionValue(version, mItemPosition[version + 3].x - mItemPosition[version + 3].width, mItemPosition[version + 3].y)
}
}
mJudyAnimation.startAnimation()
}
4. 쥬디가 이동할 수 있는 위치로 갔을 때, 발생하는 이벤트
쥬디가 물, 달걀, 쓰레기통에 다가갔을때와 서비스영역(얼음방, 불꽃방, 마사지, 라이트)에 다가갔을 때 발생하는 이벤트가 다른다. 만약 쥬디가 물, 달걀에 다가갔다면 양손(왼손, 오른손) 중 비어있는 손에 그 물건을 집을 것이다.
서비스 영역에 다가갔을 경우, 그곳이 마사지 기계이고 손님이 물 혹은 달걀을 원했을 경우 쥬디가 양손 중 물 혹은 달걀이 들어있다면 손님에게 건네주고(욕구 충족 완료) 그 물건을 들고있던 손은 빈 손이 될 것이다.
만약, 서비스 영역에 다가갔을 경우, 그곳에 손님이 계산을 기다리고 있다면 손님에게 계산 서비스를 제공해줄 수 있다. 계산이 끝난 손님은 나간다.
GameActivity.kt - 쥬디가 계산을 요구하는 손님에게 다가갔을 경우, 마사지에 있는 손님이 간식(물, 달걀) 을 요청했을 때 그 손님 곁으로 간 경우
/* 쥬디가 물 혹은 달걀을 집고 손님에게 가져다줄 때, 쥬디가 왼손/오른손에 들은 간식(물, 달걀) 정보 관리하는 변수 */
private val snackControl = SnackControl()
/* 각 요소들에 손님이 있는지 없는지를 확인하는 배열이다. 손님이 있으면 손님번호가, 없으면 -1이다. */
private val mItemExistCheck = Array<Int>(7) {-1}
// 서비스를 다 받고 계산까지 마친 손님 수
private var mCustomerFinishCount = 0
// 손님이 마사지 서비스를 원할 경우, 마사지를 받기 전에 물 혹은 달걀을 요청할 것이다.
// 마사지 기계는 1대이므로 이 마사지 기계에 앉은 손님의 프로그레스바의 정보는 1개만 있으면 된다.
// data class SnackToProgress(val character: View, val itemImageView: ImageView, val num : Int, val service : Int)
private var snackToProgress : SnackToProgress? = null
fun getCustomerMoneyOrSnackCheck(runNum: Int) {
if(runNum == 2 && binding.masaStandQuestion.visibility == View.VISIBLE){
// 마사지 기계로 갔다면,
if(binding.masaQuestionValue.getTag() == 0){
// 손님이 물(water)을 요청했을 경우
if (snackControl.getWaterCount() >= 1) {
// 왼손 혹은 오른손 중에 물이 있으므로 손님에게 물을 건네줄 경우
if(snackControl.getRightValue() == 0){
// 오른손에 water 있음 (water = 0)
// 손님에게 물을 줬으니 오른손은 비워있고 쥬디가 가지고 있는 총 물의 개수에서 1만큼 줄어든다.
snackControl.subRightWater()
binding.judyRight.setImageResource(0) // 쥬디의 오른손은 빈손이 된다.
} else if(snackControl.getLeftValue() == 0){
// 왼손에 water 있음
// 손님에게 물을 줬으니 오른손은 비워있고 쥬디가 가지고 있는 총 물의 개수에서 1만큼 줄어든다.
snackControl.subLeftWater()
binding.judyLeft.setImageResource(0) // 쥬디의 왼손은 빈손이 된다.
}
// 마사지 기계에 있는 손님이 물 서비스를 받았으니 서비스 요청 창은 사라진다.
binding.masaStandQuestion.visibility = View.GONE
// 손님이 물 서비스를 받고 난 뒤, 마사지 서비스를 받는다. 이 때 진행바(프로그레스바)도 같이 실행된다.
mItemControlList[snackToProgress!!.service].progressThread(snackToProgress!!.character, snackToProgress!!.itemImageView, snackToProgress!!.num, snackToProgress!!.service)
}
}
else if(binding.masaQuestionValue.getTag() == 1){
// 손님이 달걀(egg)을 요청했을 경우
if (snackControl.getEggCount() >= 1) {
// 왼손 혹은 오른손 중에 달걀(egg)이 있으므로 손님에게 달걀을 건네줄 경우
if(snackControl.getRightValue() == 1){
// 오른손에 egg 있음 (egg = 1)
// 손님에게 달걀을 줬으니 오른손은 비워있고 쥬디가 가지고 있는 총 달걀의 개수에서 1만큼 줄어든다.
snackControl.subRightEgg()
binding.judyRight.setImageResource(0) // 쥬디의 오른손은 빈손이 된다.
} else if(snackControl.getLeftValue() == 1){
// 왼손에 egg 있음
// 손님에게 달걀을 줬으니 오른손은 비워있고 쥬디가 가지고 있는 총 달걀의 개수에서 1만큼 줄어든다.
snackControl.subLeftEgg()
binding.judyLeft.setImageResource(0) // 쥬디의 왼손은 빈손이 된다.
}
// 마사지 기계에 있는 손님이 달걀 서비스를 받았으니 서비스 요청 창은 사라진다.
binding.masaStandQuestion.visibility = View.GONE
// 손님이 달걀 서비스를 받고 난 뒤, 마사지 서비스를 받는다. 이 때 진행바(프로그레스바)도 같이 실행된다.
mItemControlList[snackToProgress!!.service].progressThread(snackToProgress!!.character, snackToProgress!!.itemImageView, snackToProgress!!.num, snackToProgress!!.service)
}
}
}
else {
val num = mItemExistCheck[runNum] // 서비스 영역에 손님이 있을경우, num = 손님 번호
//Log.d("number", "기능 번호 : $runNum 숫자 : $num position : ${mPositionChacterCheck[num]}")
if (num != -1) {
// 서비스 영역에 손님이 있을경우
val itemImage = findViewById<ImageView>(nIL + num) // 그 서비스 영역에 있는 손님이 요청한 서비스의 그림 view
val itemImageTagValue = itemImage.getTag()
if (itemImageTagValue == -1) {
// 원래 손님이 계산을 요청했던 경우 계산을 해주었으니 게임 점수가 올라가고
// 손님은 계산을 끝마쳤으니 사라질 것이다.
val item = findViewById<RelativeLayout>(nRL + num)
val parent = findViewById<LinearLayout>(nPL + num)
mItemExistCheck[runNum] = -1 // 손님이 갔으니 이 서비스 영역에는 손님이 없을 것이다.
mCustomPosition[num] = -1 // 손님이 갔으니 손님의 현재 위치는 -1이다.
item.removeAllViews() // 손님 사라짐
parent.removeAllViews() // 손님 사라짐
mCustomerFinishCount++ // 계산을 마친 손님의 수
// 손님의 욕구를 충족시켜주고 계산까지 마쳤으니 점수가 올라간다.
val score = "${mCustomerFinishCount*10} 점"
binding.score.text = score
}
}
}
}
SnackControl.kt - 쥬디가 집을 수 있는 물, 달걀에 대한 관리
class SnackControl {
private var egg = 0 // 쥬디가 집은 달걀 개수
private var water = 0 // 쥬디가 집은 물 개수
private var rightSnack = false // 오른손에 물 혹은 달걀을 가지고 있는지 없는지 판별하는 변수
private var leftSnack = false // 왼손에 물 혹은 달걀을 가지고 있는지 없는지 판별하는 변수
private var rightSnackValue = -1 // 오른손에 든 간식 : 물(0), 달걀(1)
private var leftSnackValue = -1 // 왼손에 든 간식 : 물(0), 달걀(1)
fun addRightEgg(){
// 오른손에 달걀을 집은 경우
this.rightSnack = true
this.egg++
this.rightSnackValue = 1
}
fun addRightWater(){
// 오른손에 물을 집은 경우
this.rightSnack = true
this.water++
this.rightSnackValue = 0
}
fun addLeftEgg(){
// 왼손에 달걀을 집은 경우
this.leftSnack = true
this.egg++
this.leftSnackValue = 1
}
fun addLeftWater(){
// 왼손에 물을 집은 경우
this.leftSnack = true
this.water++
this.leftSnackValue = 0
}
fun subLeftEgg(){
// 왼손에서 달걀을 손님에게 주거나 쓰레기통에 버린 경우
this.leftSnack = false
this.leftSnackValue = -1
this.egg--
}
fun subLeftWater(){
// 왼손에서 물을 손님에게 주거나 쓰레기통에 버린 경우
this.leftSnack = false
this.leftSnackValue = -1
this.water--
}
fun subRightWater(){
// 오른손에서 물을 손님에게 준 버린 경우
this.rightSnack = false
this.rightSnackValue = -1
this.water--
}
fun subRightEgg(){
// 오른손에서 달걀을 손님에게 준 경우
this.rightSnack = false
this.rightSnackValue = -1
this.egg--
}
fun getRightCheck() : Boolean = this.rightSnack
fun getLeftCheck() : Boolean = this.leftSnack
fun getEggCount() : Int = this.egg
fun getWaterCount() : Int = this.water
fun getRightValue() : Int = this.rightSnackValue
fun getLeftValue() : Int = this.leftSnackValue
// 쥬디가 쓰레기통에 들고있던 간식을 버린 경우
fun clear(){
this.rightSnack = false
this.leftSnack = false
this.egg = 0
this.water = 0
this.rightSnackValue = -1
this.leftSnackValue = -1
}
fun count() : Int = this.egg + this.water
}
GameActivity.kt - 쥬디가 물, 달걀에 다가갔을 때 발생하는 이벤트
// 쥬디가 물 혹은 달걀을 집고 손님에게 가져다줄 때, 쥬디가 왼손/오른손에 들은 간식(물, 달걀) 정보 관리하는 변수
private val snackControl = SnackControl()
fun snackClickControl(clickNum: Int) {
/* clickNum : 4. water , 5. egg , 6. waste
* (water) 쥬디가 물에 다가간 경우, 비워있는 손에 물을 집는다.
* (egg) 쥬디가 달걀에 다가간 경우, 비워있는 손에 달걀을 집는다.
* (waste) 쥬디가 쓰레기통에 다가간 경우, 들고있던 물건(물, 달걀)을 전부 버린다.
* */
if (clickNum == 6) {
snackControl.clear()
binding.judyRight.setImageResource(0)
binding.judyLeft.setImageResource(0)
}
if (snackControl.count() < 2) {
if (clickNum == 4) {
if (snackControl.getRightCheck()) {
// 오른손 뭐 들었으므로 왼손으로 물을 집는다.
snackControl.addLeftWater()
binding.judyLeft.setTag(4)
binding.judyLeft.setImageResource(R.drawable.wateritem)
} else {
// 오른손이 비었으니 오른손으로 물을 집는다.
snackControl.addRightWater()
binding.judyRight.setTag(4)
binding.judyRight.setImageResource(R.drawable.wateritem)
}
} else if (clickNum == 5) {
if (snackControl.getRightCheck()) {
// 오른손 뭐 들었으므로 왼손으로 달걀을 집는다.
binding.judyLeft.setTag(5)
snackControl.addLeftEgg()
binding.judyLeft.setImageResource(R.drawable.eggitem)
} else {
// 오른손이 비었으니 오른손으로 달걀을 집는다.
binding.judyRight.setTag(5)
snackControl.addRightEgg()
binding.judyRight.setImageResource(R.drawable.eggitem)
}
}
}
}
'안드로이드' 카테고리의 다른 글
Button 색상 바꾸기 , 바탕색(windowBackground) (0) | 2022.04.07 |
---|---|
[안드로이드] 쥬디의 찜질방 게임 만들기 - 5. 게임 종료 (0) | 2021.12.27 |
[안드로이드] 쥬디의 찜질방 게임 만들기 - 4. 게임 만들기 (2) (0) | 2021.12.26 |
[안드로이드] 쥬디의 찜질방 게임 만들기 - 3. 게임 화면 셋팅 (0) | 2021.12.23 |
[안드로이드] 꺽은선 그래프 직접 그리기 - canvas (0) | 2021.12.10 |