2012-08-16 19 views
5

He utilizado este excelente tutorial del inicio del partido un pequeño proyecto que estoy trabajando en la física que implican:La aplicación de la física Box2D a UIView vs CALayer

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

Básicamente, se crea un mundo y se aplica la física de B2D a las vistas que tengas. Muy simple y funciona. Sin embargo, traté de aplicar la misma lógica usando CALayers, es decir, programé capas, las agregué al view.layer principal e intenté animarlas.

Código de ejemplo para la creación de la capa:

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

Y la física aplicada en el 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; 

en cuenta que me he adaptado la transformación afín llamada a la clase CALayer.

He comprobado y verificado dos veces las variables, y los números parecen coincidir. Lo que obtengo es un rebote extraño de la animación CALayer y una animación perfecta de UIView. ¿Alguien con experiencia en Box2D y UIKit para responder por qué esto puede estar pasando?

+0

¿Puede explicar "rebote raro" – erkanyildiz

+0

Este: http://youtu.be/OpTXuqIgiPE - negro es CALayer, es verde UIView.The CALayer rebota antes de golpear el "suelo". Una razón me lleva a pensar que las dimensiones et al. son correctos se debe al hecho de que el CALayer finalmente deja de rebotar con la parte inferior del marco tocando el suelo. – hcabral

Respuesta

5

A diferencia de UIViews, CALayers tienen animaciones implícitas incorporadas. Cada vez que cambie el valor de una propiedad animable, se introducirá una breve animación. Usted tiene que envolver su código en CATransaction y desactivar acciones para deshacerse de este efecto:

[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í, eso lo hace! – hcabral

Cuestiones relacionadas