销毁后特效

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

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

爆照效果
【Kotlin】坦克大战10:游戏结束_ide
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:游戏结束_kotlin_02

敌人被消灭

敌人太容易消灭了,我们可以当敌人被消灭时自动生成,为了更好看到游戏效果,我们设置敌方数量为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++
}
}
}

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