我有一个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的项目。
发布于 2017-05-29 23:26:19
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-26 21:18:09
编辑:
我认为这是因为您正在创建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()
}
}请注意,我已经禁用了物理体,因为我没有为它创建另一个可以着陆的物体(这样它就会继续下降)。我还用飞船当精灵。
所以现在你可以在点类中有任何自定义方法了。同时,u还可以直接操纵点SpriteNode的性质。还创建多个实例。现在,您可以在接触发生时直接更改它,或者调用点类中的一个方法来移动。希望这能帮上忙。:)
https://stackoverflow.com/questions/44199162
复制相似问题