2012-08-31 3 views
2

저는 매 초마다 화면 상단에서 시작하는 x 개의 새로운 UIImage 객체를 만들고 싶습니다. 인스턴스화 된 후에는 화면 하단에 도달 할 때까지 자동으로 쓰러지기를 원합니다. 그 시점에서 더 이상 사용하지 않습니다.Xcode에서 무한 개수의 객체 생성하기

거의 빗방울처럼 - 매초마다 X 개의 숫자가 만들어지고 각기 다른 속도로 떨어집니다.

나는 이렇게하기 위해 내 프로그램을 어떻게 디자인 할 것인지 정말 혼란스러워합니다.

도움을 주시면 감사하겠습니다. 감사.

답변

1

WWDC 2011에서 the Core Animation video을 확인하십시오. 마지막에는 "Replicators"라는 단어가 약간 있습니다.

2

모든 이미지는 동일한 이미지 사본입니까, 아니면 제한된 이미지 집합 중 하나의 사본입니까? 그런 게임 같은 그래픽 집약적 인 앱을 위해 OpenGL ES 사용을 진지하게 고려할 것입니다.하지만 UIKit에 익숙한 사람들에게는 학습 곡선이 가파른 편입니다. 다행스럽게도 Cocos2d와 같은 제 3 자 오픈 소스 라이브러리가있어 UIKit만큼 쉽게 코딩 할 수 있습니다. 특히 귀하의 질문에 대해서는

, 나는 @ctrahey에서 언급 한 비디오를 시청하지 않은,하지만 난이 패턴을 생각할 수 있습니다 :

  1. 재사용 가능한 객체의 (유한) '풀'이있는 크기는 주어진 시간에 화면에 나타날 수있는 최대 인스턴스 수와 같습니다. 은 그래픽 성능이 무한하지 않기 때문에이 제한을 설정하려면이 필요합니다. 물체가 화면에서 떨어질 때마다 상태를 '재설정'하고 다시 사용합니다 (다시 위로부터). UITableView는 테이블 셀에서 이와 같은 작업을 수행합니다.

  2. 필요에 따라 인스턴스를 만들고 화면에서 벗어나면 해당 인스턴스를 파괴하십시오 (release-> dealloc).

인스턴스를 만들거나 삭제하는 데 드는 런타임 비용과 개체를 다시 설정하는 데 드는 비용/불편의 균형을 맞추어야합니다.

은 참고

+0

감사합니다. 내가 지금하고있는 일은 NSMutableArray에 모든 새로운 UIImage 객체를 넣은 다음 화면에서 사라진 객체를 어떻게 든 지우는 것입니다. 그런 식으로 NSMutableArray의 각 요소를 동시에 업데이트 할 수도 있습니다. – user1202422

+0

하나의 배열에서 모든 '맵 객체'(너무 쉽게 게임 용어 사용)를 쉽게 관리 할 수 ​​있습니다. '-makeObjectsPerformSelector :'가 도움이됩니다. –

+0

각 입자의 '높이'(각 프레임)를 확인하고 하단에 도달 한 입자를 삭제/재사용 할 수 있습니다. 각 프레임에 많은'alloc/init'과'dealloc' 대신에 재사용을 강력하게 추천합니다. 그러나 UIImage는 최근에 사용한 이미지로 새로운 인스턴스를 생성 할 때 텍스쳐 (이미지) 데이터를 캐쉬하기 때문에 그렇게해서는 안됩니다. –

2

1 단계 : 코드의 조각을 실행 매 초마다

timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(dispatchSomeRaindrops) userInfo:nil repeats:YES]; 

2 단계 : 화면을 아래로 보내, 일부 입자를 만들고 그들이 바닥에 도달하면 그들을 청소합니다.

- (void)dispatchSomeRaindrops 
{ 
    for (int i = 0; i < 5; i++) { 
     UIImageView *view = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"safari.png"]]; 

     CGFloat halfHeight = view.frame.size.height/2; 
     CGFloat x = arc4random() % (int)self.view.frame.size.width; 
     view.center = CGPointMake(x, -halfHeight); 

     [self.view addSubview:view]; 

     NSTimeInterval duration = 10 + arc4random() % 10; 
     [UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionCurveEaseIn animations:^{ 
      float endY = self.view.frame.size.height + halfHeight; 
      view.center = CGPointMake(x, endY); 
     } completion:^(BOOL finished) { 
      [view removeFromSuperview]; 
     }]; 
    } 
} 
관련 문제