2014-03-30 3 views
0

스탠포드 ios7 코스 8 장과 함께 강사가 단순한 테트리스 게임을 만들었습니다. 위에서 착색 한 블록이 떨어지고 행을 채워야합니다. 블록이 떨어질 수 있도록 중력 동작을 추가 한 후, 그는 충돌 행동 (아래의 속성을 유의) 그 일을하는 동안, 느리게, 그것을 인스턴스화하고 그가 블록과 충돌하게이블록이 화면 경계와 충돌합니다.

_collider.translatesReferenceBoundsIntoBoundary = YES; 

같은 경계를 설정 추가 서로의 위에 겹쳐 질 수 있도록 화면 하단 (넘어지지 말고). 그런 다음 충돌 동작을 animator 속성에 추가하고 마지막 단계로 drop 메서드에서 drop behavior (블록 인)를 충돌 동작에 추가합니다. 그가 달릴 때, 블록은 아래쪽을 치고 서로의 온탑을 쌓는다. 아래 코드를 사용하여 실행하면 블록이 화면 맨 아래로 계속 이동합니다 (시뮬레이터에서). 즉, 스태킹이 없습니다.

충돌 동작이 작동하지 않는 이유를 알 수 있습니까? 의 ViewController

@property (strong,nonatomic) UIDynamicAnimator *animator; 
@property (strong, nonatomic) UIGravityBehavior *gravity; 
@property (strong, nonatomic) UICollisionBehavior *collider; 

@end 

@implementation DropItViewController 

static const CGSize DROP_SIZE = { 40, 40 }; 
- (IBAction)tap:(UITapGestureRecognizer *)sender { 

    [self drop]; 
} 

- (UICollisionBehavior *)collider 
{ 
    if (!_collider){ 
     _collider = [[UICollisionBehavior alloc] init]; 
     _collider.translatesReferenceBoundsIntoBoundary = YES; 
     [self.animator addBehavior:_collider]; 
    } 
    return _collider; 
} 

- (UIDynamicAnimator *)animator 
{ 
    if (!_animator) { 
     _animator = [[UIDynamicAnimator alloc] init]; 
    } 
    return _animator; 
} 

-(UIGravityBehavior *)gravity 
{ 
    if (!_gravity) { 
     _gravity = [[UIGravityBehavior alloc] init]; 
     [self.animator addBehavior:_gravity]; 

    } 
    return _gravity; 
} 

당신이 당신의 UIDynamicAnimator를 인스턴스화 할 때, drop 방법

-(void)drop 
{ 
    CGRect frame; 
    frame.origin = CGPointZero; 
    frame.size = DROP_SIZE; 
    int x = (arc4random() % (int)self.gameView.bounds.size.width)/DROP_SIZE.width; 

    frame.origin.x = x * DROP_SIZE.width; 
    UIView *dropView = [[UIView alloc] initWithFrame:frame]; 
    dropView.backgroundColor = self.randomColor; 

    [self.gameView addSubview:dropView]; 

    [self.gravity addItem:dropView]; 
    [self.collider addItem:dropView]; 
} 

답변

3

에있는 입자 가속기에 dropView를 추가하는 대신 initinitWithReferenceView를 사용합니다. 그런 다음 translatesReferenceBoundsIntoBoundary을 사용하면 어떤 참조 범위가 사용되는지 알 수 있습니다.

1

나는 같은 코스에 있는데 같은 문제가 있다고 생각했습니다. 그러나 4.0 인치 시뮬레이터에서 실행 해보십시오. 귀하의 사각형은 아마 단지 오프 스크린 (3.5 인치 스크린 범위 밖)을 모으고 있습니다.