文章目录
检测子弹和砖墙的碰撞
不要乱想了。开始写代码
创建两个接口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