2014-07-18 5 views
6

मैं अपने खिलाड़ी को कूदने की अनुमति देने की कोशिश कर रहा हूं। हालांकि मैं उसे मध्य हवा में कूदने नहीं दे सकता, इसलिए मुझे यह जांचने की ज़रूरत है कि क्या यह आवेग लगाने से पहले किसी अन्य नोड के शीर्ष पर खड़ा है या नहीं।जांचें कि क्या खिलाड़ी किसी अन्य नोड के शीर्ष पर है?

अन्य स्प्राइट-किट गेम सामान्य रूप से ऐसा कैसे करते हैं?


अभी मैं दो दृष्टिकोणों की कोशिश कर रहा हूं, पहला यह है। यह बहुत अच्छा है, हालांकि मुझे नहीं पता कि कैसे यह बताया जाए कि खिलाड़ी नोड को छू रहा है या नहीं, वास्तव में नीचे या खिलाड़ी के पक्ष में है।

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { 
    var allowJump = false 
    let bodies = player.physicsBody.allContactedBodies() 
    for body : AnyObject in bodies { 
     if let node = body.node { 
      allowJump = true // Player is touching another node but we don't know where (the bottom of the player or it's sides) 
     } 
    } 
} 

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

func didBeginContact(contact: SKPhysicsContact!){ 
    if(contact.bodyA.node.position.y < contact.contactPoint.y) { 
     println("BodyA is on top of another node") 
    } 

    if(contact.bodyB.node.position.y < contact.contactPoint.y) { 
     println("BodyB is on top of another node") 
    } 
} 

func didEndContact(contact: SKPhysicsContact!){ 
    if(contact.bodyA.node.position.y < contact.contactPoint.y) { 
     println("BodyA is on no longer on top of BodyB") 
    } 

    if(contact.bodyB.node.position.y < contact.contactPoint.y) { 
     println("BodyB is no longer on top of BodyA") 
    } 
} 

उत्तर

2
typedef NS_OPTIONS(uint32_t, CNPhysicsCategory) 
{ 
    CNPhysicsCategoryChick = 1, 
    CNPhysicsCategoryEdge = 2, 
    CNPhysicsCategoryStrawberry = 3, 
}; 

@interface MyScene() <SKPhysicsContactDelegate> 

@end 


@implementation MyScene 
{ 
    SKSpriteNode *strawberry; 
    SKSpriteNode *chick; 

} 

-(id)initWithSize:(CGSize)size {  
    if (self = [super initWithSize:size]) { 
     /* Setup your scene here */ 

     self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame]; 
     self.physicsBody.categoryBitMask = CNPhysicsCategoryEdge; 
     self.physicsWorld.contactDelegate = self; 
     self.physicsBody.restitution = 0.0; 

     chick = [SKSpriteNode spriteNodeWithImageNamed:@"chick"]; 
     [chick setScale:0.3]; 
     chick.position = CGPointMake(self.size.width/2, chick.size.height/2); 
     chick.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:chick.size]; 
     chick.physicsBody.categoryBitMask = CNPhysicsCategoryChick; 
     chick.physicsBody.collisionBitMask = CNPhysicsCategoryEdge; 
     chick.physicsBody.restitution = 0.0; 
     [self addChild:chick]; 


     strawberry = [SKSpriteNode spriteNodeWithImageNamed:@"strawberry"]; 
     strawberry.position = CGPointMake(chick.position.x, chick.position.y - chick.size.height/2 + strawberry.size.height/2); 

     //You should make this hidden 
     //strawberry.hidden = YES; 

     strawberry.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize: CGSizeMake(strawberry.size.width, strawberry.size.height)]; 
     strawberry.physicsBody.categoryBitMask = CNPhysicsCategoryStrawberry; 
     strawberry.physicsBody.collisionBitMask = kNilOptions; 
     strawberry.physicsBody.contactTestBitMask = CNPhysicsCategoryEdge; 
     strawberry.physicsBody.density = 0.001; 
     strawberry.physicsBody.restitution = 0.0; 
     [self addChild:strawberry]; 

     SKPhysicsJointFixed *point = [SKPhysicsJointFixed jointWithBodyA:strawberry.physicsBody bodyB:chick.physicsBody anchor:CGPointZero]; 
     [self.physicsWorld addJoint:point]; 
    } 
    return self; 
} 

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

    [chick.physicsBody applyImpulse:CGVectorMake(0, 60)]; 
} 

