2016-02-04 15 views
5

मैं बनाया है एक SKSpriteNode कहा जाता है कहते हैं मानचित्र बढ़त रास्ता है कि मैं परिभाषित किया है (कुछ सरल बहुभुज आकार) है कि करते हैं।SpriteKit SKPhysicsBody किनारों

क्या मैं यह पता लगाने की कोशिश कर रहा हूँ कई अन्य किनारे रास्तों कि मानचित्र के इंटीरियर किनारों के रूप में कार्य करेगा शामिल करने का तरीका है। जैसे कि "नक्शा" पूरी तरह से वास्तव में छेद था। आंतरिक सीमा आकार के कुछ प्रकार है कि एक पूरे के रूप मानचित्र साथ कार्य कर सकता: (नीचे के रूप में दिखाया गया है) एक किनारे पथ

enter image description here ©

मैं समझता हूँ कि एक विधि है कि एक SKPhysicsBody साथ बनाने के लिए अनुमति देता है कि वहाँ निकायों (कुछ NSArray), की तरह इस तरह के

Map.physicsBody = [SKPhysicsBody bodyWithBodies:bodiesArray]; 

वास्तव में इस विधि पैदा करता है कि मैं क्या छवि में दिखाया गया है? यह मानते हुए कि bodiesArray शामिल 3 SKSpriteNode के ऐसे प्रत्येक विधि का उपयोग करने से एक निर्धारित पथ के साथ:

+ (SKPhysicsBody *)bodyWithEdgeChainFromPath:(CGPathRef)path 

, जैसे

 SKSpriteNode *innerNode1 = [SKSpriteNode spriteNodeWithImageNamed:@"map"]; 

     CGMutablePathRef innerNode1Path = CGPathCreateMutable(); 

     CGPathMoveToPoint(mapPath, NULL, 1110, 1110); 
     CGPathAddLineToPoint(mapPath, NULL, <some x1>, <some y1>); 
     CGPathAddLineToPoint(mapPath, NULL, <some x2>, <some y2>); 
     CGPathAddLineToPoint(mapPath, NULL, <some x3>, <some y3>); 
     . 
     . 
     . 
     CGPathCloseSubpath(mapPath); 

     innerNode1.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:innerNode1Path]; 
     [bodiesArray addObject:innerNode1]; 

     // Repeat for other 2 nodes 

मैं समझता हूँ कि एक वैकल्पिक 3 बनाने के लिए किया जाएगा पथ बनाने के साथ इच्छित "छेद" के स्थान और आकार के साथ अलग नोड्स, लेकिन मैं आवश्यकता से अधिक नोड्स बनाने से बचने के लिए टाई कर रहा हूं। अगर कोई यह पुष्टि कर सकता है कि मैं जो करने की कोशिश कर रहा हूं वह सही है, या शायद एक विकल्प सुझाता है जिसे मैं अनजान हूं।

नोट: अगर मैं क्या कर रहा हूँ सही है, लेकिन मैं कुछ याद आ रही है, मैं इसे सराहना करते हैं अगर किसी ने मुझे क्या मैं के साथ एक वर्ग की भी एक साधारण उदाहरण करने के लिए (कोशिश कर रहा हूँ करने के लिए सही रास्ता दिखा सकते हैं एक आंतरिक छोटा वर्ग बड़ा होगा)। धन्यवाद!

संपादित करें 1: नीचे कोड स्निपेट है कि मैं "आंतरिक सीमाओं" पैदा करने की कोशिश के रूप में उपयोग कर रहा हूँ है। यहां यह मुद्दा यह है कि बाहरी और आंतरिक दोनों को खींचा और दिखाया गया है, जब मैं मानचित्र bodyWithBodies पर आंतरिक आय जोड़ता हूं, तो यह टकराव का पता लगाने का पूरा नियंत्रण लेता है, बाहरी संदर्भ शेल से सभी संपर्क नियंत्रण को हटा देता है। जब मैं bodyWithBodies यह दोनों rects दिखा साथ सामान्य करने के लिए वापस चला जाता है निकालने के लिए, बाहरी, टक्कर पता लगाने (मुझे के माध्यम से पारित करने के लिए अनुमति नहीं है) है, जबकि आंतरिक एक कुछ भी नहीं है ... इतने करीब

