坦克大战-kotlin

坦克大战

|------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------|----------|
| 专栏简介 |||
| 💒个人主页 📰专栏目录 点击上方查看更多内容 | 📖心灵鸡汤📖 人生中,有些事情是我们可以掌控的,把握得好,我们会拥有更多的成功机会,即使失败,也不会怨天尤人。 | 欢迎订阅!收藏! |

游戏需求

仿照IT黑马kotlin教程中的坦克大战,在它的基础上做了以下升级:

1.增加侧边栏,显示敌我双方的坦克数量

2.敌方坦克生成的同时,随机生成不同样式的坦克

3.追加坦克打击视图

👇核心玩法👇

1️⃣.经典坦克大战

👇界面原型👇

主图采用9X9布局,侧边栏使用3X9

👇成品演示👇

游戏开发

下面就总结下实现过程。

|--------|-------|
| gradle | 7.4.2 |
| jdk | 1.8 |

我这里只贴与it黑马kotlin教程中的演示代码不同部分。代码并非完整代码

1.代码实现

1.build.gradle.kts 配置

kotlin 复制代码
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    kotlin("jvm") version "1.7.10"
}

group = "org.example"
version = "1.0-SNAPSHOT"

repositories {
    mavenCentral()
    maven{url=uri("https://jitpack.io")}
}

dependencies {
    testImplementation(kotlin("test"))
    implementation("com.github.shaunxiao:kotlinGameEngine:v0.0.4")
}

tasks.test {
    useJUnitPlatform()
}

tasks.withType<KotlinCompile> {
    kotlinOptions.jvmTarget = "1.8"
}

2.我方坦克

限制坦克连接发射,防止持续按Enter时子弹持续发射

kotlin 复制代码
  //发射频率限制-防止一直按着发射键时,循环发射
    var lastShot=0L
    var shotSpeed=500

fun shot():Bullet?{
        var currentTimeMillis = System.currentTimeMillis()
        //连击限制
        if (currentTimeMillis-lastShot>=shotSpeed){
            lastShot=currentTimeMillis
        }  else {
            return null
        }
        var bulletX=0
        var bulletY=0
        var bulletWidth=17
        var bulletHeight=17
        when(crueeDirection){
            Direction.UP->{
                bulletX=x+(width-bulletWidth)/2
                bulletY=y-bulletHeight
            }
            Direction.DOWN->{
                bulletX=x+(width-bulletWidth)/2
                bulletY=y+height
            }
            Direction.LEFT->{
                bulletX=x-bulletWidth
                bulletY=y+(height-bulletHeight)/2
            }
            Direction.RIGHT->{
                bulletX=x+width
                bulletY=y+(height-bulletHeight)/2
            }
            else -> {}
        }
        Composer.play("sond/fire.wav")
        return Bullet(crueeDirection,bulletX,bulletY,this)
    }

3.敌方坦克视图样式随机生成

kotlin 复制代码
//绘制
    var i = Random.nextInt(1..2)
    override fun drow() {
        println(i)
        var imgPath = when (crueeDirection) {
            Direction.UP -> "/img/enemy${i}U.gif"
            Direction.DOWN -> "/img/enemy${i}D.gif"
            Direction.LEFT -> "/img/enemy${i}L.gif"
            Direction.RIGHT -> "/img/enemy${i}R.gif"
            else -> {"/img/p1tankU.gif"}
        }
        Painter.drawImage(imgPath,x,y)
    }

4.坦克(墙面)受击视图反馈 (追加相应音效)

两种视图,一种为受击不销毁,一种为受击销毁视图

kotlin 复制代码
 override fun notifySuffer(attackAble: AttackAble): Array<View>? {
        if (attackAble.woner is Enemy){
            //自己打自己不反应
            return null
        }
        blood-=attackAble.atk
        if (blood==0){
            Composer.play("sond/blast.wav")
            return arrayOf(Blast(x-30,y-30))
        }else{
            Composer.play("sond/hit.wav")
            return arrayOf(Born(x,y))
        }
    }

5 侧边栏绘制 Bar.ks

kotlin 复制代码
    class Bar(override val x: Int, override val y: Int) :View {
    
        override val width: Int=60
        override val height: Int=60
    
        override fun drow() {
            Painter.drawImage("/img/bar.jpeg",x,y)
            Painter.drawText("敌方坦克:",x,y+30, Color.BLACK, Font.font(20.00))
            Painter.drawText("我方坦克:",x,Config.gameHeight-100, Color.BLACK, Font.font(20.00))
        }
    
    }

6.创建BarAble

kotlin 复制代码
interface BarAble:View {
}

7.创建MiniTank.ks 和 TankLife.ks 用于侧边栏中敌方坦克和我方坦克数量的展示

kotlin 复制代码
class MiniTank(override var x: Int, override var y: Int,var totalTank:Int) :BarAble {


    override val width: Int = 30
    override val height: Int =30

    var nowTankCount=totalTank;

    var indexLst= arrayListOf<Pair<Int,Int>>()
    init {
        var tankX=x+5
        var tankY=y+40
        var index=0
        (0..nowTankCount).forEach {
            if (index==5){
                tankX=x+5
                tankY+=40
                indexLst.add(Pair(tankX,tankY))
                index=0
            }else{
                indexLst.add(Pair(tankX,tankY))
            }
            tankX+=35
            index++
        }
    }

    override fun drow() {
        var i=0
        indexLst.forEach { index->
            if (i>=nowTankCount){
            }else{
                Painter.drawImage("img/mintank.gif",index.first,index.second)
            }
            i++
        }
    }
}

8.敌我双方坦克数量在侧边栏重新绘制

kotlin 复制代码
views.filter {  it is DestoryAble }.forEach { dis->
            dis as DestoryAble
            if (dis.isDestory()){
                views.remove(dis)
                if (dis is Enemy){
                    totalEnemyNum--
                    views.filter {  it is MiniTank }.forEach { mini->
                        mini as MiniTank
                        views.remove(mini)
                        //bar 处理
                        views.add(MiniTank(Config.gameWidth,0,totalEnemyNum))
                    }
                }

                if (dis is PTank){
                    totolMyTank--
                    views.filter {  it is TankLife }.forEach { mini->
                        mini as TankLife
                        views.remove(mini)
                        if (totolMyTank>0){
                            tank=PTank(Config.block*7,Config.block*8)
                            views.add(tank)
                        }
                        //bar 处理
                        views.add(TankLife(Config.gameWidth,Config.gameHeight-130,totolMyTank))
                    }
                }
            }
        }

9.结束判断

kotlin 复制代码
        if ((views.filter { it is Camp }.isEmpty()) or (totalEnemyNum<=0) or(totolMyTank<=0)) gameOver=true

10.结束视图

kotlin 复制代码
 if (gameOver){
            Painter.drawImage("img/over.gif",Config.block*4,Config.block*4)
            return
        }

源码下载

|----------------------------------------------|----------------------------------------------|
| 源码下载 ||
| 🙊营业公告🙊 | 源码获取 🔗 |
| 🕣工作日:早8:30-晚5:30 | 源码获取 🔗 |
| 📢可在👇下方留言👇获取源码 | 源码获取 🔗 |
| 源码获取 🔗 |

相关推荐
阿巴斯甜20 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker21 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq95271 天前
Andorid Google 登录接入文档
android
黄林晴1 天前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿2 天前
Android MediaPlayer 笔记
android
Jony_2 天前
Android 启动优化方案
android
阿巴斯甜2 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇2 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_2 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android