0

ViewControllerと、NSObjectからサブクラス化されたGameControllerクラスがあります。ビューコントローラには1つのボタンがリンクされており、GameControllerクラスを開始するIBActionを起動します。GameControllerクラスのinitには、scoreという名前のintに1を追加するCADisplayLinkがあります。デバッガーではスコアが上がりますが、ラベルには0しか表示されません。

ViewControllerで

-(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;
}

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

ゲームコントローラーでビューコントローラーの新しいインスタンスを作成しているため、スコアは更新されません。どういうわけか、ビューコントローラーのオブジェクトをゲームコントローラーに渡してから、同じオブジェクトを使用してメソッド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を作成します。それは本当にあなたが望むものですか?

先に進むことはあまりありませんが、ゲームコントローラーまたはビューコントローラーのいずれかが「担当」し、もう一方のインスタンスを作成する必要があるようです。SOには、あるオブジェクトから別のオブジェクトにデータを送信する方法に関する約100万の質問がありますが、これらはすべて、オブジェクトaからオブジェクトbに情報を渡すには、bへのポインターが必要です。次に、Aはそのポインタを使用してbにメッセージを送信できます。

したがって、たとえば、ビューコントローラがゲームコントローラを作成します。つまり、ビューコントローラにはゲームコントローラへのポインタがあり、インスタンス変数またはプロパティを使用してそれを保存できます。ゲームコントローラーがメッセージをViewControllerに送り返す必要がある場合は、ViewControllerへのポインターが必要になります。ビューコントローラは、ゲームコントローラが作成されたとき、またはその後のある時点で、そのポインタを(それ自体に)提供できます。これを容易にするために、ゲームコントローラーにはビューコントローラーへのポインターを受け入れることができるメソッドが必要です。作成時に行うことにしたので、ゲームコントローラーのinitializetoonメソッドを'-initWithDelegate:(id)'に変更し、GameControllerDelegateプロトコルを定義してから、そのプロトコルをViewControllerクラスに採用します。'-initWithViewControllerを使用するだけでなく、これを実行します。

于 2012-10-02T02:16:28.547 に答える
0

通常、デバッガーが情報を正しく取得してもUIが更新されないのは、UIを更新する操作がメインスレッドで実行されていないためです。これを試して:

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

%i無効なフォーマット指定子です。%d符号付き32ビット整数または%u符号なし32ビット整数に使用

于 2012-10-01T02:06:24.140 に答える
0

やってみました?

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

それはあなたのために働くはずです。

于 2012-10-01T05:41:15.013 に答える