【Kotlin】坦克大战10:游戏结束

销毁后特效

销毁后显示特效,所以在Destroyable中增加一个showDestroy()方法

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

爆照效果
在这里插入图片描述
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
        }
    }
}

在这里插入图片描述

敌人被消灭

敌人太容易消灭了,我们可以当敌人被消灭时自动生成,为了更好看到游戏效果,我们设置敌方数量为2个

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

在这里插入图片描述

发布了640 篇原创文章 · 获赞 143 · 访问量 54万+

猜你喜欢

转载自blog.csdn.net/u010356768/article/details/103617676