2012-08-16 10 views
5

Ho usato questo ottimo tutorial al calcio di inizio di un piccolo progetto a cui sto lavorando sulla fisica che coinvolgono:Applicando Box2D fisica per UIView vs. CALayer

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

Fondamentalmente, si crea un mondo e vale la fisica di B2D a qualsiasi vista tu abbia. Molto semplice e funziona. Tuttavia, ho provato ad applicare la stessa logica usando CALayers, cioè creo a livello di codice dei livelli, li aggiungo al view.play principale e proviamo ad animarli.

Codice di esempio per la creazione dello strato:

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

E la fisica applicata nel 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; 

Si noti che ho adattato la trasformazione affine chiamata alla classe CALayer.

Ho controllato e ricontrollato le variabili, ei numeri sembrano corrispondere. Quello che ottengo è un rimbalzo strano dall'animazione CALayer e un'animazione perfetta da UIView. Qualcuno ha esperienza in Box2D e UIKit per rispondere perché questo può accadere?

+0

Può spiegare "rimbalzo strano" – erkanyildiz

+0

questo: http://youtu.be/OpTXuqIgiPE - nero è CALayer, Green è UIView.The CALayer rimbalza prima di colpire il "terreno". Una ragione mi porta a pensare che le dimensioni et al. sono corretti è dovuto al fatto che il CALAYer alla fine smette di rimbalzare con il fondo del telaio che tocca il suolo. – hcabral

risposta

5

A differenza di UIViews, CALayers hanno animazioni implicite incorporate. Ogni volta che cambi un valore di una proprietà animabile verrà introdotta una breve animazione. Si deve avvolgere il codice in CATransaction e disabilitare le azioni per sbarazzarsi di questo effetto:

[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

Sì, è così! – hcabral