2013-11-26 11 views
10

मैं एक स्प्राइट किट परियोजना में एक गोलाकार मुखौटा बनाने की कोशिश कर रहा हूं। मैं बनाने (यह स्थिति स्क्रीन के केंद्र पर) इस तरह चक्र:स्प्राइट किट में एक मुखौटा के रूप में एक सर्कल (SKShapeNode) का उपयोग करना संभव है?

SKCropNode *cropNode = [[SKCropNode alloc] init]; 

SKShapeNode *circleMask = [[SKShapeNode alloc ]init]; 
CGMutablePathRef circle = CGPathCreateMutable(); 
CGPathAddArc(circle, NULL, CGRectGetMidX(self.frame), CGRectGetMidY(self.frame), 50, 0, M_PI*2, YES); 
circleMask.path = circle; 
circleMask.lineWidth = 0; 
circleMask.fillColor = [SKColor blueColor]; 
[email protected]"circleMask"; 

और कोड नीचे आगे, मैं cropNode के लिए मुखौटा के रूप में सेट:

[cropNode setMaskNode:circleMask]; 

... लेकिन एक सर्कल के अंदर दिखने वाली सामग्री के बजाय, मुखौटा एक वर्ग के रूप में दिखाई देता है।

क्या मास्क के रूप में SKShapeNode का उपयोग करना संभव है, या मुझे एक छवि का उपयोग करने की आवश्यकता है?

उत्तर

12

बहुत शपथ लेने के बाद, वेब को खराब करना, और एक्सकोड में प्रयोग, मेरे पास वास्तव में हैकी फिक्स है।

ध्यान रखें कि यह वास्तव में एक बुरा हैक है - लेकिन आप स्प्राइट किट के SKShapeNode के कार्यान्वयन पर दोष दे सकते हैं। एक पथ के लिए एक भरने का कारण बनता है जोड़ा जा रहा है निम्नलिखित:

  • अपने दृश्य के लिए
  • पथ unmaskable हो जाता है एक अतिरिक्त नोड कहते हैं - यह 'पर' मुखौटा
  • किसी भी गैर SKSpriteNode भाई unmaskable नोड बनाता है प्रतीत होता है (उदाहरण के लिए SKLabelNode एस)

मामलों की आदर्श स्थिति नहीं है।

SKCropNode *cropNode = [[SKCropNode alloc] init]; 

SKShapeNode *circleMask = [[SKShapeNode alloc ]init]; 
CGMutablePathRef circle = CGPathCreateMutable(); 
CGPathAddArc(circle, NULL, CGRectGetMidX(self.frame), CGRectGetMidY(self.frame), 50, 0, M_PI*2, YES); // replace 50 with HALF the desired radius of the circle 
circleMask.path = circle; 
circleMask.lineWidth = 100; // replace 100 with DOUBLE the desired radius of the circle 
circleMask.strokeColor = [SKColor whiteColor]; 
[email protected]"circleMask"; 

[cropNode setMaskNode:circleMask]; 

के रूप में टिप्पणी की, आप क्या के आधे के त्रिज्या निर्धारित करने की आवश्यकता:

Tony Chamblee's progress timer से प्रेरित होकर, 'ठीक' पूरी तरह भरने के साथ बांटना करने के लिए, और सिर्फ पथ के स्ट्रोक का उपयोग करें आमतौर पर है, और रेखा चौड़ाई त्रिज्या को दोगुनी करने के लिए।

उम्मीद है कि ऐप्पल भविष्य में इसे देखेगा; अभी के लिए, यह हैक मुझे मिला सबसे अच्छा समाधान है (एक छवि का उपयोग करने के अलावा, जो वास्तव में काम नहीं करता है अगर आपका मुखौटा गतिशील होना चाहिए)।

5

हां, मौजूदा स्प्राइट-किट प्राप्ति में भरने वाले रंगीन आकृति का उपयोग करना असंभव है। यह एक बग है, मुझे लगता है।

