天天看點

【Kotlin】坦克大戰10:遊戲結束

銷毀後特效

銷毀後顯示特效,是以在Destroyable中增加一個showDestroy()方法

interface Destroyable : View {
    //判斷是否銷毀了
    fun isDestroyed(): Boolean
    //挂掉的效果
    fun showDestroy():Array<View>?{
        return null
    }
}      

爆照效果

【Kotlin】坦克大戰10:遊戲結束

Camp中重寫這個方法

override fun showDestroy(): Array<View>? {
        return arrayOf(Blast(x-32,y-32), Blast(x,y-32),Blast(x+32,y-32),
            Blast(x-32,y),Blast(x,y),Blast(x+32,y),
            Blast(x-32,y+32),Blast(x,y+32),Blast(x+32,y+32))
    }      

遊戲結束

遊戲結束有兩張情況,第一種是大學營銷毀,另一種是敵人被打敗

大學營銷毀

class GameWindow :
    Window(title = "坦克大戰", icon = "img/kotlin.jpg", width = Config.gameWidth, height = Config.gameHeight) {
    //遊戲是否結束
    private var gameOver:Boolean = false

    ......
    override fun onDisplay() {
        //繪制地圖中的元素
        views.forEach {
            it.draw()
        }
        //println("${views.size}")
    }

    override fun onKeyPressed(event: KeyEvent) {
        //使用者操作時
        if(!gameOver){
            when (event.code) {
                ......
            }
        }
    }

    override fun onRefresh() {
        //業務邏輯
        //檢測銷毀
        views.filter { it is Destroyable }.forEach {
            //判斷具備銷毀能力的物體是否符合銷毀條件
            if ((it as Destroyable).isDestroyed()) {
                views.remove(it)

                val destroy = it.showDestroy()
                destroy?.let {
                    views.addAll(destroy)
                }
            }
        }

        if(gameOver) return
        ......
        //遊戲是否結束
        if(views.filter { it is Camp }.isEmpty()){
            //如果大學營是空的,遊戲結束
            gameOver = true
        }
    }
}      
【Kotlin】坦克大戰10:遊戲結束

敵人被消滅

class GameWindow :
    Window(title = "坦克大戰", icon = "img/kotlin.jpg", width = Config.gameWidth, height = Config.gameHeight) {
    ......
    //遊戲是否結束
    private var gameOver:Boolean = false
    //敵方數量
    private var enemyTotalSize = 2
    //敵方在界面上最多顯示幾個
    private var enemyActivceSize = 1
    //敵方的出生點
    private val enemyBornLocation = arrayListOf<Pair<Int,Int>>()
    //出生地點下标
    private var bornIndex = 0

   


    
    override fun onRefresh() {
        //業務邏輯
        //檢測銷毀
        views.filter { it is Destroyable }.forEach {
            //判斷具備銷毀能力的物體是否符合銷毀條件
            if ((it as Destroyable).isDestroyed()) {
                views.remove(it)

                if(it is Enemy){
                    enemyTotalSize--
                }
                val destroy = it.showDestroy()
                destroy?.let {
                    views.addAll(destroy)
                }
            }
        }
       ......
        //遊戲是否結束
        if((views.filter { it is Camp }.isEmpty()) or (enemyTotalSize<=0)){
            //如果大學營是空的,遊戲結束
            gameOver = true
        }

        //檢測敵方的出生
        //判斷目前頁面上敵方的數量,如果小于激活數量,出生
        if((enemyTotalSize > 0) and (views.filter { it is Enemy }.size < enemyActivceSize)){
            val index = bornIndex % enemyBornLocation.size
            val pair = enemyBornLocation[index]
            views.add(Enemy(pair.first,pair.second))
            bornIndex++
        }
    }
}