0

ユーザーがさまざまなタイプのオブジェクトと、開始時に値が0のラベルを収集するゲームがあります。ユーザーがオブジェクトを(それに触れることによって)収集するたびに、スコア=現在のスコア+1にする必要があります。次のコードで試しましたが、オブジェクトをクリックするとクラッシュします。

これは、画面に0を表示するスコアラベルのコードです。

score = 0;
scoreLabel1 = [CCLabelTTF labelWithString:@"0" fontName:@"Times New Roman" fontSize:33];
scoreLabel1.position = ccp(240, 160);
[self addChild:scoreLabel1 z:1];

そして、これは私がオブジェクトに触れるたびに呼び出すvoid関数です。

- (void) addScore
{
    score = score + 1;
    [scoreLabel1 setString:[NSString stringWithFormat:@"%@", score]];
}

そして、これは私がオブジェクトに触れるためのコードを置いた実際の部分です:

-(void) ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self ccTouchesMoved:touches withEvent:event];

UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInView:[touch view]];
location = [[CCDirector sharedDirector] convertToGL:location];

for (Apple in self.appleArray)
{
    if (CGRectContainsPoint(Apple.boundingBox, location))
    {
        [self addScore]; 
        Apple.visible = NO;            
    }
}

スコア以外はすべて機能します。また、apple.visible = falseでアップルを非表示にするのではなく、アップルを非表示にする方法はありますか?このようにリンゴはまだそこにありますが見えないので、私はそれを取り除きたいです。

誰かが助けてくれることを願っています!

ご不明な点がございましたら、お気軽にお問い合わせください。

ありがとう。

これは私がリンゴを描くところです:

    -(id) init
    {
        // always call "super" init
        // Apple recommends to re-assign "self" with the "super's" return value

    if( (self=[super init]) ) {
    isTouchEnabled_ = YES;
    self.appleArray = [CCArray arrayWithCapacity:20];

        for (int i = 0; i < 5; i++) {

            Apple = [CCSprite spriteWithFile:@"Apple4.png"];
            [self addChild:Apple];
            [appleArray addObject:Apple];
        }
     [Apple removeFromParentAndCleanup:true];
     [self scheduleUpdate];

     }
     return self;
}

そして、これは画面が更新される場所です:

-(void) update: (ccTime) dt
{
for (int i = 0; i < 5; i++) {

    Apple = ((CCSprite *)[appleArray objectAtIndex:i]);
    if (Apple.position.y > -250) {
        Apple.position = ccp(Apple.position.x, Apple.position.y - (Apple.tag*dt));
    }
}

}

4

2 に答える 2

1

ここにいくつかのことがあります。setScoreでは、フォーマットが壊れており、クラッシュが発生します(%@にはNSObject *が必要です)。試す:

[scoreLabel1 setString:[NSString stringWithFormat:@"%i", score]];

また、forループの構文がおかしいです。試す

for (Apple *anyApple in self.appleArray)
{
    if (CGRectContainsPoint(anyApple.boundingBox, location))
    {
        if (anyApple.visible) {
            [self addScore]; 
            anyApple.visible = NO; 
        }           
    }
}
于 2013-03-13T07:16:01.370 に答える
0
score = score + 1;
[scoreLabel1 setString:[NSString stringWithFormat:@"%@", score]];

これを読んでください:文字列フォーマット指定子

%@descriptionWithLocale: -Objective-Cオブジェクト。使用可能な場合はによって返される文字列として出力され、それ以外の場合は説明として出力されます。オブジェクトでも機能CFTypeRefし、関数の結果を返しCFCopyDescriptionます。

あなたscoreがオブジェクトである場合、その値をそのように「インクリメント」することはできません。intまたはfloatの場合は、間違ったフォーマット指定子を使用しています。

于 2013-03-13T07:16:13.010 に答える