【问题标题】:Score system not working Obj-C评分系统不起作用 Obj-C
【发布时间】:2015-01-12 23:30:57
【问题描述】:

所以我正在开发一款游戏并编写了评分系统。我希望它是这样,当我向下滚动的对象等于与“Box”对象相同的 y.co-ordinate 时,分数系统将分数加一。

但是,在尝试此操作时,socre 不会更新并保持为 0。我不太清楚为什么,请您告诉我哪里可能出错以及如何解决它。

这是我用来编写评分系统的代码。任何帮助将不胜感激,谢谢。

-(void)Score{

ScoreNumber = ScoreNumber + 1;
ScoreDisplay.text = [NSString stringWithFormat:@"%i", ScoreNumber];

}

[也有一些代码在视图中做了所有。但问题不在于这部分代码,因为我以前使用过它,它工作正常。]

这是要实现但不起作用的地方...

if (ROne.center.y == IView.center.y) {
        [self Score];
    }

    if (RTwo.center.y == IView.center.y) {
        [self Score];
    }

    if (RThree.center.y == IView.center.y) {
        [self Score];
    }

    if (RFour.center.y == IView.center.y) {
        [self Score];
    }

    if (RFive.center.y == IView.center.y) {
        [self Score];
    }

    if (RSix.center.y == IView.center.y) {
        [self Score];
    }

【问题讨论】:

  • 也许您的意思是不在您的代码中工作,而不是在 Xcode 中工作。 Xcode 是 IDE,基本上是一个花哨的编辑器。它有助于理解和使用正确的术语。它还有助于阅读 Objectve-C 命名标准。
  • 显示ScoreNumber的声明。另外,您如何确定帧更新恰好在onething.y == anotherthing.y 时发生,而不是在它通过时发生?在这种情况下,这几乎肯定是错误。
  • 进一步:您使用的是什么游戏框架以及您展示的方法是什么(即在游戏循环中何时调用)?
  • 我已经在我的 .h 文件中将 ScoreNumber 声明为 int,并在 View 中定义了 ScoreNumber = 0。我认为您对帧数的看法是正确的。此外,我没有添加 ==,而是添加了 >= 并且分数会更新,但是它会不断更新,直到对象重新生成到不同的坐标和页面顶部。因此,它不是在分数上加 1,而是一直加到重新生成。所以它在分数上增加了 15 而不仅仅是 1。我不知道这是否有意义。我能做些什么来确保它只在分数上加一个,而不是继续加和再生点?
  • 另外,我使用 obj-c 不是 swift。而不是精灵套件。我正在一个标准的单视图控制器中制作它。

标签: ios scoring


【解决方案1】:

您的问题很可能是 y 增量不等于目标对象的 y 坐标,那么它就不会严格相等。你只会略过它。这就是 >= 起作用的原因,除非您通过它,否则它将继续增加分数。

所以,你需要测试的是“路过”。也就是说移动前ROne.center.y < IView.center.y,移动后ROne.center.y >= IView.center.y。这是有效检查“ROne 刚刚到达所需高度”的唯一条件。

或者,您可以使用>= 并在ROne 上使用标志arrived 来告诉它停止计算分数。当(ROne.center.y >= IView.center.y && ROne.arrived) 为真时,将arrived 标志设置为假。然后,当您决定将对象重置到屏幕顶部时,将 arrived 标志重置为 true。

【讨论】:

    【解决方案2】:

    您需要仔细考虑游戏代码的逻辑:

    1. 每个都有一些对象沿 Y 轴移动,并且该移动可能超过每帧 1 个像素(或点)。
    2. 您的 tick 方法在每一帧(或其他设置的时间间隔)都被调用,并且它被编码为仅在 Y 坐标与您设置的边界完全匹配时才起作用。

    发生的情况是对象正在移动超出边界刻度之间,因此该方法无法检测到它(即考虑y == 3 和对象从y == 1 到的边界y == 5 打勾)。

    您需要做的是持有一个标志,显示对象是否已超出边界,并且仅在此标志为假时检查边界条件是否。放置此标志的最佳位置是对象本身。

    类似:

    if (!ROne.hasScored && ROne.center.y => IView.center.y) {
        [self Score];
        ROne.scored = YES;
    }
    

    您还需要考虑使用由六个对象组成的数组,而不是 6 个单独的变量。

    【讨论】:

    • 那么我会声明 hasScored 和 score 为 BOOL 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多