2012-08-16 6 views
5

Ich habe diese hervorragende Anleitung verwendet, um ein kleines Projekt Kickoff Ich arbeite an denen Physik:Anwendung Box2D Physik UIView vs. CALayer

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

Im Grunde ist es eine Welt schafft und wendet die Physik von B2D zu den Ansichten, die Sie haben. Sehr einfach und es funktioniert. Ich habe jedoch versucht, die gleiche Logik mit CALayers anzuwenden, d. H. Ich programmiere programmatisch Ebenen, füge sie der Hauptansicht hinzu und versuche, sie zu animieren.

Beispielcode für die Erstellung der Schicht:

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

Und die angewandte Physik im 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; 

Beachten Sie, dass ich die affine Aufruf der CALayer Klasse verwandeln angepasst.

Ich habe überprüft und überprüft die Variablen, und die Zahlen scheinen zu entsprechen. Was ich bekomme, ist ein komischer Bounce aus der CALayer-Animation und eine perfekte Animation aus der UIView. Jeder, der in Box2D und UIKit erfahren ist, warum das so ist?

+0

Können Sie „weird bounce“ erklären – erkanyildiz

+0

This: http://youtu.be/OpTXuqIgiPE - schwarz ist CALayer, Grün ist UIView. Der CALayer springt zurück, bevor er auf den "Boden" trifft. Ein Grund führt mich zu der Annahme, dass die Dimensionen et al. Der Grund dafür ist, dass der CALayer letztendlich aufhört zu springen, wenn der Boden des Rahmens den Boden berührt. – hcabral

Antwort

5

Im Gegensatz zu UIViews haben CALayers eingebaute implizite Animationen. Jedes Mal, wenn Sie einen Wert einer animierbaren Eigenschaft ändern, wird eine kurze Animation eingeführt. Sie haben Ihren Code in CATransaction und deaktivieren Aktionen wickeln diesen Effekt loszuwerden:

[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

Yup, das macht es! – hcabral