2015-01-02 14 views
7

हाय है, मैं इस बग को स्प्राइटकिट के भौतिकी आकार के साथ उल्टा दिखाई देने की कोशिश कर रहा हूं।स्प्राइटकिट एसकेफिजिक्स बॉडी बॉडीविथटेक्चर

[SKPhysicsBody bodyWithTexture:monsterTexture size:monsterTexture.size] 

पहली बार राक्षस प्रकट होता है कि फ़ैसिक्स बॉडी ओरिएंटेशन सही है। लेकिन दूसरी बार और उसके बाद राक्षस प्रकट होता है कि यह भौतिकी शरीर वाई अक्ष के साथ उलटा हुआ है। चित्र देखें जहां skView.showsPhysics = true; तो भौतिकी आकार प्रदर्शित होते हैं। तथ्य यह है कि यह पहली बार सही ढंग से काम करता है मुझे लगता है कि शायद कुछ संपत्ति मुझे पता नहीं है कि संशोधित किया जा रहा है या कुछ।

मैंने बूट के किसी न किसी आकार में 2 भौतिकी ब्लॉक को एक साथ रखने का विचार किया लेकिन यह आदर्श नहीं है क्योंकि कुछ अन्य जटिल आकार हैं जिन्हें मैं शरीर का उपयोग करना चाहता हूं, उस पर एक ही बग का अनुभव कर रहे हैं।

मैंने bodyWithTexture:monsterTexture, bodyWithTexture:monster.texture, राक्षस ऑब्जेक्ट के बनावट के बजाय मूल SKTexture ऑब्जेक्ट का भी प्रयास किया है।

physics body upside down

यहाँ मेरी ऐड राक्षस कोड है। अगर आपको और चाहिए तो मुझे बताएं।

- (Monster *)monster:(NSDictionary *)settings 
{ 
    NSDictionary * monsterDefaults = [self monsterDefaults]; 
    NSDictionary * monsterConfig = [self monsterConfig:settings[TYPE]]; 
    SKTexture * monsterTexture  = monsterConfig[TEXTURE] ? monsterConfig[TEXTURE] : monsterDefaults[TEXTURE]; 
    Monster * monster    = [Monster spriteNodeWithTexture:monsterTexture]; 

    // Animation 
    if (monsterConfig[ANIMATION]) { 
     [monster runAction:monsterConfig[ANIMATION]]; 
    } 

    // Moster Stats 
    monster.name = MONSTER_SPRITE; 
    monster.type = settings[TYPE]; 
    monster.points = monsterConfig[POINTS] ? [monsterConfig[POINTS] intValue] : [monsterDefaults[POINTS] intValue]; 
    monster.damage = monsterConfig[DAMAGE] ? [monsterConfig[DAMAGE] intValue] : [monsterDefaults[DAMAGE] intValue]; 
    monster.hp  = monsterConfig[HP]  ? [monsterConfig[HP] intValue] : [monsterDefaults[HP] intValue]; 
    monster.lethal = monsterConfig[LETHAL] ? [monsterConfig[LETHAL] boolValue] : [monsterDefaults[LETHAL] boolValue]; 

    // Monster Physics 
    float physicsResize = monsterConfig[RESIZE] ? [monsterConfig[RESIZE] floatValue] : [monsterDefaults[RESIZE] floatValue]; 
    switch ([monsterConfig[SHAPE] intValue]) { 
     case COMPLEX: 
      NSLog(@"%@", monster.texture); 
      NSLog(@"rotation: %f", monster.zRotation); 
      NSLog(@"x scale: %f", monster.xScale); 
      NSLog(@"y scale: %f", monster.yScale); 
      monster.physicsBody = [SKPhysicsBody bodyWithTexture:monster.texture size:monster.texture.size]; 
      break; 
     case RECTANGLE: 
      monster.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(monster.size.width * physicsResize, monster.size.height * physicsResize)]; 
      break; 
     default: 
      monster.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:(monster.size.height * physicsResize)/2]; 
      break; 
    } 

    monster.physicsBody.dynamic    = false; 
    monster.physicsBody.affectedByGravity = false; 
    monster.physicsBody.categoryBitMask  = monsterCategory; 
    monster.physicsBody.contactTestBitMask = weaponCategory | heroCategory; 
    monster.physicsBody.collisionBitMask = defaultCategory; 

    // Monster Flight Pattern 
    SKAction * flightPattern = [self monsterFlightPattern:monster settings:settings]; 

    // Monster Rotation 
    // Rotation disabled for physics text 
    // [self monsterRotation:monster rotationConfig:monsterConfig[ROTATION]]; 

    // Move & Remove 
    SKAction * remove = [Config removeAction:monster]; 
    [monster runAction:[SKAction sequence:@[flightPattern, remove]]]; 

    return monster; 
} 

