SKPhysics接触体,不能改变属性



我有一个 SpriteKit 物理接触在didBegin(contact:)中发射。我抓住了要移出屏幕的 Dot 对象实例的物理主体,但是当我尝试像这样更改其位置时,没有任何反应:

第一种方法

/* 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.position.x = 10000
    }
}

但是,如果我改为在我的 Dot 类中调用一个方法,传入该主体,则位置设置正确:

第二种方法

/* 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 类:

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)
    }
}

谁能解释为什么第二种方法中的位置变化有效,但在我的第一个方法中不起作用?

这是Github上项目的链接。

func didBegin(_ contact: SKPhysicsContact) {
  let hitDot = contact.bodyB.node! as! SKSpriteNode
  let hitDot1 = contact.bodyA.node! as! SKSpriteNode
    if hitDot.name? == "dot" || hitDot1.name? == "dot" {
       reset = true
    }        
}
   override func update(_ currentTime: TimeInterval) {
    if reset {
        newDot.position.x = 0
        reset = false
    }
}

我刚刚在这里编辑的代码中可能存在小错误。但希望这能给你这个想法。这应该可以正常工作,没有错误。

编辑:

我认为这是因为您正在创建SKSpriteNode的子类,而不是创建SKSpriteNode的实例。除非你打算把它专门用于其他事情,否则我认为没有理由这样做。相反,我使用了这些

import Foundation
import SpriteKit
class Dot {
let dotSprite: SKSpriteNode
init() {
    dotSprite = SKSpriteNode(imageNamed: "Spaceship")
//        dotSprite.physicsBody = SKPhysicsBody(circleOfRadius: dotSprite.size.width/2)
//        dotSprite.physicsBody?.categoryBitMask = 0b1 << 1
//        dotSprite.physicsBody?.contactTestBitMask = 0b1
}
func move() {
    self.dotSprite.position.x = 0
}
func moveAnim(){
    let reset = SKAction.moveTo(x: 0, duration: 3)
    dotSprite.run(reset)
}
}

在我的SKScene中

import SpriteKit
import GameplayKit
class GameScene: SKScene {
let newDot = Dot()

override func didMove(to view: SKView) {
    self.addChild(newDot.dotSprite)
    newDot.dotSprite.setScale(0.5)
    newDot.dotSprite.position = CGPoint(x: frame.midX, y: frame.midY)
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    newDot.dotSprite.position.x = 200
    newDot.moveAnim()
}
}

请注意,我已经禁用了物理身体,因为我还没有创建另一个身体让它降落(所以它会继续下降(。我也用宇宙飞船作为精灵。

所以现在你可以在 dot 类中拥有任何自定义方法。你也可以直接操作点精灵节点的属性。还要创建多个实例。现在,您可以在发生接触时直接更改它,或者调用 dot 类中的方法来移动。希望这是有帮助的。:)

最新更新