銷毀後特效
銷毀後顯示特效,是以在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
}
}
}
敵人被消滅
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++
}
}
}