1

我正在玩Crafty.js游戏引擎。我有一个小游戏,玩家是一个球,他掉到平台上。每次他到达下一个平台时,他都会获得一分。分数存储为变量并显示在屏幕上。我正在使用 Crafty 的碰撞检测来检测玩家何时撞击新平台。如果你不熟悉 Crafty,这很简单,每当玩家点击新平台时,就会触发一个事件,我可以将一个事件添加到分数中。

我的问题: 游戏运行在 60fps 左右。每次画布重新加载时,Crafty 都会检测玩家是否真的在触摸平台。这导致我的分数变量在玩家接触一个级别的每一帧都增加一个。这与我想要的相差甚远。我希望每个平台的分数增加一次。这是一个我不知道如何解决的问题。

我尝试解决的其他问题: 我还考虑不断测量玩家与起点的距离,然后我可以(通过划分)告诉玩家在哪个平台上(因为平台垂直间隔相等)。然而,这是一个问题,因为 Crafty 在向我提供玩家当前位置时遇到了问题。

我认为可行的方法:我认为如果我可以在玩家到达每个平台的第一帧触发一个事件,那么这可能可行。(旁注,如果玩家停留在一个平台上,然后第二次跳上并降落在同一个平台上,我只希望加分。不是二段跳)

我需要你们:你们有过这个问题吗?我真的需要完成这场比赛。这个小技术问题让我无法完成它。我很想有人输入。

4

2 回答 2

0

最简单的解决方案似乎是为每个平台设置一个变量,以跟踪玩家是否已登陆该平台。然后,每当球接触到一个尚未落地的平台时,奖励一分并将该平台标记为已落地。

如果平台是线性序列,您甚至可以有一个整数变量来跟踪播放器所在的平台。

于 2013-08-15T21:40:06.583 回答
0

我想扩展 Taymon 的答案,因为它似乎是解决这个问题的一个非常好的解决方案。我只需向平台组件添加一个布尔属性标志,以确定它是否已被计算在内。

Crafty.c('Platform', { isCounted: false })

然后,处理该命中的逻辑将在计数之前检查该标志。

这是一个活生生的例子:

var score = 0;

Crafty.init(800, 600, $('#game')[0])
Crafty.background('blue')

/**
 * because of the way gravity works
 * (or maybe I just don't really understand it),
 * I had to make separate entities for the
 * gravity and the actual hit testing for each
 * platform.
 **/
Crafty.c('Platform', {
  platform: function(x, y, visId) {
    this.addComponent('2D, DOM')
      .attr({
        h: 20,
        w: 200,
        x: x,
        y: y - 10,
        visId: visId
      });
    return this;
  },
  isCounted: false,
  visId: 0,
  vis: function() {
    return Crafty(this.visId);
  }
});

Crafty.c('PlatformVis', {
  platformVis: function(x, y) {
    this.addComponent('2D, DOM, Color, PlatformVis')
      .color('green')
      .attr({
        h: 20,
        w: 200,
        x: x,
        y: y
      });
    return this;
  }
});


// make some platforms
for (var i = 0; i < 5; ++i) {
  var x = i * 200;
  var y = i * 75 + 92;
  var vis = Crafty.e('PlatformVis').platformVis(x, y)
  Crafty.e('Platform').platform(x, y, vis.getId());
}


// player
Crafty.e('2D, DOM, Color, Twoway, Gravity, Collision')
  .color('red')
  .twoway(6, 14)
  .gravity('PlatformVis')
  .gravityConst(.8)
  .attr({
    x: 0,
    y: 0,
    h: 32,
    w: 32
  })
  .checkHits('Platform')
  .bind('HitOn', function(e) {
    var platform = e[0].obj;
    if (!platform.isCounted) {
      platform.isCounted = true;
      platform.vis().color('yellow');
      Crafty('Score').text(++score);
    }
  }, this);


// score hud
Crafty.e('2D, DOM, Text, Score')
  .text(score)
  .textColor('white')
  .textFont({
    size: '32px'
  });
<script src="https://cdnjs.cloudflare.com/ajax/libs/crafty/0.6.3/crafty-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p>Player uses the <b>Twoway</b> component, so use arrows/wasd to move/jump</p>
<div id="game"></div>

于 2015-10-12T20:58:15.380 回答