2012-08-16 37 views
5
UIView करने के लिए Box2D भौतिकी लागू करने

मैं इस उत्कृष्ट ट्यूटोरियल का उपयोग किया है एक छोटी परियोजना मैं शामिल भौतिकी पर काम कर रहा हूँ kickoff करने के लिए:बनाम CALayer

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

असल में, यह एक दुनिया बनाता है और भौतिक विज्ञान लागू होता है आपके पास जो भी विचार है, बी 2 डी का। बहुत आसान और यह काम करता है। हालांकि, मैंने CALayers का उपयोग कर एक ही तर्क को लागू करने का प्रयास किया, यानी, मैं प्रोग्रामेटिक रूप से परतें बनाते हैं, उन्हें मुख्य दृश्य में जोड़ें। प्लेयर और उन्हें एनिमेट करने का प्रयास करें। परत बनाने के लिए

नमूना कोड:

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

और टिकर में लागू भौतिकी:

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; 

सूचना है कि मैं अनुकूलित affine CALayer वर्ग के लिए कॉल को बदलने।

मैंने चर की जांच की है और दोबारा जांच की है, और संख्याएं मेल खाने लगती हैं। मुझे जो मिलता है वह कैलियर एनीमेशन से एक अजीब उछाल है, और UIView से एक परिपूर्ण एनीमेशन है। बॉक्स 2 डी और यूआईकिट में अनुभव करने वाले किसी को यह जवाब देने के लिए क्यों किया जा रहा है?

+0

आप व्याख्या कर सकते हैं "अजीब उछाल" – erkanyildiz

+0

यह: आप CATransaction में अपने कोड लपेट और इस आशय से छुटकारा पाने के कार्यों को निष्क्रिय करने के लिए है UIView। CALayer "जमीन" मारने से पहले उछाल। एक कारण मुझे यह सोचने के लिए प्रेरित करता है कि आयाम et al। सही हैं इस तथ्य के कारण कि कैलियर अंततः जमीन को छूने वाले फ्रेम के नीचे उछाल बंद कर देता है। – hcabral

उत्तर

5

UIViews के विपरीत, CALayers अंतर्निहित अंतर्निहित एनिमेशन हैं। हर बार जब आप एक एनिमेटेबल संपत्ति का मूल्य बदलते हैं तो एक छोटी एनीमेशन पेश की जाएगी। काला CALayer है, ग्रीन है - http://youtu.be/OpTXuqIgiPE:

[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

यूप, यह करता है! – hcabral