-2

我希望我的球在我的比赛中变得更快。在 pos 你可以选择球的速度。但我希望球每 5 秒变得更快。pos = CGPointMake(5.0,4.0); 5 秒后 5.0 应该变成 6.0 和 4.0 变成 5.0。

我有一个名为 MainInt 的计时器。MainInt 是一个计数器,它计算您在不丢失的情况下玩了多长时间。

还有一个显示计时器的标签。(IBOutlet UILabel *秒;.h)

.m


-(void)viewDidLoad {

[lastTime setHidden:YES];


[super viewDidLoad];
// X Speed Y Speed
pos = CGPointMake(5.0,4.0); // <- these numbers (add 1 each every 5 sec.)
Speedy = [NSTimer scheduledTimerWithTimeInterval:5.0  target:self selector:@selector(doThis) userInfo:nil repeats:YES];

}

/*




-(void)doThis {



if(MainInt % 5 == MainInt)     //True every 5th second
{

    pos = CGPointMake();
}

}
*/
4

1 回答 1

1

好吧,一方面,在 5 秒后永远MainInt % 5 == MainInt错误的。1-4 是唯一MainInt可以实现这一点的值。考虑查看模运算符的工作原理。即使您将其更改为MainInt % 5 == 0,这是正确的,您仍然必须问自己为什么要检查有关外部异步时间值的任何内容。所有这一切都会做的是,如果计时器不同步,每次调用它时都强制它不做任何事情,因为你已经将它的调用之间的延迟设置为 5 秒。如果您希望一切都很好地同步,您可能应该有一个主要的 NSTimer 或 CADisplayLink 负责游戏循环,您可以在其中调用需要每帧更新游戏状态的方法。

如果您真的想以这种方式为所有事情使用单独的计时器并尝试使它们与您的主要时间值保持同步,那么您就可以了。

//replace timer line with this one
Speedy = [NSTimer scheduledTimerWithTimeInterval: 0.1  target:self selector:@selector(doThis) userInfo:nil repeats:YES];

//replace body of "doThis" with the following
if(MainInt % 5 == 0) //True every 5th second
{
    pos = CGPointMake(pos.x + 1, pos.y + 1);
}

此外,您应该遵循某种命名约定并尝试更清楚地命名事物。如果pos是球的速度,不应该命名velocity而不是位置吗?什么是Speedy实例变量?如果是这样,为什么它是大写的?另外,Speedy 是我听过的最模糊的名字之一。它不是宠物,它是一个变量。同样的事情MainInt。一般来说,类名保留大写,实例变量、方法和函数使用驼峰式命名。它会让你的代码更清晰。:)

于 2013-01-13T17:59:18.913 回答