评分系统不工作 Obj-C
Score system not working Obj-C
所以我正在开发一款游戏并编写了评分系统。我希望它是这样的,当我向下滚动的对象与 "Box" 对象的 y.co 坐标相同时,分数系统将分数加一。
但是,在尝试此操作时,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];
}
您需要仔细考虑游戏代码的逻辑:
- 某些对象每 帧 沿 Y 轴移动,并且每帧移动可能超过 1 个像素(或点)。
- 您的 tick 方法在每一帧(或其他设置的间隔)中被调用,并且它被编码为仅在 Y 坐标与您设置的边界完全匹配时才起作用。
发生的事情是对象正在移动越过边界 在 ticks 之间,因此该方法无法检测到它(即考虑 y == 3
和对象在一次滴答中从 y == 1
变为 y == 5
。
你需要做的是拿着一个标志,显示物体是否已经越过边界,只有当这个标志为假时才检查边界条件。放置此标志的最佳位置是对象本身。
类似于:
if (!ROne.hasScored && ROne.center.y => IView.center.y) {
[self Score];
ROne.scored = YES;
}
您还需要考虑使用六个对象的数组,而不是 6 个单独的变量。
你的问题很可能是y增量不等于目标对象的y坐标,那么就不会严格相等。你会略过它。这就是 >= 起作用的原因,除非你通过它,它会不断增加分数。
所以,你需要测试的是"passing by"。也就是说移动前ROne.center.y < IView.center.y
,移动后ROne.center.y >= IView.center.y
。这是唯一有效检查 "ROne just arrived at the desired height".
的条件
或者,您可以使用 >=
并在 ROne
上使用标志 arrived
来告诉它停止计算分数。当 (ROne.center.y >= IView.center.y && ROne.arrived)
为真时,将 arrived
标志设置为假。然后当您决定将对象重置到屏幕顶部时,将 arrived
标志重置为 true。
所以我正在开发一款游戏并编写了评分系统。我希望它是这样的,当我向下滚动的对象与 "Box" 对象的 y.co 坐标相同时,分数系统将分数加一。
但是,在尝试此操作时,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];
}
您需要仔细考虑游戏代码的逻辑:
- 某些对象每 帧 沿 Y 轴移动,并且每帧移动可能超过 1 个像素(或点)。
- 您的 tick 方法在每一帧(或其他设置的间隔)中被调用,并且它被编码为仅在 Y 坐标与您设置的边界完全匹配时才起作用。
发生的事情是对象正在移动越过边界 在 ticks 之间,因此该方法无法检测到它(即考虑 y == 3
和对象在一次滴答中从 y == 1
变为 y == 5
。
你需要做的是拿着一个标志,显示物体是否已经越过边界,只有当这个标志为假时才检查边界条件。放置此标志的最佳位置是对象本身。
类似于:
if (!ROne.hasScored && ROne.center.y => IView.center.y) {
[self Score];
ROne.scored = YES;
}
您还需要考虑使用六个对象的数组,而不是 6 个单独的变量。
你的问题很可能是y增量不等于目标对象的y坐标,那么就不会严格相等。你会略过它。这就是 >= 起作用的原因,除非你通过它,它会不断增加分数。
所以,你需要测试的是"passing by"。也就是说移动前ROne.center.y < IView.center.y
,移动后ROne.center.y >= IView.center.y
。这是唯一有效检查 "ROne just arrived at the desired height".
或者,您可以使用 >=
并在 ROne
上使用标志 arrived
来告诉它停止计算分数。当 (ROne.center.y >= IView.center.y && ROne.arrived)
为真时,将 arrived
标志设置为假。然后当您决定将对象重置到屏幕顶部时,将 arrived
标志重置为 true。