Animacja¶
Zacznijmy od dodania obiektu reprezentującego kulę i animatora. Dodaj odpowiednie deklaracje do pliku nagłówkowego.
@interface TANGViewController ()
@property (nonatomic, strong) UIDynamicAnimator *animator;
@property (nonatomic, strong) UIView *ball;
@end
Następnie przejdź do pliku implementacyjnego. Znajdź metodę viewDidLoad. Metoda ta jest wywoływana przy ładowaniu widoku do wyświetlacza. Użyj tej metody, żeby utworzyć instancje obiektów kuli i animatora, ustal ustawienia początkowe i zainicjuj animator.
- (void)viewDidLoad
{
[super viewDidLoad];
self.ball = [[UIView alloc] initWithFrame:CGRectMake(100.0, 100.0, 70.0, 70.0)];
self.ball.layer.cornerRadius = 35.0;
self.ball.layer.borderColor = [UIColor blackColor].CGColor;
self.ball.layer.borderWidth = 0.0;
self.ball.backgroundColor = [UIColor redColor];
[self.view addSubview:self.ball];
self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
}
Kolejnym krokiem będzie dodanie obiektu typu behavior. W tym celu utwórz nową metodę klasy kontrolera widoku. Dodaj odpowiednią deklarację w pliku nagłówkowym kontrolera widoku.
@interface TANGViewController : UIViewController
@property (nonatomic, strong) UIDynamicAnimator *animator;
@property (nonatomic, strong) UIView *ball;
-(void)applyGravity;
@end
Definicja metody applyGravity powinna się oczywiście znaleźć w pliku implementacyjnym kontrolera widoku.
-(void)applyGravity
{
UIGravityBehavior *gb = [[UIGravityBehavior alloc] initWithItems:@[self.ball]];
[self.animator addBehavior:gb];
}
Ponieważ chcemy zastosować UIGravityBehavior w momencie załadowania widoku, wywołanie metody applyGravity musimy umieścić w definicji metody viewDidLoad, oczywiście po utworzeniu obiektów kuli i animatora.
- (void)viewDidLoad
{
[super viewDidLoad];
self.ball = [[UIView alloc] initWithFrame:CGRectMake(100.0, 100.0, 70.0, 70.0)];
self.ball.layer.cornerRadius = 35.0;
self.ball.layer.borderColor = [UIColor blackColor].CGColor;
self.ball.layer.borderWidth = 0.0;
self.ball.backgroundColor = [UIColor redColor];
[self.view addSubview:self.ball];
self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
[self applyGravity];
}
Przetestuj aplikacje.
Ponieważ kula, pod wpływem wirtualnej grawitacji, znika z widzialnego obszaru widoku, dobrym pomysłem będzie wyprowadzenie informacji o współrzędnych kuli na przykład do standardowego wyjścia. W tym celu możemy oczywiście wykorzystać standardową funkcje NSLog.
-(void)applyGravity
{
UIGravityBehavior *gb = [[UIGravityBehavior alloc] initWithItems:@[self.ball]];
[self.animator addBehavior:gb];
gb.action = ^{ NSLog(@"%f", self.ball.center.y); };
}
Kolejnym krokiem będzie odbicie kuli od podłogi. Dodamy odpowiedni behavior w postaci obiektu klasy UICollisionBehavior.
-(void)applyGravity
{
UIGravityBehavior *gb = [[UIGravityBehavior alloc] initWithItems:@[self.ball]];
[self.animator addBehavior:gb];
gb.action = ^{ NSLog(@"%f", self.ball.center.y); };
UICollisionBehavior *cb = [[UICollisionBehavior alloc] initWithItems:@[self.ball]];
[cb addBoundaryWithIdentifier:@"tabbar"
fromPoint:self.tabBarController.tabBar.frame.origin
toPoint:CGPointMake(self.tabBarController.tabBar.frame.origin.x +
self.tabBarController.tabBar.frame.size.width,
self.tabBarController.tabBar.frame.origin.y)];
[self.animator addBehavior:cb]
}
Przetestuj przykład. Kula odbija się teraz nieelastycznie. Żeby zaimplementować odbicie elastyczne, dodaj UICollisionBehavior. Atrybut elasticity przyjmuje wartości z przedziału od 0 do 1, przy czym wartość 0 oznacza zderzenie całkowicie niesprężyste, a atrybut 1 - zderzenie całkowicie sprężyste.
-(void)applyGravity
{
UIGravityBehavior *gb = [[UIGravityBehavior alloc] initWithItems:@[self.ball]];
[self.animator addBehavior:gb];
gb.action = ^{ NSLog(@"%f", self.ball.center.y); };
UICollisionBehavior *cb = [[UICollisionBehavior alloc] initWithItems:@[self.ball]];
[cb addBoundaryWithIdentifier:@"tabbar"
fromPoint:self.tabBarController.tabBar.frame.origin
toPoint:CGPointMake(self.tabBarController.tabBar.frame.origin.
self.tabBarController.tabBar.frame.size.width,
self.tabBarController.tabBar.frame.origin.y)];
[self.animator addBehavior:cb];
UIDynamicItemBehavior *bb = [[UIDynamicItemBehavior alloc]
initWithItems:@[self.ball]];
bb.elasticity = 0.75;
[self.animator addBehavior:bb];
}
Ćwiczenie 1¶
Posługując się przykładami powyżej oraz dokumentacją biblioteki UIKitDynamics, napisz implementację popularnej gry Arkanoid, polegającej na zbijaniu cegiełek za pomocą kuli odbijanej za pomocą belki poruszanej za pomocą ekranu dotykowego urządzenia.