2011-01-26 9 views
0

아이폰 (예 : cocos2d 사용)의 게임 개발에 lua와 같은 스크립팅 언어를 사용하는 이점을 이해하고 있으며 문제가 해결 될 수 있다면 코딩을 개선 할 수 있는지 이해하려고합니다. 기술).아이폰 앱에서 스크립팅을 할 수 있습니까?

-(void)MenuItem:(CCMenuItem *) menuItem { 
switch (menuItem.tag) { 
    case 1: 
    [[CCDirector sharedDirector] replaceScene:[Level1 scene]]; 
    break; 
    case 2: 
    [[CCDirector sharedDirector] replaceScene:[Level2 scene]]; 
    break; 
    case 3: 
    [[CCDirector sharedDirector] replaceScene:[Level3 scene]]; 
    break; 
    case 4: 
    [[CCDirector sharedDirector] replaceScene:[Level4 scene]]; 
    break; 
    case 5: 
    [[CCDirector sharedDirector] replaceScene:[Level5 scene]]; 
    break; 
    case 6: 
    [[CCDirector sharedDirector] replaceScene:[Level6 scene]]; 
    break; 
    case 7: 
    [[CCDirector sharedDirector] replaceScene:[Level7 scene]]; 
    break; 
    case 8: 
    [[CCDirector sharedDirector] replaceScene:[Level8 scene]]; 
    break; 
    default: 
    break; 
} 

나는 50 층이있는 경우 그 기능에 대한 문제는이,이 함수는 코드의 3 페이지를 취할 것입니다 : 내 게임에서 나는 다음과 같은 코드가 있습니다. 나는 함께이 전체 기능을 대체하고 싶습니다 :

-(void)MenuItem:(CCMenuItem *) menuItem { 
[[CCDirector sharedDirector] replaceScene:[<script> @"Level" + menuItem.tag</script> scene]]; 
} 

경우 스크립트>/script> 문자열 "레벨"및 레벨 번호, 따라서 이름을 생성을 연결할 것입니다 스크립트 언어를 포함하는 방법이 될 것입니다 클래스. 따라서이 기능은 레벨 수에 독립적입니다. 제 질문은 스크립팅 도움이 될 수 있습니까? 그렇다면 어떻게 그것이 도움이 될 수 있습니까? 없다면, 그렇게 할 해결책이 있습니까?

답변

5

난이 좋을 것 :

NSString *levelToLoad = [NSString stringWithFormat:@"Level%d", menuItem.tag]; 
[[CCDirector sharedDirector] replaceScene:[NSClassFromString(levelToLoad) scene]];

그래, 난 그냥 당신에게 입력 시간을 저장.

+0

당신이 한 오, 그래, 그래서 감사합니다. – Cyril

+1

+1 "예, 방금 타이핑 시간을 절약했습니다." :) –

0

AppStore 규칙은 앱에서 스크립트 언어를 사용하는 것을 금지합니다. 그러므로 당신이 필요로하지 않는,

[[NSClassFromString([NSString stringWithFormat:@"Level%i", menuItem.tag]) scene]]; 

모든 코드의 제어에 있기 때문에, 갈 수있는 가장 좋은 방법이 아니다 :

하지만 그건 당신의 문제가되지 않습니다, 당신은 반사 API를 사용할 수 그것을 사용하려면, 그것은 "그냥 작동"하고 해킹을 느낀다. 당신은 오히려 수준의 관리자를 구현해야합니다 그리고 당신 (예)의 주어진 레벨을 검색 한 :

[MyLevelManager levelWithId:menuItem.tag]; 
+0

야, 뭐야? MyLevelManager는 무엇을 할 것입니까? 나는 그것을 얻지 못 하느냐? 나는 그가 ~ 200 라인의 문장을 쓰지 않으려 고 생각했다. ... –

+0

[MyLevelManager registerLevel : level withId : someId]; 각 레벨 서브 클래스마다. 레벨 관리자는 레벨 ID를 f.e에 쉽게 매핑 할 수 있습니다. 배열 색인 또는 사전 키. – arul

+0

확인. 그것은 조금 더 의미가 있습니다. 그럼에도 불구하고, OP가하고 싶어하는 것을 위해, NSClassFromString은 더 빨라질 것입니다. 그는 규칙이 일관성이 없으면 다른 이야기 일 것입니다. –

관련 문제