0

我有一个 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()
    }        
}

这是点类:

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 上项目的链接

4

2 回答 2

1

编辑:

我认为这是因为您正在创建 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()

}

}

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

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

于 2017-05-26T21:18:09.843 回答
1
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
    }
}

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

于 2017-05-29T23:26:19.527 回答