2013-12-13 31 views
12

में टकराव का पता लगाने मैं स्प्राइट किट के साथ एक साधारण खेल बनाने की कोशिश कर रहा हूं। मूल विचार यह है कि एक ऐसा खिलाड़ी है जो ब्लॉक से बचने के लिए कूद सकता है। लेकिन मुझे एक समस्या है, मुझे नहीं पता कि यह कैसे बनाया जाए जब खिलाड़ी ब्लॉक को हिट करता है तो खिलाड़ी गायब हो जाता है और रक्त एनीमेशन शुरू होता है। सबसे पहले मुझे समझ में नहीं आता कि यह कोड क्या करता है जिसे मैंने सेब वेबसाइट पर पाया है।स्प्राइट किट

static const uint32_t blockCategory = 0x1 <<0; 
static const uint32_t playerCategory = 0x1 <<1; 

की तुलना में मैं didBeginContact समारोह बोल रहा हूँ और एक NSLog डाल उस में ("कॉल समारोह किया")। लेकिन मुझे अपने डीबगर में आउटपुट कभी नहीं मिला।

यहाँ मेरी _player और _block कोड है: - (SKSpriteNode *) चरित्र {

_player = [SKSpriteNode spriteNodeWithImageNamed:@"soldier_run1"]; 
_player.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:_player.size.width /2 -5]; 
_player.physicsBody.dynamic = YES; 
_player.physicsBody.usesPreciseCollisionDetection = YES; 
_player.physicsBody.friction = 0; 
_player.physicsBody.categoryBitMask = playerCategory; 
_player.physicsBody.collisionBitMask = blokCategory; 
_player.name = @"player"; 
SKAction *animAction = [SKAction animateWithTextures:playerTextures timePerFrame:0.1  resize:YES restore:YES]; 

मेरे _player कोड:

[_player runAction:[SKAction repeatActionForever:animAction]]; 

return _player; 
} 
-(SKSpriteNode *)block { 
_blok = [[SKSpriteNode alloc] initWithColor:[SKColor blackColor] size:CGSizeMake(15, 40)]; 

//physics 
_blok.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:_blok.size]; 
_blok.physicsBody.dynamic = NO; 
_blok.name = @"block"; 
_blok.physicsBody.categoryBitMask = blokCategory; 
_blok.physicsBody.collisionBitMask = playerCategory; 
SKAction *moveBlock = [SKAction sequence:@[ 
              [SKAction moveToX:-20 duration:2] ]]; 
[_blok runAction:moveBlock ]; 
return _blok; 
} 

इसके अलावा मैं सच में समझ में नहीं आता क्या categoryBitMask और collisionBitMask कर। मेरे पास यह काम करने के बाद मैं स्क्रीन से स्क्रीन गायब हो जाना चाहता हूं और रक्त एनीमेशन शुरू करना चाहता हूं, लेकिन मुझे नहीं पता कि यह कैसे होने दें। मुझे लगता है कि आपको कुछ ऐसा करना है: यदि (_player & & _block didcollide) { } लेकिन मुझे नहीं पता कि यह वास्तव में कैसे करें।

+0

यह उत्तर देखें http://stackoverflow.com/questions/22495285/sprite-kit-collision-detection – Jeff

उत्तर

18

श्रेणी बिटमैस्क उस श्रेणी को सेट करता है जो स्प्राइट से संबंधित है, जबकि टकराव बिटमैस्क उस श्रेणी को सेट करता है जिसके साथ स्प्राइट टकरा सकता है और पास-थ्रू नहीं कर सकता है।

टकराव का पता लगाने के लिए, आपको contactTestBitMask सेट करने की आवश्यकता है। यहां, आप उन sprites की श्रेणियां सेट करते हैं जिनके साथ आप संपर्क प्रतिनिधियों को संपर्क पर बुला सकते हैं।

जो आपने पहले से ही किया है वह सही है। यहाँ कुछ अतिरिक्त आपको बस इतना करना है:

_player.physicsBody.contactTestBitMask = blockCategory; 
_blok.physicsBody.contactTestBitMask = playerCategory; 

बाद में, संपर्क प्रतिनिधि को लागू इस प्रकार है: टक्कर पता लगाने को लागू करने पर एक अच्छा विवरण के लिए

-(void)didBeginContact:(SKPhysicsContact *)contact` 
{ 
NSLog(@"contact detected"); 

SKPhysicsBody *firstBody; 
SKPhysicsBody *secondBody; 

if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask) 
{ 
    firstBody = contact.bodyA; 
    secondBody = contact.bodyB; 
} 
else 
{ 
    firstBody = contact.bodyB; 
    secondBody = contact.bodyA; 
} 

//Your first body is the block, secondbody is the player. 
//Implement relevant code here. 

} 

, this ट्यूटोरियल को देखो।

4

टकराव संभाल थोड़ा गन्दा है। :) कई दृष्टिकोण हैं, लेकिन एक जगह जिसे आप शुरू करना चाहिए this ऐप्पल से काफी सरल उदाहरण है। रीडमे एक अच्छा परिचय प्रदान करता है, और फिर आप कोड के साथ चारों ओर पोकिंग शुरू कर सकते हैं।

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

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