2014-04-02 27 views
6

Tôi có một nút có cơ thể vật lý động. Và tôi muốn làm cho nó tĩnh và thay đổi vị trí của nó khi nó tiếp xúc với cơ thể khác.SpriteKit: không thể thay đổi vị trí nút trong gọi lại số liên lạc

tôi quản lý để làm cho cơ thể tĩnh với các giải pháp cung cấp trong câu hỏi này: Sprite Kit failing assertion: (typeA == b2_dynamicBody || typeB == b2_dynamicBody)

Tuy nhiên nếu tôi thay đổi position tài sản của các nút theo một trong các phương thức liên lạc gọi lại (ví dụ didBeginContact) vị trí mới không phải là đưa vào tài khoản.

Làm cách nào để đạt được điều đó?

+0

bạn có thể gửi mã mà không cập nhật vị trí, cũng như làm thế nào bạn thực hiện các giải pháp bạn có liên quan đến? – LearnCocos2D

+0

@ LearnCocos2D giải pháp được đưa ra bởi JKallio hoạt động tốt (gán lại physicsBody cho nút của nó) – fiddler

Trả lời

6

Tôi tin rằng đây là lỗi trong SpriteKit. (Tôi đã có thể tái tạo vấn đề này với SpriteKit 7.1).

Dưới đây là một cách giải quyết nhanh chóng:

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

Nó hoạt động tốt. Tôi chỉ thay đổi một chút dòng cuối cùng: 'contact.bodyB.node.physicsBody = contact.bodyB.node.physicsBody;' – fiddler

0

giải pháp JKallio đã không làm việc cho tôi (Xcode 7.2.1 trên OS X 10.10.5, nhắm mục tiêu iOS 8.1). Tôi đã tìm ra rằng tôi đã có thể thay đổi vị trí trong phương thức update:, vì vậy tôi gặp lỗi này bằng cách đặt cờ trong didBeginContact và thay đổi vị trí trong update:.

@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 

Lưu ý rằng _victim đóng vai trò là nút và cờ.

Giải pháp của tôi phức tạp hơn mà JKallio's; hãy thử cái đó trước khi đến đây.

0

Là một tùy chọn khác cho giải pháp thay thế, thay vào đó, tôi gọi phương thức trong lớp con SKSpriteNode cho đối tượng mà tôi muốn di chuyển, chuyển vào phần thân đó. Vị trí được đặt chính xác.

/* 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() 
    }   
} 

Đây là lớp Dot:

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) 
    } 
} 
Các vấn đề liên quan