2014-04-02 16 views
6

Dinamik fizik gövdesine sahip bir düğümüm var. Ve bunu statik yapmak ve başka bir bedenle temas ettiğinde konumunu değiştirmek istiyorum. Yeni pozisyon değil ben kontakt geri arama yöntemlerinden birini (örn didBeginContact) içinde düğümün position özelliğini değiştirmek Ancak Sprite Kit failing assertion: (typeA == b2_dynamicBody || typeB == b2_dynamicBody)SpriteKit: iletişim geri çağırmada düğüm konumunu değiştiremiyor

:

Bu soru sağlanan solüsyon ile vücut statik yapmak başardı dikkate alındı.

Bunu nasıl başarabilirim?

+0

Eğer pozisyon güncellemek için başarısız kod gönderebilir: Burada

/* In GameScene.swift */ func didBegin(_ contact: SKPhysicsContact) { let dotBody: SKPhysicsBody if contact.bodyA.categoryBitMask == 0b1 { dotBody = contact.bodyB } else { dotBody = contact.bodyA } if let dot = dotBody.node as? Dot { dot.move() } } 

Dot sınıftır? – LearnCocos2D

+0

@ LearnCocos2D, JKallio tarafından verilen çözümün gayet iyi çalışıyor (fizikBody'nin düğümüne yeniden atanması) – fiddler

cevap

6

Bunun SpriteKit'teki bir hata olduğuna inanıyorum. (Bu sorunu SpriteKit 7.1 ile yeniden üretebildim).

Burada hızlı çözüm budur:

- (void) didBeginContact:(SKPhysicsContact *)contact 
{ 
    contact.bodyB.node.position = CGPointMake(newX, newY); 
    contact.bodyB.node.physicsBody = contact.bodyB.node.physicsBody; // <-- Add this line 
} 
+1

İyi çalışıyor. Son satırı biraz değiştirdim: 'contact.bodyB.node.physicsBody = contact.bodyB.node.physicsBody;' – fiddler

0

JKallio çözümü (iOS 8.1 hedefleyen, OS X 10.10.5 üzerinde Xcode 7.2.1) benim için çalışmadı. update: yöntemindeki konumu değiştirebildiğimi anladım, böylece didBeginContact numaralı bayrağa bir bayrak ayarlayarak ve update: numaralı konumdaki konumu değiştirerek hatayı buldum. _victim düğüm ve bayrak olarak hizmet vermektedir bu

@implementation GameScene { 
    SKNode *_victim; 
    CGPoint _target; 
} 

- (void)didMoveToView:(SKView *)view { 
    _victim = nil; 
} 

- (void)didBeginContact:(SKPhysicsContact *)contact { 
    _victim = contact.bodyB.node; 
    _target = CGPointMake(newX, newY); 
} 

- (void)update:(CFTimeInterval)currentTime { 
    if (_victim != nil) { 
     _victim.position = _target; 
     _victim = nil; 
    } 
} 

@end 

not edin.

Benim çözümüm JKallio'nun daha karmaşık; Bunun için gelmeden önce bunu deneyin.

0

Bir geçici çözüm için başka bir seçenek olarak, taşımak istediğim nesne için SKSpriteNode alt sınıfında bir yöntem çağırıyorum. Pozisyon doğru ayarlanmış. Eğer bağlı çözümünü uygulamaya nasıl yanı sıra

import SpriteKit 
class Dot : SKSpriteNode { 
    let dotTex = SKTexture(imageNamed: "dot") 
    init() { 
     super.init(texture: dotTex, color: .clear, size: dotTex.size()) 
     self.physicsBody = SKPhysicsBody(circleOfRadius: size.width/2) 
     self.physicsBody?.categoryBitMask = 0b1 << 1 
     self.physicsBody?.contactTestBitMask = 0b1 
    } 

    func move() { 
     let reset = SKAction.run { 
      self.position.x = 10000 
     } 
     self.run(reset) 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 
} 
İlgili konular