微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

条件给出的坐标间隔始终为假 - 游戏、Kotlin、Android Studio

如何解决条件给出的坐标间隔始终为假 - 游戏、Kotlin、Android Studio

我正在做一个来自大学作业的 android 游戏,但我不知道如何在代码中编写坐标间隔。 所以,在游戏中,有一个障碍物正朝着玩家的方向前进(从屏幕的顶部到底部),玩家必须避开这个障碍物。问题是,每当玩家碰到障碍物时,我都希望在开始时(屏幕顶部)改变分数并重置障碍物。

例如: 如果障碍物坐标在玩家区域(它的位置加上图像的长度)之间,则障碍物的 HIT = True,因此,分数发生变化,障碍物到达起始位置。

class Obstacle(){
   var x = Random.nextInt(0,1080)*1f    //A place in the screen width
   var y = 0f                            //at the start position
   var speed = 20f
   var hit = false
   
   fun move(){
      hit = verifyHit(x,y)
      y += speed
      if (y>screen){
          y = 0
      }else if(hit){
         gameView.score --
         y=0
         hit = false
      }
   }

   fun verifyHit(x,y){
       return ((x > ufo.x || x < ufo.x + 400) || (y >= ufo.y || y < ufo.x + 400))
    }

问题是,或者这个 verifyHit 总是返回 false,或者它总是返回 true。我尝试了很多操作符,但这似乎是在屏幕上描述区域的更合乎逻辑的方式。我的最后一次尝试是:只有在 x 间隔和 y 间隔的交点处才能到达障碍物,但是当我运行它时,没有效果,所以我得出结论,它总是错误的。 这是我的应用屏幕截图:

enter image description here

谢谢!!

解决方法

没有足够的信息来确定为什么它没有给您正确的结果,但是您可以进行一些设计改进以更好地分离关注点,这将更容易追踪此类错误的原因。

您的 Obstacle 类不应直接引用您的播放器 ufo 实例。拥有这样的代码使得维护变得非常困难,因为您开始让各种类都相互指向,所以当您更改任何类的某些内容时,很难找到您必须编辑代码以使其正常工作的所有位置.

我会为一个对象的边界创建一个接口,并给它一个 intersects 函数来测试两个对象何时重叠。

interface Rectangle {
    var x: Float
    var y: Float
    var width: Float = 0f // Default to point size
    var height: Float = 0f
}

infix fun Rectangle.intersects(o: Rectangle): Boolean {
    return x < r.x + r.width && x + width > r.x && y < r.y + r.height && y + height > r.y
}

然后你可以让你的 Player 和 Obstacle 类实现这个接口。您的播放器 ufo 实例的大小可以为 400 或在一个地方定义的任何大小,以便其他对象在任何地方都没有硬编码数字。

class Obstacle: Bounds {
   override var x = Random.nextInt(0,1080).toFloat
   override var y = 0f
   override var speed = 20f
   
   fun move(){
      y += speed
      if (y > screen){
          y = 0
      }
   }

   fun reset() {
      y = 0
   }

}

处理两个对象之间的分数和交集应该是拥有类的责任 像这样:

for (obstacle in obstacles) {
    obstacle.move()
    if (obstacle intersects player) {
        gameScore--
        obstacle.reset()
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。