-(void)didBeginContact:(SKPhysicsContact *)contact 
{ 
    uint32_t collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask); 

    if (collision == (CNPhysicsCategoryEdge | CNPhysicsCategoryStrawberry)) { 
     NSLog(@"In Contact"); 
    } 
} 

-(void)didEndContact:(SKPhysicsContact *)contact 
{ 
    uint32_t collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask); 

    if (collision == (CNPhysicsCategoryEdge | CNPhysicsCategoryStrawberry)) { 
     NSLog(@"Contact Is Lost"); 
    } 
} 


@end 

enter image description here enter image description here

+0

समस्या यह है कि कोई आधार या कोई प्रकार का बॉक्स हो सकता है जहां खिलाड़ी खड़ा हो सकता है। – lisovaccaro

+0

मैं देखता हूं, इसलिए एक सामान्य समाधान के लिए आपको SKPhysicsContactDelegate का उपयोग करना चाहिए - (शून्य) didBeginContact: (SKPhysicsContact *) संपर्क विधि, वेब पर कई उदाहरण हैं, मुझे लगता है कि आप आसानी से अपनी समस्या का समाधान कर सकते हैं –

+0

मैंने उन्हें चेक किया, हालांकि वे संपर्क शुरू होने पर आग लगती है लेकिन मुझे नहीं पता कि कैसे पता चल सकता है कि नोड्स अद्यतन() विधि के अंदर छू रहे हैं या नहीं। मैं कुछ क्षणों में एक बक्षीस जोड़ूंगा! – lisovaccaro

2

यह अब मैं क्या कर रहा हूँ, लेकिन यह मुझे बताएं कि नोड यह छू है नीचे/छोड़ दिया/सही है नहीं करता है। मैं बस अपनी स्थिति को अपने नोड पर तुलना कर सकता हूं हालांकि कुछ नोड्स किनारे हैं जैसे लूपप्रोमपैथ या अलग-अलग आकार हैं।

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { 
    var allowJump = false 
    let bodies = player.physicsBody.allContactedBodies() 
    for body : AnyObject in bodies { 
     if let node = body.node { // Additionally check contactBitMask 
      allowJump = true 
     } 
    } 
} 
0

उपयोग राज्यों यह पूरा करने के।

चलें कहना उर खिलाड़ी दो राज्यों में हो सकता है - 1. touchingTheGround 2. inTheAir

  • खिलाड़ी ही अगर अपने राज्य touchingTheGround है पर ऊपर की ओर आवेग लागू करें और inTheAir करने के लिए राज्य को बदलने
  • जब खिलाड़ी जमीन को छूता है तो उसका राज्य स्पर्श करने के लिए ग्राउंड पर सेट करता है। इसके अलावा आप इस बात की जांच कर सकते हैं कि प्लेयर नोड के केंद्र से गुजरने वाली रेखा से बने कोण और संपर्क बिंदु बिंदु -90 डिग्री (या लगभग -90) + x अक्ष के साथ कोण बनाता है। (खिलाड़ी अपने पैरों पर उतरा)
  • यदि खिलाड़ी अपने पैरों पर भूमि नहीं है तो आप खिलाड़ी को किसी अन्य राज्य में भेज सकते हैं और उस राज्य के लिए अलग तर्क लिख सकते हैं।

राज्यों मैं NS_ENUM

+2

मुझे यकीन नहीं है कि यह काम करेगा। मुझे लगता है कि मुझे एक ऐसा फ़ंक्शन चाहिए जो वास्तव में जांचता है कि उपयोगकर्ता जमीन को छू रहा है, अगर वह इस तर्क के साथ एक किनारे से गिरता है तो खिलाड़ी – lisovaccaro

+0

हाय स्पैस को छू रहा होगा, मैं वास्तव में समाधान के करीब हूं। कृपया अद्यतन प्रश्न देखें। – lisovaccaro

0

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

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