Study Record

[안드로이드] 쥬디의 찜질방 게임 만들기 - 4. 게임 만들기 (1) 본문

안드로이드

[안드로이드] 쥬디의 찜질방 게임 만들기 - 4. 게임 만들기 (1)

초코초코초코 2021. 12. 23. 03:22
728x90

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)
            }
        }
    }
}

 

 

 

728x90