मैं बनावट कैशिंग कर रहा हूँ जब वर्ग भार

@property (nonatomic) SKTexture * monsterBootTexture; 
... 

- (id)initWithFrameSize:(CGSize)frameSize 
{ 
    ... 
    SKTextureAtlas * atlas = [SKTextureAtlas atlasNamed:monsterAtlas]; 
    self.monsterBootTexture = [atlas textureNamed:MONSTER_BOOT]; 
    ... 
} 

NSLog के रूप में पढ़ता:

2015-01-02 12:03:20.619 Gadget Blaster[3301:665394] <SKTexture> 'boot.png' (97 x 100) 
2015-01-02 12:03:20.623 Gadget Blaster[3301:665394] <SKTexture> 'boot.png' (97 x 100) 

मैं LearnCocos2D की टिप्पणी प्रति निम्नलिखित लॉग जोड़ लिया है:

2015-01-03 12:00:06.131 Gadget Blaster[3987:772046] rotation: 0.000000 
2015-01-03 12:00:06.133 Gadget Blaster[3987:772046] x scale: 1.000000 
2015-01-03 12:00:06.134 Gadget Blaster[3987:772046] y scale: 1.000000 
2015-01-03 12:00:08.131 Gadget Blaster[3987:772046] rotation: 0.000000 
2015-01-03 12:00:08.131 Gadget Blaster[3987:772046] x scale: 1.000000 
2015-01-03 12:00:08.132 Gadget Blaster[3987:772046] y scale: 1.000000 
2015-01-03 12:00:10.156 Gadget Blaster[3987:772046] rotation: 0.000000 
2015-01-03 12:00:10.156 Gadget Blaster[3987:772046] x scale: 1.000000 
2015-01-03 12:00:10.159 Gadget Blaster[3987:772046] y scale: 1.000000 

इसके अतिरिक्त जटिल भौतिकी निकायों का उपयोग करते समय मुझे टकराव के साथ कुछ अप्रत्याशित समस्याएं आ रही हैं। SKPhysicsBody bodyWithCircleOfRadius बहुत बेहतर प्रदर्शन करता प्रतीत होता है और मैं बस सभी राक्षस सर्कल भौतिकी आकार बनाने पर विचार कर रहा हूं।

+0

जांचें कि क्या स्प्राइट या उसके माता-पिता या तो स्केल किए गए हैं या घुमाए गए – LearnCocos2D

+0

@ LearnCocos2D सही दिखते हैं। मैंने उपर्युक्त विधि में 3 एनएसएलॉग जोड़े हैं और नीचे दिए गए पहले 3 राक्षसों के लॉग आउटपुट को जोड़ा है। –

+2

मुझे एक ही समस्या है, केवल तभी जब दृश्य पुनः लोड हो। –

उत्तर

0

समाधान स्वयं बनावट के बजाय एटलस के लिए एक मजबूत संदर्भ पकड़ना था। यह मेरे कोड साइन को भी सरल बनाता है, मैं अपने दृश्य की शुरुआत में [SKTextureAtlas preloadTextureAtlases:textureAtlases withCompletionHandler:^{ ... }]; के साथ पहले से ही अपने सभी एटलस को पहले से लोड कर रहा हूं। ऐसा लगता है कि स्मृति की एक ही मात्रा (यदि कम नहीं है) का उपयोग करना प्रतीत होता है, और यह अपसाइड-डाउन भौतिकी बॉडी बग का उत्पादन नहीं करता है। इस प्रश्न पर टिप्पणियां (should I cache textures in properties in sprite kit?) ने मुझे यह खोजने में मदद की क्योंकि मैं अपना कोड दोबारा कर रहा था।

