首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SKPhysicsContact主体,不能更改属性

SKPhysicsContact主体,不能更改属性
EN

Stack Overflow用户
提问于 2017-05-26 10:23:06
回答 2查看 195关注 0票数 0

我有一个SpriteKit物理接触器在didBegin(contact:)发射。我抓取Dot对象实例的物理主体,希望将其移出屏幕,但是当我试图像这样改变它的位置时,什么都不会发生:

优先逼近

代码语言:javascript
复制
/* 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类中调用一个方法,并传入该体,则正确地设置了该位置:

第二次逼近

代码语言:javascript
复制
/* 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的课程:

代码语言:javascript
复制
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的项目

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-29 23:26:19

代码语言:javascript
复制
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
    }
}

在我刚刚编辑的代码中可能有一些小错误。但希望这给了你这个想法。这应该是没有错误的。

票数 1
EN

Stack Overflow用户

发布于 2017-05-26 21:18:09

编辑:

我认为这是因为您正在创建SKSpriteNode的子类,而不是创建SKSpriteNode的实例。除非你要专攻别的东西,否则我看不出有什么理由这样做。相反,我用了这些

代码语言:javascript
复制
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里

代码语言:javascript
复制
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的性质。还创建多个实例。现在,您可以在接触发生时直接更改它,或者调用点类中的一个方法来移动。希望这能帮上忙。:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44199162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档