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

Example 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-更新游戏得分,隐藏
shownArrow,然后生成并显示一个新的(在相同的
变量名)。然后,将新箭头重新放置在
屏幕,以便游戏可以进行
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();
}



arrowUpG-是整个右,左,上,下箭头轮廓的Y位置(它们都是相同的Y位置)
速度99.99999-用于使箭头能够在屏幕上向下滑动,我稍后将对其进行清理。(箭头继续在屏幕上向下移动,直到到达轮廓为止。一旦完成,则可以注册onEvent
因为Java已从while循环中释放出来)


忽略healthDanger,多数民众赞成在WIP功能将减少健康变量




 我如何做到这一点,以便甚至可以在特定时间调用onEvent?我不希望onEvent在落下的箭头到达轮廓之前激活,因为这在不应该这样做时会增加得分。

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

在此先感谢您的帮助。

最佳答案

我认为您的问题是您只是在检查确切的像素。您不认为您的游戏正在各种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
      }
    }
});

09-25 15:20