0

我正在创建一个类似于 Dance Dance Revolution 的游戏,其中彩色箭头在屏幕上向下移动并进入灰色箭头轮廓区域,类似于此 GIF

示例 Gif

我的程序的核心功能存储在一个 onEvent 中,它会在按下“keydown”时做出响应。onEvent 检查是否按下了正确的箭头,以及按下的箭头是否与移动彩色箭头的生成方向一致。(剧透中的代码)

onEvent("playScreen", "keydown", function(event) {
    if (getYPosition(shownArrow) == getYPosition("arrowsUpG")) {
      if (shownArrow === arrowList[0] && event.key == "Left" && getYPosition(shownArrow) === getYPosition("arrowsLeftG")) {
        speed(100);
        displayArrows();
      } else {
        if (shownArrow === arrowList[1] && event.key == "Right" && getYPosition(shownArrow) === getYPosition("arrowsRightG")) {
           speed(100);
           displayArrows();
        } else {
          if (shownArrow === arrowList[2] && event.key == "Down" && getYPosition(shownArrow) === getYPosition("arrowsDownG")) {
             speed(100);
             displayArrows();
          } else {
            if (shownArrow === arrowList[3] && event.key == "Up" && getYPosition(shownArrow) === getYPosition("arrowsUpG")) {
               speed(100);
               displayArrows();
            } else {
              healthDanger();
            }
          }
        }
      }
    }
  });
  • shownArrow - 向下移动屏幕的彩色箭头(一次生成 1 个)。
  • displayArrows - 更新游戏得分,隐藏显示箭头,然后生成并显示一个新的(在相同的变量名下)。然后这个新箭头重新定位在屏幕顶部,以便游戏可以进行
  • healthDanger - 如果不满足条件,则降低生命值。

我试图在检查位置的 onEvent 之后添加一个 if 语句,但它没有按预期工作。

游戏可以进行,但是,如果在到达空箭头轮廓之前按下正确的箭头,那么分数仍然会增加。我尝试将 onEvent 变成一个函数,所以它只能被调用一次,当箭头完成向下移动屏幕(直到它到达轮廓位置),但是,按键仍然被注册并添加到分数中,所以我删除了它。

这是使箭头在屏幕上向下移动的函数:

function movingArrows() {
  speed(99.999999999999);
  while (getYPosition(shownArrow) !== getYPosition("arrowsUpG")) {
    setPosition(shownArrow, getXPosition(shownArrow), getYPosition(shownArrow) + 1);
    console.log(getYPosition(shownArrow));
  }
//healthDanger();
}
  • arrowsUpG-是整个右、左、上、下箭头轮廓的Y位置(它们都是相同的Y位置)
  • speed 99.99999 - 用于使箭头能够在屏幕上向下滑动,我稍后会清理它。(箭头一直在屏幕上向下移动,直到它们到达轮廓。一旦它们这样做了,就可以注册 onEvent,因为 Java从while循环中释放出来)
    • 忽略healthDanger,这是一个WIP函数,会减少一个健康变量

问题 我怎样才能做到这一点,以便可以在特定时间调用 onEvent,如果这可能的话?我不希望在下降的箭头到达轮廓之前激活 onEvent,因为这会在不应该的情况下增加分数。

此外,对于任何不正确的 Java 实现,我深表歉意。我正在学习 Java 入门课程,该课程使用一个名为 code.org 的网站,而且我对编码非常陌生,这也是我的最后一个项目。

在此先感谢,任何帮助将不胜感激。

4

1 回答 1

1

我认为您的问题是您正在检查确切的像素。您不会考虑您的游戏在各种 FPS 上运行,并且您的箭​​头可能会跳过一两帧。我会添加一些范围,如果您按下键,它将被视为正确(将其视为命中框)。允许它在范围边缘+箭头大小的一半是可以的。

所以它会是这样的:

onEvent("playScreen", "keydown", function(event) {
    if (getYPosition(shownArrow) == getYPosition("arrowsUpG")) {
      if (shownArrow === arrowList[0] && event.key == "Left" && getYPosition(shownArrow) >= playScreen.height - shownArrow.height/2 && getYPosition(shownArrow) <= playScreen.height ) {
      // you clicked at right time, do something
      }
    }
});

编辑:如果您的箭头从顶部移动到底部,则向上编码。如果您的箭头从底部到顶部,它将类似于:

onEvent("playScreen", "keydown", function(event) {
    if (getYPosition(shownArrow) == getYPosition("arrowsUpG")) {
      if (shownArrow === arrowList[0] && event.key == "Left" && getYPosition(shownArrow) >= 0 && getYPosition(shownArrow) <= 0 + shownArrow.height) {
      // you clicked at right time, do something
      }
    }
});
于 2018-06-06T03:50:01.573 回答