2012-08-16 28 views
5

Tôi đã sử dụng hướng dẫn tuyệt vời này để kickoff một dự án nhỏ tôi đang làm việc trên vật lý liên quan đến:Áp dụng Box2D vật lý để UIView vs CALayer

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

Về cơ bản, nó tạo ra một thế giới và áp dụng vật lý của B2D cho bất kỳ chế độ xem nào bạn có. Rất đơn giản và nó hoạt động. Tuy nhiên, tôi đã cố gắng áp dụng cùng một logic bằng cách sử dụng CALayers, tức là, tôi lập trình tạo lớp, thêm chúng vào view.layer chính và cố gắng tạo hiệu ứng cho chúng.

Mẫu mã cho việc tạo các lớp:

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

Và vật lý ứng dụng trong 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; 

Chú ý rằng tôi phù hợp affine chuyển cuộc gọi đến lớp CALayer.

Tôi đã kiểm tra và kiểm tra kỹ các biến số và các con số có vẻ phù hợp. Những gì tôi nhận được là một thư bị trả lại lạ từ hoạt hình CALayer và một hoạt ảnh hoàn hảo từ UIView. Bất cứ ai có kinh nghiệm trong Box2D và UIKit để trả lời tại sao điều này có thể xảy ra?

+0

bạn có thể giải thích "nảy lạ" – erkanyildiz

+0

này: http://youtu.be/OpTXuqIgiPE - đen là CALayer, Green là UIView.The CALayer bị trả lại trước khi nhấn "mặt đất". Một lý do khiến tôi nghĩ rằng kích thước et al. là chính xác là do thực tế là các CALayer cuối cùng dừng lại nảy với đáy của khung chạm đất. – hcabral

Trả lời

5

Không giống như UIViews, CALayers có các hoạt ảnh ngầm được tích hợp sẵn. Mỗi lần bạn thay đổi giá trị của một thuộc tính có thể hoạt ảnh, một hoạt ảnh ngắn sẽ được giới thiệu. Bạn cần phải quấn mã của bạn trong CATransaction và vô hiệu hóa hành động để thoát khỏi hiệu ứng này:

[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, thực hiện điều đó! – hcabral

Các vấn đề liên quan