// In Game Scene 

@property (nonatomic, strong) SKTextureAtlas * monsterAtlas; 

... 

- (id)initWithSize:(CGSize)size 
{ 
     self.monsterAtlas = [SKTextureAtlas atlasNamed:monsterAtlasName]; 
     NSArray * textureAtlases = @[self.monsterAtlas]; 
     [SKTextureAtlas preloadTextureAtlases:textureAtlases withCompletionHandler:^{ ... }]; 
} 

// In Monster Class 

- (Monster *)monster:(NSDictionary *)settings 
{ 
     ... 

     SKTextureAtlas * atlas = [SKTextureAtlas atlasNamed:monsterAtlasName]; 
     NSString * textureName = monsterConfig[TEXTURE] ? monsterConfig[TEXTURE] : monsterDefaults[TEXTURE]; 
     Monster * monster  = [Monster spriteNodeWithTexture:[atlas textureNamed:textureName]]; 

     ... 
} 
+1

यह इसे xcode 6.2 तक तय करता है, और अब यह फिर से टूटा हुआ है। – Siriss

1

मुझे लगता है कि यह आईओएस 8 पर स्प्राइटकिट में एक बग है। मेरा संदेह यह है कि बग तब होता है जब भौतिक विज्ञान के लिए बनावट आंतरिक कैश से पुनर्प्राप्त होती है। कोरग्राफिक्स से समन्वय प्रणाली को सही करने की कोशिश करने के लिए यह छवि को गलत तरीके से फ़्लिप कर सकता है।

इसके बजाए bodyWithBodies का उपयोग करें। बमर, मुझे वास्तव में यह सुविधा पसंद है।

+1

आईओएस 8 के साथ आने वाली अधिकांश नई सुविधाओं की तरह लगता है कि अभी भी काफी भद्दा हैं =/ – hamobi

+0

हाँ। मैं इसके बारे में चिंतित था। हालांकि SO या वेब पर कोई सबूत नहीं मिला। जवाब के लिए धन्यवाद। आईओएस 8 में संक्रमण करते समय मैं हटाए गए फ्रॉम पेरेंट के साथ कुछ मुद्दों में भी भाग गया। शायद एक पैच बाहर आ जाएगा। –

0

मैं उपलब्ध बनावट मैं जरूरत से मेरी didMoveToView सरणी में एक SKPhysicsBody सरणी बनाने के द्वारा मेरे कोड में इस समस्या को हल करने में सक्षम था। SKPhysicsBody को पुनर्निर्मित करने के बजाय जब इसे मेरे दिए गए SKSpriteNode के लिए बदलना आवश्यक था, तो मैं सरणी में पहले से बनाई गई SKPhysicsBody का संदर्भ देने में सक्षम था। इसने बनावट को ऊपर की ओर फिसलने से रोक दिया। आशा है कि यह दृष्टिकोण दूसरों को इस पर फंसने में मदद कर सकता है।

// variable declared in SKScene 
var myPhysicsBodies: [SKPhysicsBody]() 

// put in didMoveToView 
for var i = 0; i <= 6; i++ {   
    self.myPhysicsBodies.append(SKPhysicsBody(texture: self.myTextureFrames[i], size: self.myObject.size)) 
} 

// used when changing physicsBody 
self.myObject.physicsBody = self.myPhysicsBodies[self.frameIndex] 

अद्यतन: यह जब तक आईओएस 9 एसडीके सब कुछ ठीक है और अच्छा काम कर रहा था। मैंने पाया कि मेरे 0 वें और 6 वें भौतिकी निकाय काम करेंगे लेकिन अन्य दिखाई नहीं देंगे। मैं डिवाइस से texture.plist निकालने में सक्षम था और पाया कि बनावट 1 से 5 घुमाया गया था (यानी, बनावटRotated = plist में हाँ)। मुझे लगता है कि रोटेशन का उपयोग एटलस के लिए समग्र छवि आकार को कम करने के लिए किया जाता है। ऐसा प्रतीत होता है कि बनावट एटलस की छवियों को घूर्णन किया जा रहा है, इसलिए यह किसी भी तरह बनावट से भौतिकी निकाय उत्पन्न करने की क्षमता को प्रभावित करता है।

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