लेकिन!

आप हमेशा बनावट को आकार प्रस्तुत कर सकते हैं और इसे मास्क के रूप में उपयोग कर सकते हैं!

पूर्व के लिए, एज पहले बनाया गया SKShapeNode है।

सबसे पहले, यह (इस मामले में यह एक और नोड से साफ होगा) दृश्य में जोड़ने से पहले संरचना करने के लिए

SKTexture *Mask = [self.view textureFromNode:edge]; 
[self addChild:edge]; //if you need physics borders 

दूसरा प्रस्तुत करना,

SKCropNode *cropNode = [[SKCropNode alloc] init]; 
[cropNode setMaskNode:[SKSpriteNode spriteNodeWithTexture:Mask]]; 
[cropNode addChild: [SKSpriteNode spriteNodeWithTexture:rocksTiles size:CGSizeMake(w,h)]]; 
cropNode.position = CGPointMake(Mask.size.width/2,Mask.size.height/2); 
//note, anchorpoint of shape in 0,0, but rendered texture is in 0.5,0.5, so we need to dispose it 
[self addChild:cropNode]; 
+0

और अब कुछ बातें संभव हो रहे हैं। (आईओएस 8.1): int deviceOSVersion = [[[UIDevice currentDevice] systemVersion] floatValue]; यदि (डिवाइसOSवर्सन> = 8.0) पेड़। फ़िलटेक्चर = [एसकेटेक्चर बनावट विथ इमेज: [UIImage imageNamed: @ "treeS"]]; – djdance

0

को मुखौटा नोड के अल्फा की स्थापना।0 काम कर देता है:

circleMask.alpha = .0; 

संपादित करें: केवल मैक ओएस के लिए काम करने लगता है।

5

जब से मैं मुखौटा के रूप में एक SKShapeNode उपयोग नहीं कर सकते मैं इसे एक SKSpriteNode में बदलने का फैसला किया।

यहाँ यह मेरी स्विफ्ट कोड है:

let shape : SKShapeNode = ... // create your SKShapeNode 
var view : SKView = ... // you can get this from GameViewController 

let texture = view.textureFromNode(shape) 
let sprite = SKSpriteNode(texture: texture) 
sprite.position = ... 

cropNode.mask = sprite 

और यह करता है काम :)

+0

ऐसा लगता है कि आपको दृश्य में एक अप्रयुक्त आकार नोड जोड़ने की आवश्यकता होगी। मेरा सुझाव है कि आप 'CGIIath' या' UIBezierPath' से 'UIImage' बनाने में देखें। फिर आप छवि से एक बनावट उत्पन्न कर सकते हैं। – 0x141E

+0

हाय 0x141E, वास्तव में मैं दृश्य में *** आकार *** (SKShapeNode) नहीं जोड़ रहा हूं। सहेजा जाएगा केवल एक नोड *** स्प्राइट *** है। –

+2

यह स्वीकार किए गए एक से बेहतर समाधान है – 0x141E

1

इस मुद्दे मुझे विश्वास है कि थोड़ा कम रखा हैक्स में से किसी की तुलना में बुरा है करने के लिए एक से थोड़ा अजीब समाधान है इस मुद्दे के आसपास। बस एक SKNode में अपने SKShapeNode लपेटें। मैंने परीक्षण नहीं किया है कि इसका किस प्रकार का प्रदर्शन प्रभावित हो सकता है, लेकिन यह देखते हुए कि एसकेएनओड गैर-चित्रकारी है, मुझे उम्मीद है कि यह बहुत महत्वपूर्ण नहीं होगा।

अर्थात

let background = SKSpriteNode(imageNamed: "Background") 
let maskNode = SKShapeNode(path: MyPath) 
let wrapperNode = SKNode() 
let cropNode = SKCropNode() 

wrapperNode.addChild(maskNode) 
cropNode.maskNode = wrapperNode 
cropNode.addChild(background) 
संबंधित मुद्दे