// 1 Create large outer shell Map 
CGRect mapWithRect = CGRectMake(map.frame.origin.x + offsetX, map.frame.origin.y + offsetY, map.frame.size.width * shrinkage, map.frame.size.height * shrinkage); 

self.physicsWorld.gravity = CGVectorMake(0.0, 0.0); 
self.physicsWorld.contactDelegate = self; 

// 2 Create smaller inner boundary 
CGRect innerRect = CGRectMake(100, 100, 300, 300); 
SKPhysicsBody *body = [SKPhysicsBody bodyWithEdgeLoopFromRect:innerRect]; 
body.categoryBitMask = wallCategory; 
NSArray *bodyArray = [NSArray arrayWithObject:body]; 

// 3 Add bodies to main Map body 
myWorld.physicsBody = [SKPhysicsBody bodyWithBodies:bodyArray]; 
myWorld.physicsBody.categoryBitMask = wallCategory; 


if ([[levelDict objectForKey:@"DebugBorder"] boolValue] == YES) { 
    // This will draw the boundaries for visual reference during testing  
    [self debugPath:mapWithRect]; 
    [self debugPath:innerRect]; 
} 

संपादित करें 2 यह दृष्टिकोण केवल बाहरी रेक्ट रूप में एक ही गुण के साथ एक नया नोड जोड़ने works..by:

SKPhysicsBody *innerRectBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:innerRect]; 
innerRectBody.collisionBitMask = playerCategory; 
innerRectBody.categoryBitMask = wallCategory; 
SKNode *innerBoundary = [SKNode node]; 
innerBoundary.physicsBody = innerRectBody; 
[myWorld addChild: innerBoundary]; 

... लेकिन मैं बहुत ज्यादा एक क्लीनर समाधान है कि अतिरिक्त नोड्स की आवश्यकता नहीं है की तरह होगा .. विचार?

+0

यह हो सकता है आप https://developer.apple.com/library/ios/documentation/SpriteKit/Reference/SKPhysicsBody_Ref/#//apple_ref/occ/clm/SKPhysicsBody/bodyWithTexture जो खोज रहे हैं: अल्फा थ्रेसहोल्ड: आकार: – 0x141E

+0

मेरे संपादन में मैंने दिखाया है कि मैंने क्या किया है लेकिन (समझाया गया है) बिल्कुल नहीं। मुझे पता है कि मैं एक अलग 'नोड' बना सकता हूं जो बड़े बाहरी खोल के प्रदर्शन की नकल कर सकता है, लेकिन फिर से, मैं बस अधिक CPU तनाव से बचने की कोशिश कर रहा हूं। मुझे कुछ ऐसा लगता है जैसे एप्पल को स्प्राइटकिट के साथ प्रयोज्यता की सीमा दी गई है .. :( –

+0

किसी भी संपर्क बिट मास्क को बदलने के बिना अपने टक्कर और संपर्क मास्क – dragoneye

उत्तर

1

तुम गलत यहाँ मैं एक उदाहरण है जहां मैं दो भौतिकी निकायों

// gcd

का उपयोग कर
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
     [self addBodyA]; 
    }); 

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
     [self addBodyB]; 
    }); 
-(void)addBodyB 
{ 
    SKSpriteNode *node=[SKSpriteNode spriteNodeWithColor:[SKColor redColor] size:CGSizeMake(20, 20)]; 
    node.physicsBody=[SKPhysicsBody bodyWithRectangleOfSize:node.frame.size]; 
    node.position=CGPointMake(550, 420); 
    node.physicsBody.restitution=1; 
    [self addChild:node]; 

} 
-(void)addBodyA 
{ 
    SKSpriteNode *node=[SKSpriteNode spriteNodeWithColor:[SKColor redColor] size:CGSizeMake(20, 20)]; 
    node.physicsBody=[SKPhysicsBody bodyWithRectangleOfSize:node.frame.size]; 
    node.position=CGPointMake(400, 420); 
    node.physicsBody.restitution=1; 
    [self addChild:node]; 

} 
-(void)addEdgesBodies 
{ 
    SKAction *r=[SKAction rotateByAngle:1.0/60 duration:1.0/60]; 

    SKSpriteNode *rect=[SKSpriteNode spriteNodeWithColor:[SKColor clearColor] size:CGSizeMake(300,300)]; 
    rect.physicsBody=[SKPhysicsBody bodyWithEdgeLoopFromRect:rect.frame]; 
    rect.position=CGPointMake(500, 400); 
    [self addChild:rect]; 


    // 
    SKSpriteNode *rect1=[SKSpriteNode spriteNodeWithColor:[SKColor clearColor] size:CGSizeMake(100,100)]; 
    rect1.physicsBody=[SKPhysicsBody bodyWithEdgeLoopFromRect:rect1.frame]; 
    rect1.position=CGPointMake(550, 450); 
    [self addChild:rect1]; 


    [rect1 runAction:[SKAction repeatActionForever:r]]; 

} 
[self addEdgesBodies]; 

