2012-08-16 8 views
5

Używałem ten doskonały poradnik do kickoff mały projekt pracuję nad fizyki z udziałem:Zastosowanie fizyki Box2D do UIView vs CALayer

http://www.cocoanetics.com/2010/05/physics-101-uikit-app-with-box2d-for-gravity/

Zasadniczo, tworzy świat i stosuje fizyki B2D do dowolnych widoków. Bardzo proste i działa. Jednak próbowałem zastosować tę samą logikę przy użyciu CALayers, tj. Programowo utworzyć warstwy, dodać je do głównego view.layer i spróbować je ożywić.

Przykładowy kod do tworzenia warstwy:

CALayer *layer = [CALayer layer]; 
layer.backgroundColor = [UIColor blackColor].CGColor; 
layer.frame = CGRectMake(50, 100, 30, 30); 
layer.name = @"square"; 
[self.view.layer addSublayer:layer]; 

A fizyka stosowana w ticker:

CALayer *oneLayer = (CALayer *)b->GetUserData(); 
// y Position subtracted because of flipped coordinate system 
CGPoint newCenter = CGPointMake(b->GetPosition().x * PTM_RATIO, self.view.bounds.size.height - b->GetPosition().y * PTM_RATIO); 
oneLayer.position = newCenter; 
CGAffineTransform transform = CGAffineTransformMakeRotation(- b->GetAngle()); 
oneLayer.affineTransform = transform; 

Zauważ, że ja dostosowany affine przekształcić wezwanie do klasy CALayer.

Sprawdziłem i dwukrotnie sprawdziłem zmienne, a liczby wydają się pasować. To, co dostaję, to dziwne odbicie od animacji CALayer i idealna animacja z UIView. Czy ktoś ma doświadczenie w Box2D i UIKit, aby odpowiedzieć, dlaczego tak się dzieje?

+0

można wyjaśnić „dziwne bounce” – erkanyildiz

+0

to: http://youtu.be/OpTXuqIgiPE - czarne jest CALayer, Zieleń to UIView.The CALayer odbija się przed uderzeniem w "ziemię". Jeden powód skłania mnie do myślenia, że ​​wymiary i in. są poprawne z uwagi na to, że CALayer ostatecznie przestaje podskakiwać, gdy dno kadru dotyka ziemi. – hcabral

Odpowiedz

5

W przeciwieństwie do UIViews, CALayers mają wbudowane animacje niejawne. Za każdym razem, gdy zmienisz wartość animowalnej właściwości, zostanie wprowadzona krótka animacja. Trzeba owinąć kod w CATransaction i wyłączanie działania, aby pozbyć się tego efektu:

[CATransaction begin]; 
[CATransaction setDisableActions:YES]; // implicit animations get disabled 

CALayer *oneLayer = (CALayer *)b->GetUserData(); 
// y Position subtracted because of flipped coordinate system 
CGPoint newCenter = CGPointMake(b->GetPosition().x * PTM_RATIO, self.view.bounds.size.height - b->GetPosition().y * PTM_RATIO); 
oneLayer.position = newCenter; 
CGAffineTransform transform = CGAffineTransformMakeRotation(- b->GetAngle()); 
oneLayer.affineTransform = transform; 

[CATransaction commit]; 
+0

Tak, to prawda! – hcabral