我正在尝试制作一个基本的游戏,在该游戏中,碰到一个物体会使玩家丧命。我编写代码的方式是,每次物体和玩家接触时都会发生这种情况。我希望玩家只失去一种生命,而不是全部。知道如何解决吗?谢谢

  void colision() {
    for ( int i = 0; i<cant; i++ ) {


      if ( personaje.x > o[i].x && personaje.x < o[i].x + o[i].tam &&
        personaje.y > o[i].y && personaje.y < o[i].y + o[i].tam/2) {

        //if( dist(personaje.x, personaje.y, o[i].x, o[i].y ) < (personaje.ph/2 + o[i].tam/2) ){

        personaje.restarVida();
        personaje.reiniciar();

      }
    }
  }

最佳答案

凯文(Kevin)提出的将角色击退的建议非常好:这样可以确保每次碰撞仅一次满足碰撞条件,而不会连续不断直到角色移开为止。您可能需要在发生碰撞之前存储先前的位置。

无需变回字符的另一种变体是具有一个布尔变量,该变量可以跟踪先前是否命中过字符。然后,您仅可以在角色当前被命中但之前未被命中的情况下减去生命。

这是一个基于您的代码的概念证明片段:

void colision() {
    for ( int i = 0; i < cant; i++ ) {

        boolean estChocando = personaje.x > o[i].x && personaje.x < o[i].x + o[i].tam &&
                              personaje.y > o[i].y && personaje.y < o[i].y + o[i].tam/2;

      if (estChocando && !personaje.estabaChocando) {

        //if( dist(personaje.x, personaje.y, o[i].x, o[i].y ) < (personaje.ph/2 + o[i].tam/2) ){

        personaje.restarVida();
        personaje.reiniciar();

        // remember the character was hit, so this condition won't be met the next time around
        personaje.estabaChocando = true;

      }

      // reset character was hit flag if no longer colliding
      if(!estChocando && personaje.estabaChocando){
        personaje.estabaChocando = false;
      }

    }
  }


假设您已经在字符类中定义了boolean estabaChocando;

就我个人而言,我会接受凯文(Kevin)的建议,即在视觉上容易理解该角色,将其打回游戏,增加游戏的物理/真实感,并且在许多经典游戏中如此普遍,基本上是affordance

这是基于上述内容的示例:

void colision() {
    for ( int i = 0; i < cant; i++ ) {

        boolean estChocando = personaje.x > o[i].x && personaje.x < o[i].x + o[i].tam &&
                              personaje.y > o[i].y && personaje.y < o[i].y + o[i].tam/2;

      if (estChocando) {

        //if( dist(personaje.x, personaje.y, o[i].x, o[i].y ) < (personaje.ph/2 + o[i].tam/2) ){

        personaje.restarVida();
        personaje.reiniciar();

        // restore character to last non-collision position
        personaje.x = personaje.px;
        personaje.y = personaje.py;

      }

      // update position to restore to
      if(!estChocando){
        personaje.px = personaje.x;
        personaje.py = personaje.y;
      }

    }
  }


上面假设您要在字符类(从中实例出px)的pyx旁边添加ypersonaje属性。

这个特定的实现可能是防弹的,因为它没有考虑角色和游戏对象朝哪个方向移动。

另一种方法是开始using vectors,一开始可能会让人感到恐惧,但是它们真的很有趣,并且对于整个游戏开发超级有用。

如果要使用矢量,则可以轻松地以负速度(甚至是其倍数)增加角色的位置,以沿相反的行进方向踢角色(一定量):

java - 对撞机(Java处理)-LMLPHP

07-24 18:40