【Kotlin】坦克大战6:攻和受

检测子弹和砖墙的碰撞

在这里插入图片描述
不要乱想了。开始写代码

创建两个接口Attackable、Sufferable

/**
 * 攻击的能力
 */
interface Attackable : View {
   
    //判断是否碰撞
    fun isCollision(suffer:Sufferable):Boolean
    //通知
    fun notifyAttack(suffer: Sufferable)
}
/**
 * 遭受攻击的能力
 */
interface Sufferable : View {
   
    fun notifySuffer(attackable: Attackable)
}

GameWindow的业务逻辑中添加

class GameWindow :
    ......
    override fun onRefresh() {
   
        ......
        //检测有攻击能力和被攻击能力的物体间是否发生了碰撞
        //1)过滤具备攻击能力的
        views.filter {
    it is Attackable }.forEach{
   attack->
            attack as Attackable
            //2)具备受攻击能力的
            views.filter {
    it is Sufferable }.forEach sufferTag@ {
   suffer->
                suffer as Sufferable
                //3)判断是否产生碰撞
                if(attack.isCollision(suffer)){
   
                    //产生碰撞,找到碰撞者
                    //通知攻击者产生碰撞了
                    attack.notifyAttack(suffer)
                    //通知被攻击者产生碰撞
                    suffer.notifySuffer(attack)
                    return@sufferTag
                }
            }
        }
    }
}

子弹实现Attackable,实现两个方法,其中是否碰撞isCollision我们在Tank中写过,直接拿过来,因为是重复代码,我们可以把它放到View中

interface View {
   
    ......
    //显示
    fun draw()

    fun checkCollision(x1:Int,y1:Int,w1:Int,h1:Int,
                       x2:Int,y2:Int,w2:Int,h2:Int):Boolean{
   
        //两个物体的坐标x,y,w,h的比较
        return when {
   
            y2 + h2 <= y1 -> //如果阻挡物在运动物上方 不碰撞
                false
            y1 + h1 <= y2 -> //如果阻挡物在运动物下方 不碰撞
                false
           x2+ w2 <= x1 -> //如果阻挡物在运动物左边 不碰撞
                false
            else -> x1 + w1 > x2
        }
    }
}

那么Tank中的碰撞方法可以修改为

class Tank
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值