2014-06-23 3 views
0

저는 개발중인 게임에 대해 몇 백 레벨을 만들려고합니다. 따라서 for 루프를 사용하고 각 버튼을 개별적으로 만들지는 않습니다.for 루프를 사용하여 Cocos2d 레벨을위한 버튼을 많이 만듭니다.

나는이 모든 것을 훌륭하게 수행하지만, 현재 사용하고있는 코드는 각 버튼의 호출 블록이 동일하도록 만든다. 분명히 다른 레벨 버튼을 다른 레벨로 이동 시키려면 호출 블록이 각각 다른 레벨이어야합니다.

레벨을 구분하기 위해 레벨 번호에 해당하는 횟수를 [[LevelManager sharedInstance] nextLevel] 번으로 부릅니다. 사용자가 터치 버튼을 터치하고 행/열 번호를 가져온 다음 위의 코드를 특정 횟수만큼 실행하여이 숫자를 변경하려고 시도했습니다. 그러나 버튼을 터치 한 후에 전체 호출 블록을 실행하기 전에 터치 위치가 업데이트되지 않아 코드가 작동하지 않게되었습니다.

전화 블록이 완료되기 전에 수동으로 터치 위치를 업데이트 할 수 있습니까? 어떻게 든 배열의 모든 버튼을 저장하고 각각에 대해 다른 호출 블록을 설정하는 방법이 있습니까? 가장 좋은 방법은 내 문제를 해결하는 것입니다. 감사합니다. 내 코드는 아래에 있습니다.

는 터치 위치를 얻기 위해

for (int l = 0; l < NUMBER_OF_WORLDS; l++) { 
     for (int j = 0; j < 4; j++) { 
      for (int k = 0; k < 5; k++) { 
       NSString *tempTitle = [NSString stringWithFormat:@"%i",(k+1)+(l*5)]; 
       CCButton *tempButton; 
       tempButton = [CCButton buttonWithTitle:tempTitle] 
       tempButton.block = ^(id sender) { 
        int row = floorf(touchLocation.y/(screenBounds.size.height/6)) + 1; 
        int column = floorf(touchLocation.x/(screenBounds.size.width/4)) + 1; 
        int buttonIndex = row*column; 
        for (int m = 1; m < buttonIndex; m++) { 
         [[LevelManager sharedInstance] nextLevel]; 
        } 
        CCScene *gameplayScene = [CCBReader loadAsScene:@"LevelScene"]; 
        [[CCDirector sharedDirector] replaceScene:gameplayScene]; 
        levelNumber = i; 
       }; 
       tempButton.position = ccp((screenBounds.size.width/4)*j + levelImagePlaceholder.contentSize.width*tempButton.scale, screenBounds.size.height/6*k + 50 + l*screenBounds.size.height); 
       [self addChild:tempButton]; 
       i++; 
      } 
     } 
} 

방법 초기화시 호출

-(void) touchBegan:(UITouch *)touch withEvent:(UIEvent *)event 
{ 
    CCLOG(@"touch ran"); 
    touchLocation = [touch locationInNode:self]; 
} 

답변

1

당신은 이미 행/열을 사용할 수 있습니다. 그들은 j와 k입니다. 이러한 변수는 버튼의 "눌려진"블록에서 참조 할 수 있습니다.

+0

흠, 분명히 내가 깨달은 것보다 똑똑합니다. 감사합니다.) – spaderdabomb

+0

예, 해당 int가 "__block"으로 선언되지 않았으므로 현재 값을 유지하는 블록에 복사됩니다. – CrimsonChris

관련 문제