मैं बनाया है एक SKSpriteNode
कहा जाता है कहते हैं मानचित्र बढ़त रास्ता है कि मैं परिभाषित किया है (कुछ सरल बहुभुज आकार) है कि करते हैं।SpriteKit SKPhysicsBody किनारों
क्या मैं यह पता लगाने की कोशिश कर रहा हूँ कई अन्य किनारे रास्तों कि मानचित्र के इंटीरियर किनारों के रूप में कार्य करेगा शामिल करने का तरीका है। जैसे कि "नक्शा" पूरी तरह से वास्तव में छेद था। आंतरिक सीमा आकार के कुछ प्रकार है कि एक पूरे के रूप मानचित्र साथ कार्य कर सकता: (नीचे के रूप में दिखाया गया है) एक किनारे पथ
मैं समझता हूँ कि एक विधि है कि एक 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];
... लेकिन मैं बहुत ज्यादा एक क्लीनर समाधान है कि अतिरिक्त नोड्स की आवश्यकता नहीं है की तरह होगा .. विचार?
यह हो सकता है आप https://developer.apple.com/library/ios/documentation/SpriteKit/Reference/SKPhysicsBody_Ref/#//apple_ref/occ/clm/SKPhysicsBody/bodyWithTexture जो खोज रहे हैं: अल्फा थ्रेसहोल्ड: आकार: – 0x141E
मेरे संपादन में मैंने दिखाया है कि मैंने क्या किया है लेकिन (समझाया गया है) बिल्कुल नहीं। मुझे पता है कि मैं एक अलग 'नोड' बना सकता हूं जो बड़े बाहरी खोल के प्रदर्शन की नकल कर सकता है, लेकिन फिर से, मैं बस अधिक CPU तनाव से बचने की कोशिश कर रहा हूं। मुझे कुछ ऐसा लगता है जैसे एप्पल को स्प्राइटकिट के साथ प्रयोज्यता की सीमा दी गई है .. :( –
किसी भी संपर्क बिट मास्क को बदलने के बिना अपने टक्कर और संपर्क मास्क – dragoneye