2013-03-13 37 views
0

我有一個遊戲,用戶在開始時收集不同類型的對象和一個值爲0的標籤。每次用戶收集一個對象(通過觸摸它),它應該使得分數=當前分數+1;我嘗試了下面的代碼,但是當我點擊對象時它崩潰了。Cocos2d項目中的得分系統

這是在屏幕上放一個0我的分數標籤代碼:

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

這是無效的功能,我打電話我每次碰的對象:

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

其他所有工作e除了分數。還有一種方法可以讓蘋果消失,而不是通過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)); 
    } 
} 

}

+0

如果你想刪除而不是使不可見,使用方法'[object removeFromParentAndCleanup:true]'。也爲了將來,請不要在一個問題中提出兩個問題。而是寫下兩個問題。 – dqhendricks 2013-03-13 21:27:44

+0

嗨dghendricks,謝謝你的幫助。我試過[蘋果removeFromParentAndCleanup:真],它似乎沒有工作。蘋果仍然會留在那裏,但看不見,所以當我繼續按下它時,它會繼續爲分數標籤添加一個點。 – 2013-03-14 20:13:03

+0

如果你調用'[apple removeFromParentAndCleanup:true]',那麼蘋果就沒有辦法留在屏幕上了。要麼你看到一個不同的蘋果,你實際上並沒有調用'[apple removeFromParentAndCleanup:true]',或者你正在存儲對蘋果的引用(一個數組?),並觸發基於蘋果的不同對象的點擊不管是否在屏幕上的位置屬性。 – dqhendricks 2013-03-14 20:15:35

回答

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; 
     }   
    } 
} 
+0

嘿,謝謝你的幫助。它現在是戰船。有沒有辦法讓蘋果消失在屏幕上,而不是使可見=否; ? 由於這種方式蘋果設置爲隱形,但它仍然在屏幕上,所以如果我一直按它,它會繼續增加1的分數。我希望蘋果一旦被點擊就被銷燬。 – 2013-03-13 22:24:15

+0

見編輯。但是,我不知道你的應用程序,並不確定你爲什麼要保持對象。 – YvesLeBorg 2013-03-13 22:51:44

+0

你的意思是[object removeFromParentAndCleanup:true]?對象是蘋果?它不工作,當我這樣做,我不想保持對象周圍。我希望它被刪除 – 2013-03-13 23:05:19

0
score = score + 1; 
[scoreLabel1 setString:[NSString stringWithFormat:@"%@", score]]; 

請仔細閱讀本:String Format Specifiers

%@ - Objective-C的對象,印刷(如果可用)由descriptionWithLocale:返回的字符串,或說明,否則。也可與CFTypeRef對象一起使用,返回CFCopyDescription函數的結果。

如果您的score是一個對象,則不能以這種方式「增加」它的值。如果它是一個int或一個float,則使用錯誤的格式說明符。

+0

噢好吧我明白了,非常感謝您的幫助!我現在有點工作。讚賞。 – 2013-03-14 20:17:50