2012-06-26 2 views
-1

ok ... 그래서 무작위로 클래스의 레벨을 생성 한 다음 게임에 전달합니다.프로그램이 루프에 갇혀 있는지 확인하십시오.

문제는 가끔 레벨을 생성 할 때, 그것은 (인해 그것을 생성 할 때 검사에) 루프 걸리면이다. 난 코드를 수정하여 동결의 수를 줄이려고 했어.하지만 여전히 경우에 1 ~ 2 %처럼 붙어옵니다.

-(void)positionMonsters:(int)nrM{ 

int nrH=[randomHero count]; 

int rdm; 
CGPoint randPt; 
BOOL is; 



while ([randomMonsters count]!=nrM) { 
    rdm=arc4random()%(nrH-1); 

    if (rdm!=nrH-1) { 
    randPt=random_on_line([[randomHero objectAtIndex:rdm]position], [[randomHero objectAtIndex:rdm+1]position ], CCRANDOM_0_1()); 
    }else{ 
    randPt=random_on_line([[randomHero objectAtIndex:rdm]position], [[randomHero objectAtIndex:0]position ], CCRANDOM_0_1()); 
    } 

    is=NO; 
    for (Monster *mob in randomMonsters) { 
     if (ccpFuzzyEqual(randPt, mob.position, 40)) { 
      is=YES; 
      break; 
     } 
    } 

    if (!is) { 
     Monster *mob=[[Monster alloc]initWithPosition:randPt]; 
     [randomMonsters addObject:mob]; 
    } 




} 

}

나 코드를 안내하자 :

그래서 난 영웅의 수를 얻을 수 (방법이 많은)만큼 RandomLevel에서

나는이 있습니다 내가 만들고 싶은만큼의 몬스터가 없다. 나는 2 연속 히어로 사이에 임의의 라인을 선택하고 그 라인에 포인트를 생성한다. 생성 된 포인트가 다른 포인트에 가까운 지 확인한다. 겹치기) .. 만약 그렇다면 그것은 무작위로 그것을 추가하지 않으면 루프를 다시 시작합니다. mobs

군중이 다른 군중과 겹치는 지 확인하면 나빠질 것입니다 ...하지만 heros는 항상 최소 200px 떨어져 있기 때문에 나는 몹을 손으로 만 만듭니다.

내가 원하는 것은/중지 ***** 라인을 취소하고 내가 말했듯이 ... ... 다시 임의의 수준을 얻으려고하는 것입니다
-(id)init{ 
//stuff stuff 
RandomLevel *rlv=[[RandomLevel alloc]initWithHeros:6 andMonsters:6]; ***** 

heros=rlv.randomHeros; 
mobs=rlv.randomMonsters; 
} 

이는 단지 1 일 : 내 GameScene에서

내가 이렇게 게임이 처리 이상 0.5 초 걸리는 경우이 같은

+0

루프가 고착되어 있는지 확인하는 방법을 궁금하게 생각한다면 코드를 잘못 구성했을 것입니다. 나는 그것이 많은 답변이 아니라는 것을 알고 있지만 진실이다. – Almo

+0

어디서 어떻게 붙잡 았는지는 알지만 처리 능력이 엄청나지 않으면 아무 것도 할 수 없다. – skytz

+0

나는이 코드가 코드에 철저히 논평하는 한 엣지 케이스가 있다고 생각한다. 큰 성능이있다. 절감 효과가 있으며, 단지 반창고 솔루션이 아닙니다. 반복 횟수를 확인하고 확인할 수 있으며 반복 횟수에 따라 반복 횟수가 달라질 수 있습니다. – AlexMA

답변

1

performSelector:withDelay을 사용하고 종료 전에 취소 할 수 있습니까?

+0

방금 ​​시도 ... 루프를 멈추고 게임이 모두 충돌 함 – skytz

+0

코드를 게시 할 수 있습니까? –

+0

ok ... 코드 – skytz

1

뭔가 루프에서 휴식 것이 무엇인가 .. 또는 매주 2 초 동안 "정지"경우의 경우 %는 그러한 큰 문제가되지 않을 것 때문에 . 물론 특정 경우에 맞게 수정해야합니다.

NSDate* myTime= [NSDate date]; 
while (true) 
{ 
    ... 

    if ([myTime timeIntervalSinceNow] < -0.5]) 
    { 
     break; 
    } 
} 
+3

숙련 된 소프트웨어 엔지니어가 이와 같은 것을 사용하는 경우 코드에 구조적 문제가 있음을 알려줍니다. 공학은 종종 실용을 필요로하는 전문 직업이기 때문에 그러한 해결책이 필요할 수 있습니다. 그러나 가능하면 피해야합니다. :) – Almo

관련 문제