बढ़त निकायों याद कुछ समय के बाद शव को जोड़ने की बात आती है के साथ दो किनारे रेक्ट निकायों बनाया के साथ आते हैं कुछ नहीं कर रहे कम सीपीयू ओवरहेड के साथ तो प्रदर्शन के बारे में चिंता न करें जब तक कि आपके पॉलीगॉन में इतने सारे किनारों न हों।

+0

सहायता के लिए धन्यवाद - मैं इसकी सराहना करता हूं। इसलिए यह दृष्टिकोण वास्तव में आंतरिक इंटरैक्टिव * सीमा की स्थिति (जैसा कि मैंने दिखाया चित्र) के रूप में प्राप्त करेगा? यह सिर्फ इस परिस्थिति को दृष्टि से बनाते हैं –

+0

मैंने एक छोटे से आयत के साथ एक बड़ा आयताकार बनाया है, लेकिन अब ऐसा लगता है कि आंतरिक आयता सीमा की स्थिति लेने के लिए एकमात्र क्षेत्र है, जबकि मैं अब बाहरी आयत से गुजर सकता हूं। यह उपयोग करके किया गया था bodyWithBodies (मेरा कोड मेरे उत्तर में एक संपादन में ऊपर है) –

0

भौतिक विज्ञान निकाय में इसका उपयोग करने के लिए पथ बनाने के लिए आपका कोड ऐसा लगता है कि यह काम करेगा। साथ ही शरीर से आपके भौतिकी शरीर। दुर्भाग्य से मुझे नहीं पता कि SKPhysicsBody वास्तव में छेद का समर्थन कर सकता है क्योंकि आप शरीर के आदर्शों को फ़्लिप नहीं कर सकते हैं। जिस तरह से मैंने सेब दस्तावेज पढ़ा है वह यह है कि यह दो सर्कल आकार लेने जैसी चीजों को करने और उन्हें एक शरीर में बनाने के लिए है, बल्कि उसके जैसे जटिल आकार को बनाना। समस्या यह है कि आपके बड़े आकार के अंदर एक छेद होने का मतलब उस क्षेत्र में टकराव को अनदेखा करना होगा।

यहाँ कुछ विकल्प विकल्प हैं

एक विकल्प आप एकाधिक आकृतियों से अपने चरणों का निर्माण कर सकता है। उदाहरण के लिए यदि आप अपना नक्शा दो टुकड़ों में विभाजित करते हैं (प्रत्येक आकृति के माध्यम से चलने वाली रेखा के साथ) और उन लोगों के लिए भौतिकी निकायों को बनाते हैं। फिर उन्हें ओवरलैप करें और उन्हें एक शरीर में बना दें, फिर यह काम कर सकता है। मैंने इसे चित्रित किया है (इसकी भयानक गुणवत्ता को क्षमा करें, आपको अभी भी यह समझने में सक्षम होना चाहिए कि यह क्या कर रहा है (उम्मीद है))। enter image description here

एक अन्य विकल्प बनावट के साथ इसे बनाने के लिए हो सकता है, यह एक सा preformance चोट पहुंचा सकते हैं लेकिन यह शायद अच्छी तरह से काम करेगा अगर आप इसे तो प्रबंधन कर सकते हैं।

Map.physicsBody = SKPhysicsBody(texture: Map.texture, size: Map.size) 
+0

दुर्भाग्य से मुझे पूर्ण आवश्यकता में है मुख्य सीमा के भीतर स्वतंत्र निकायों के। मैंने इस पर विचार किया हालांकि यह एक काम होगा यदि मैं जो कुछ चाहता हूं उसे हासिल करने का एक साफ तरीका नहीं समझ सकता :) –

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