스탠포드 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];
}