0

我有一个 ViewController 和 GameController 类,它只是 NSObject 的子类。视图控制器有一个链接到它的按钮并触发一个 IBAction 来初始化一个 GameController 类。在 GameController 类的 init 中有一个 CADisplayLink,它将一个名为 score 的 int 添加一个。在调试器中,分数在上升,但标签只会显示 0。

在视图控制器中

-(void)setScore:(NSInteger)gameScore{
NSString *string = [NSString stringWithFormat:@"%i", gameScore];
scoreLabel.text = string;
NSLog(@"the score is %i", gameScore);
}

-(IBAction)play:(id)sender{
gameController = [[GameController alloc] init];
//in my header is GameController* gameController;
}

在游戏控制器中

-(id)init{
self = [super init];
if (self) {

viewController = [[ViewController alloc] init];
//in header ViewController* viewController;
displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(gameLoop:)];
[displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode: NSRunLoopCommonModes];

//in the header CADisplayLink* displayLink;
}
return self;

}

-(void)gameLoop:(CADisplayLink *)sender{
deltaScore++;
if (deltaScore >= 20) {
deltaScore -= 20;
score++;
//deltaScore and score are NSIntegers
[viewController setScore:score];
}
}
4

6 回答 6

2

score 没有更新,因为您正在游戏控制器中创建视图控制器的新实例,您需要以某种方式将视图控制器的对象传递给游戏控制器,然后使用相同的对象调用方法 setScore。

于 2012-10-01T05:53:28.940 回答
1

在 GameCenter 中,游戏分数是 long long int 类型,因此在您的方法中使用 long long,如果在任何地方使用,则返回类型。当你想在标签上使用它时

yourLabel.text = [NSString stringWithFormat:@"%lld",yourscore];
于 2012-10-01T05:48:48.757 回答
1

仔细查看您的代码。您的 ViewController 的 '-play:' 方法会创建一个新的 GameController。您的 GameController 的“-init”创建了一个新的 ViewController。这真的是你想要的吗?

您没有给我们太多继续,但您的游戏控制器或视图控制器似乎应该“负责”并创建另一个实例。这里有大约一百万个关于如何让一个对象向另一个对象发送一些数据的问题,但它们都归结为:要将信息从对象 a 传递到对象 b,a 需要一个指向 b 的指针。然后 A 可以使用该指针向 b 发送消息。

因此,例如,您的视图控制器会创建游戏控制器。这意味着视图控制器有一个指向游戏控制器的指针,它可以使用实例变量或属性来保存它。如果游戏控制器需要将消息发送回视图控制器,它需要一个指向视图控制器的指针。视图控制器可以在创建游戏控制器时或之后的某个时间提供该指针(指向自身)。为此,游戏控制器需要一个可以接受指向视图控制器的指针的方法。也许你决定在创建时这样做,所以你将游戏控制器的初始化卡通方法更改为'-initWithDelegate:(id)',定义一个 GameControllerDelegate 协议,然后在你的 ViewController 类中采用该协议。你会这样做,而不仅仅是使用'-initWithViewController:

于 2012-10-02T02:16:28.547 回答
0

你有没有尝试过?

NSLog(@"the score is %lu", gameScore);

它应该适合你。

于 2012-10-01T05:41:15.013 回答
0

%i是无效的格式说明符;用于有%d符号 32 位整数或%u无符号 32 位整数

于 2012-10-01T02:06:24.140 回答
0

通常,当调试器正确获取信息但 UI 没有更新时,是因为更新 UI 的操作没有在主线程上执行。尝试这个:

dispatch_async(dispatch_get_main_queue(), ^{ [viewController setScore:score]; });
于 2012-10-01T02:02:45.080 回答