मैं स्टीफन 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
एक अन्य चेतावनी - क्लिपिंग क्षेत्र स्प्राइट के सापेक्ष नहीं है, यह दुनिया आधारित है। तो, यह जगह पर रहेगा इससे कोई फर्क नहीं पड़ता कि आप स्प्राइट को कैसे बदलते हैं। यदि आपको मास्क को स्थानांतरित करने की आवश्यकता है तो आपको स्प्राइट के साथ इसे मैन्युअल रूप से स्थानांतरित/स्केल करना होगा। – jtalarico
हाँ आप सही हैं। मुझे पहले एहसास नहीं हुआ था। अब मैंने एक्स और वाई को मेरे दृष्टिकोण की स्थिति के सापेक्ष बना दिया है ताकि वे हमेशा एक साथ आगे बढ़ सकें। – Bach
@jtalarico, क्या आप जानते हैं कि ट्रांजिशन का उपयोग करते समय स्प्राइट ट्रांसफॉर्म कहां प्राप्त करें: 'CCDirector :: sharedDirector() -> pushScene (CCTransitionSlideInL :: create (10.0f, pscene)); धन्यवाद! – Zennichimaro