Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 更改锁定后的物理主体位置';一切都安排好了_Swift_Sprite Kit_Skspritenode_Skphysicsbody - Fatal编程技术网

Swift 更改锁定后的物理主体位置';一切都安排好了

Swift 更改锁定后的物理主体位置';一切都安排好了,swift,sprite-kit,skspritenode,skphysicsbody,Swift,Sprite Kit,Skspritenode,Skphysicsbody,是否有一种方法可以在设置精灵后更改其固定位置。例如,下面的“顶部”精灵固定在“底部”精灵上,我希望能够根据需要上下移动“顶部”精灵(更改固定的y位置)。我可以看到旋转固定的精灵很容易,但是移动位置我似乎找不到解决方案。我尝试过移除插针(pinted=false),更改位置,然后重置插针(pinted=true),但位置没有更改(请参见开始部分) 任何帮助或在正确的方向推动将不胜感激,谢谢 func generateSprites() { // BASE let sizeSpr

是否有一种方法可以在设置精灵后更改其固定位置。例如,下面的“顶部”精灵固定在“底部”精灵上,我希望能够根据需要上下移动“顶部”精灵(更改固定的y位置)。我可以看到旋转固定的精灵很容易,但是移动位置我似乎找不到解决方案。我尝试过移除插针(pinted=false),更改位置,然后重置插针(pinted=true),但位置没有更改(请参见开始部分)

任何帮助或在正确的方向推动将不胜感激,谢谢

func generateSprites() {

    // BASE

    let sizeSpriteBase = CGSize(width: 40, height: 36)

    spriteBase = SKSpriteNode(texture: nil, color: UIColor.green, size: sizeSpriteBase)
    spriteBase.position.x = 0
    spriteBase.position.y = 0
    spriteBase.zPosition = 10000
    addChild(spriteBase)

    let physicsBodyBase = SKPhysicsBody(rectangleOf: sizeSpriteBase)
    physicsBodyBase.restitution = 0
    physicsBodyBase.allowsRotation = false
    physicsBodyBase.categoryBitMask = categoryMain
    physicsBodyBase.collisionBitMask = categorySolid
    physicsBodyBase.contactTestBitMask = categorySolid
    spriteBase.physicsBody = physicsBodyBase

    // TOP

    let sizeSpriteTop = CGSize(width: 40, height: 8)

    spriteTop = SKSpriteNode(texture: nil, color: UIColor.orange, size: sizeSpriteTop)
    spriteTop.position.x = 4
    spriteTop.position.y = spriteBase.size.height/2
    spriteBase.addChild(spriteTop)

    let physicsBodyTop = SKPhysicsBody(rectangleOf: sizeSpriteTop)
    physicsBodyTop.pinned = true
    physicsBodyTop.restitution = 0
    physicsBodyTop.allowsRotation = false
    physicsBodyTop.categoryBitMask = categoryMain
    physicsBodyTop.collisionBitMask = categorySolid
    physicsBodyTop.contactTestBitMask = categorySolid
    spriteTop.physicsBody = physicsBodyTop

}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

    spriteTop.physicsBody?.pinned = false
    spriteTop.position.y -= 8
    spriteTop.physicsBody?.pinned = true

}
func生成脚本(){
//基地
let SizeScriteBase=CGSize(宽:40,高:36)
spriteBase=SKSpriteNode(纹理:nil,颜色:UIColor.green,大小:sizeSpriteBase)
spriteBase.position.x=0
spriteBase.position.y=0
spriteBase.zPosition=10000
addChild(spriteBase)
让physicsBodyBase=SKPhysicsBody(矩形:sizeSpriteBase)
physicsBodyBase.restitution=0
physicsBodyBase.allowsRotation=false
physicsBodyBase.categoryBitMask=categoryMain
physicsBodyBase.collisionBitMask=类别实体
physicsBodyBase.contactTestBitMask=类别实体
spriteBase.physicsBody=physicsbodbase
//顶
let SizeScriteTop=CGSize(宽:40,高:8)
spriteTop=SKSpriteNode(纹理:nil,颜色:UIColor.orange,大小:sizeSpriteTop)
spriteTop.position.x=4
spriteTop.position.y=spriteBase.size.height/2
spriteBase.addChild(spriteTop)
让physicsBodyTop=SKPhysicsBody(矩形:sizeSpriteTop)
physicsBodyTop.pinted=true
physicsBodyTop.restitution=0
physicsBodyTop.allowsRotation=false
physicsBodyTop.categoryBitMask=categoryMain
physicsBodyTop.collisionBitMask=类别实体
physicsBodyTop.contactTestBitMask=类别实体
spriteTop.physicsBody=physicsBodyTop
}
覆盖func TouchesBegind(Touchs:Set,带有事件:UIEvent?){
spriteTop.physicsBody?.pinted=false
斜顶位置y-=8
spriteTop.physicsBody?.pinted=true
}

您的代码看起来不错,但我认为您的问题是由gameloop和您在TouchsStart中更改物理体的方式引起的。每个游戏循环只对开始的触碰执行一次。因此,将pinted属性设置为false,然后设置为true将等同于将其设置为true

相反,请尝试将pinted属性设置为false,并在touchesbreated方法中移动对象。然后重写didFinishUpdate方法,如下所示

if pinned == false { pinned =  true}
哦,您是否将固定的主体设置为allowRotation=true!这件事以前让我很吃惊

希望这有帮助