2013-10-13 11 views
9

मैं स्प्राइट किट के साथ पिन जोड़ों का परीक्षण कर रहा हूं, और मुझे कुछ असामान्य घटना मिल रही है।स्प्राइट किट पिन जोड़ों में एक गलत एंकर होता है

मेरा वांछित सेटअप यह है: एक चौड़ा, फ्लैट बॉक्स, और दो मंडल; मंडल SKPhysicsPinJoints के माध्यम से बॉक्स में जुड़े हुए हैं, इसलिए वे पहियों के रूप में कार्य कर सकते हैं।

मेरा कोड यहां है। मैं इसे के रूप में संभव के रूप में संक्षिप्त बनाने के लिए कोशिश की है:

- (SKNode*) createWheelWithRadius:(float)wheelRadius { 
    CGRect wheelRect = CGRectMake(-wheelRadius, -wheelRadius, wheelRadius*2, wheelRadius*2); 

    SKShapeNode* wheelNode = [[SKShapeNode alloc] init]; 
    wheelNode.path = [UIBezierPath bezierPathWithOvalInRect:wheelRect].CGPath; 

    wheelNode.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:wheelRadius]; 

    return wheelNode; 
} 


- (void) createCar { 

    // Create the car 
    SKSpriteNode* carNode = [SKSpriteNode spriteNodeWithColor:[SKColor yellowColor] size:CGSizeMake(150, 50)]; 
    carNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:carNode.size]; 
    carNode.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)); 
    [self addChild:carNode]; 

    // Create the left wheel 
    SKNode* leftWheelNode = [self createWheelWithRadius:30]; 
    leftWheelNode.position = CGPointMake(carNode.position.x-80, carNode.position.y); 
    [self addChild:leftWheelNode]; 

    // Create the right wheel 
    SKNode* rightWheelNode = [self createWheelWithRadius:30]; 
    rightWheelNode.position = CGPointMake(carNode.position.x+80, carNode.position.y); 
    [self addChild:rightWheelNode]; 

    // Attach the wheels to the body 
    CGPoint leftWheelPosition = leftWheelNode.position; 
    CGPoint rightWheelPosition = rightWheelNode.position; 

    SKPhysicsJointPin* leftPinJoint = [SKPhysicsJointPin jointWithBodyA:carNode.physicsBody bodyB:leftWheelNode.physicsBody anchor:leftWheelPosition]; 
    SKPhysicsJointPin* rightPinJoint = [SKPhysicsJointPin jointWithBodyA:carNode.physicsBody bodyB:rightWheelNode.physicsBody anchor:rightWheelPosition]; 

    [self.physicsWorld addJoint:leftPinJoint]; 
    [self.physicsWorld addJoint:rightPinJoint]; 
} 

क्या मैं उम्मीद कर रहा हूँ कि पिन जोड़ों उनके केंद्र बिंदुओं पर लंगर डाले रहे हैं; हालांकि, जब मैं इसका परीक्षण करता हूं, जोड़ों के लिए एंकर बहुत दूर दिखाई देते हैं।

क्या मुझे कुछ वास्तव में स्पष्ट याद आ रही है?

उत्तर

10

मैं भी इस मुद्दे था और कारण स्प्राइट स्थिति सेट करने से पहले भौतिकी शरीर स्थापित कर रही है।

carNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:carNode.size]; 
carNode.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)); 

बदलें

carNode.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)); 
carNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:carNode.size]; 

के लिए ऊपर यह काम करना चाहिए। धन्यवाद Smick।

SpriteKit: How to create Basic Physics Joints

+0

आपके टीवीसी में अच्छा छोटा उदाहरण, आप नंबरऑफसेक्शन इनटेबल व्यू पर टिप्पणी कर सकते हैं, और नंबरऑफ्रोइन्स इनसेक्शन के लिए, बस [_dataSourceArray count] का उपयोग करें। यह एक अच्छा उदाहरण है, आपको [head.physicsBody applyTorque: 0.2] जोड़ना चाहिए; वास्तव में निश्चित संयुक्त में अपना अंतर दिखाने के लिए पिन में शामिल हों। अच्छा काम - साझा करने के लिए धन्यवाद। – DogCoffee

+0

धन्यवाद धन्यवाद .. मैंने उदाहरण अपडेट किया। लेकिन, टीवीसी को इस तरह से कोडित किया गया है, क्योंकि इसमें दो वर्ग हैं। मैं आपकी कार उदाहरण को संयुक्त प्रकार के रूप में नहीं जोड़ सका। :) उस उदाहरण को एक अलग खंड में रखा गया है। – Bavan

+0

मैं अब उदाहरण में कार नहीं देख सकता, अभी भी जोड़ों की सूची है। मैं अपने सभी टेस्ट कोड को एक टीवीसी में डाल दूंगा - कूल विचार! – DogCoffee

5

इस कोड को आजमाएं, मैंने तुम्हारा उपयोग किया और अजीब मुद्दों को मिला, इसलिए खरोंच से शुरू हुआ।

- (SKShapeNode*) makeWheel 
{ 
    SKShapeNode *wheel = [[SKShapeNode alloc] init]; 
    CGMutablePathRef myPath = CGPathCreateMutable(); 
    CGPathAddArc(myPath, NULL, 0,0, 16, 0, M_PI*2, YES); 
    wheel.path = myPath; 
    return wheel; 
} 


- (void) createCar 
{ 

    self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:CGRectMake(0, 0, self.size.width, self.size.height)]; 

    // 1. car body 
    SKSpriteNode *carBody = [SKSpriteNode spriteNodeWithColor:[UIColor whiteColor] size:CGSizeMake(120, 8)]; 
    carBody.position = CGPointMake(200, 200); 
    carBody.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:carBody.size]; 
    [self addChild:carBody]; 

    // 2. wheels 
    SKShapeNode *leftWheel = [self makeWheel]; 
    leftWheel.position = CGPointMake(carBody.position.x - carBody.size.width/2, carBody.position.y); 
    leftWheel.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:16]; 
    [self addChild:leftWheel]; 

    SKShapeNode *rightWheel = [self makeWheel]; 
    rightWheel.position = CGPointMake(carBody.position.x + carBody.size.width/2, carBody.position.y); 
    rightWheel.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:16]; 
    [self addChild:rightWheel]; 

    // 3. Join wheels to car 
    [self.physicsWorld addJoint:[SKPhysicsJointPin jointWithBodyA:carBody.physicsBody bodyB:leftWheel.physicsBody anchor:leftWheel.position]]; 
    [self.physicsWorld addJoint:[SKPhysicsJointPin jointWithBodyA:carBody.physicsBody bodyB:rightWheel.physicsBody anchor:rightWheel.position]]; 

    // 4. drive car 
    [carBody.physicsBody applyForce:CGVectorMake(10, 0)]; 
} 
+0

बहुत बहुत धन्यवाद! मैंने बावन के उत्तर को सही के रूप में चिह्नित किया, क्योंकि भविष्य के पाठकों के लिए यह अधिक संक्षिप्त और आसान है, लेकिन आपने पहले सही समाधान प्रदान किया था। –

+0

@ डोगकोफी: मैंने स्प्राइट नोड्स के लिए संयुक्त कोड का उपयोग किया है। लेकिन यह मेरे spritenode की स्थिति बदलता है। क्या आप मेरी मदद कर सकते हैं ? – Nirav

+0

@ निर्वाण का सुझाव है कि आप एक नया प्रश्न पोस्ट करें। मैंने थोड़ी देर के लिए स्प्राइट किट का उपयोग नहीं किया है। – DogCoffee

संबंधित मुद्दे