2010-07-05 13 views
14

मैं क्लिप/फसल/मास्क कैसे क्लिप कर सकता हूं या कोकोस 2 डी में सीसीएसप्रेट के फ्रेम को सेट कर सकता हूं?कोकोस 2 डी आईफोन - स्प्राइट क्लिपिंग/मास्क/फ्रेम

कुछ के समान: , UIView के लिए फ्रेम की स्थापना कतरन subviews के साथ = सही

मेरे CCSprite मुख्य स्प्राइट कई बाल स्प्राइट यह करने के लिए जोड़ा है। मैं केवल मास्क उस मुख्य स्प्राइट स्प्राइट का हिस्सा चाहता हूं। क्या सीसीएसप्रिट के लिए मास्क क्लिप या उपयोग करने का कोई तरीका है?

मैं केवल उस दृश्य क्षेत्र को छोड़कर, पृष्ठभूमि और परत को काट सकता हूं, लेकिन क्या यह एकमात्र तरीका है ?! alt text http://dnamique.com/maskSprite.jpg

उत्तर

16

मैं GL_SCISSOR का उपयोग कर समाप्त हो गया:

यहाँ एक नमूना छवि का प्रदर्शन मैं क्या हासिल करने की कोशिश कर रहा हूँ है।

MainSprite में मैं impemented:

- (void) visit 
{ 
    if (!self.visible) { 
     return; 
    } 
    glEnable(GL_SCISSOR_TEST); 
    glScissor(x, y, width, height); 
    [super visit]; 
    glDisable(GL_SCISSOR_TEST); 
} 

इस क्लिप या निर्धारित क्षेत्र मुखौटा होगा।

एकमात्र मुश्किल बात यह है कि लैंडस्केप मोड में कोकोस 2 डी में स्क्रीन के निचले बाएं किनारे पर 0,0 है, जबकि ओपनजीएल में यह नीचे-दाएं कोने में है क्योंकि यह स्क्रीन के अभिविन्यास पर विचार नहीं करता है।

दूसरे शब्दों में, ओपनजीएल के लिए विचार करें कि आपके पास घुमावदार चित्र स्क्रीन है।

+0

एक अन्य चेतावनी - क्लिपिंग क्षेत्र स्प्राइट के सापेक्ष नहीं है, यह दुनिया आधारित है। तो, यह जगह पर रहेगा इससे कोई फर्क नहीं पड़ता कि आप स्प्राइट को कैसे बदलते हैं। यदि आपको मास्क को स्थानांतरित करने की आवश्यकता है तो आपको स्प्राइट के साथ इसे मैन्युअल रूप से स्थानांतरित/स्केल करना होगा। – jtalarico

+0

हाँ आप सही हैं। मुझे पहले एहसास नहीं हुआ था। अब मैंने एक्स और वाई को मेरे दृष्टिकोण की स्थिति के सापेक्ष बना दिया है ताकि वे हमेशा एक साथ आगे बढ़ सकें। – Bach

+0

@jtalarico, क्या आप जानते हैं कि ट्रांजिशन का उपयोग करते समय स्प्राइट ट्रांसफॉर्म कहां प्राप्त करें: 'CCDirector :: sharedDirector() -> pushScene (CCTransitionSlideInL :: create (10.0f, pscene)); धन्यवाद! – Zennichimaro

12

मैंने एक क्लिपिंग नोड क्लास लिखा जो वास्तव में करता है। आप क्लिपिंग नोड में अन्य नोड्स (स्प्राइट्स, लेबल्स इत्यादि) जोड़ सकते हैं और वे केवल क्लिपिंग नोड द्वारा निर्दिष्ट क्षेत्र में खींचे जाएंगे। यह डिवाइस में डिवाइस रोटेशन भी लेता है।

आंतरिक रूप से यह Bach के उत्तर में GL_SCISSOR_TEST का उपयोग करता है।

http://www.learn-cocos2d.com/2011/01/cocos2d-gem-clippingnode/

+0

+1 क्योंकि यह वास्तव में एक मणि है – jonsibley

+0

आप घुमावदार क्लिपिंग नोड से कैसे निपटते हैं? – docchang

3

मैं स्टीफन Itterheim के ClippingNode उपयोग करने की कोशिश, लेकिन मेरी जरूरतों के लिए पर्याप्त रूप से मजबूत काफी फैशन में काम करने के लिए प्राप्त करने में असमर्थ था।

मानो या नहीं, नीचे दिया गया कोड काफी अच्छी तरह से काम करता है और कोड पूर्ण होना चाहिए। यह डिवाइस अभिविन्यास परिवर्तन, एंकरपॉइंट, स्थिति, स्केल (स्केलएक्स, स्केलवाई) को संभालता है। Cocos2d वी 2 के लिए, तुम सिर्फ टिप्पणी बाहर glPushMatrix और glPopMatrix कॉल करना पड़ सकता है ..

का उपयोग करने के लिए बस की स्थिति और contentSize गुण सेट और बच्चे/बच्चों आप इस ClippingNode उदाहरण के लिए काटा जोड़ें। ContentSize प्रॉपर्टी का उपयोग क्लिपिंग क्षेत्र के आयामों को परिभाषित करने के लिए किया जाता है।

example of usage: 
ClippingNode *clipNode = [[ClippingNode alloc] init]; 
clipNode.anchorPoint = ccp(0.5f, 0); 
clipNode.position = ccp(100, 25); 
clipNode.contentSize = CGSizeMake(120, 120); 

// add clipNode to your node hierarchy. 
[parentNode addChild:clipNode]; 

// add one or more children to your clipNode: 
[clipNode addChild:child1]; 

// ClippingNode.h 
// CC0 - (public domain. Use in anyway you see fit.) 
// No warranty of any kind is expressed or implied. 
// 
// by UChin Kim. 
// 
// the caller can simply set the regular cocos2d 
// properties: position and contentSize to define the clipping region implicitly (i.e. the 
// position and contentSize of the ClippingNode is the clipping region to be used). 
// as an added bonus, position seems to work as expected (relative to parent node, instead of 
// requiring absolute positioning). 
// 
// also, anchorPoint and scale properties seem to work as expected as well.. 
// no special code is neeed to handle device orientation changes correctly.. 
// 
// To visually see exactly what is being clipped, set the following #define 
// #define SHOW_CLIPPED_REGION_IN_LIGHT_RED 1 
// 

#import "cocos2d.h" 

@interface ClippingNode : CCNode 

@end 

// 
// ClippingNode.m 
// 
#import "ClippingNode.h" 

@implementation ClippingNode 

-(void) visit 
{ 
CGPoint worldOrg = [self convertToWorldSpace:ccp(0, 0)]; 
CGPoint dest = [self convertToWorldSpace:ccp(self.contentSize.width, self.contentSize.height)]; 
CGPoint dims = ccpSub(dest, worldOrg); 

glPushMatrix(); 
glEnable(GL_SCISSOR_TEST); 

glScissor(worldOrg.x, worldOrg.y, dims.x, dims.y); 

#if SHOW_CLIPPED_REGION_IN_LIGHT_RED 
glColor4ub(64, 0, 0, 128); 
ccDrawSolidRect(ccp(0, 0), ccp(1024, 1024)); 
#endif 

[super visit]; 

glDisable(GL_SCISSOR_TEST); 
glPopMatrix(); 
} 

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