【问题标题】:Create Wall / Barrier Using SKSpriteNode physicsBody使用 SKSpriteNodephysicsBody 创建墙/屏障
【发布时间】:2017-12-21 02:03:37
【问题描述】:

我的 SKSpriteKit 应用程序中有一个单独的“Floor”类。当我第一次创建这个类时,我使用

在整个框架周围设置了一个障碍

self.physicsBody = SKPhysicsBody(edgeLoopF​​rom: self.frame)

但这实际上阻止了 SKSpriteNodes 从屏幕顶部进入,所以现在我试图弄清楚如何创建框架墙的左、右和底部,而不是顶部。这样我就可以避免屏幕底部的一个 SKSpriteNode(用户仍然可以看到)在离开显示器时左右移动。我正在尝试下面哪个正在构建,好像它会起作用但是当我启动游戏时我看不到墙壁?我不太确定我做错了什么,我有

skView.showsPhysics = true

    import Foundation
import SpriteKit

    class Floor: SKNode {
        override init() {
            super.init()

            let leftWall = SKSpriteNode(color: UIColor.brown, size: CGSize(width: 100, height: frame.height))
            leftWall.position = CGPoint(x: 100, y: 100)
            leftWall.physicsBody = SKPhysicsBody(rectangleOf: leftWall.size)
            leftWall.physicsBody!.isDynamic = false
            self.addChild(leftWall)

            let rightWall = SKSpriteNode(color: UIColor.brown, size: CGSize(width: 100, height: frame.height))
            rightWall.position = CGPoint(x: 200, y: 200)
            rightWall.physicsBody = SKPhysicsBody(rectangleOf: rightWall.size)
            rightWall.physicsBody!.isDynamic = false
            self.addChild(rightWall)

            // Set the bit mask properties
            self.physicsBody?.categoryBitMask = balloonCategory
            self.physicsBody?.contactTestBitMask = nailDropCategory
            //self.physicsBody?.collisionBitMask = balloonCategory
        }

        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemted")
        }
    }

【问题讨论】:

  • 场景大小和缩放模式是什么? IE。您将这些 Sprite 节点定位在 100,100 和 200,200 处,您确定这在场景的可见部分内吗?此外,不是主要问题,而是:您将物理主体分配给场景两次,并且它只能有一个,因此将物理主体添加到精灵中,即不是“self.physicsBody=”而是“leftWall.physicsBody=”。
  • 关闭墙壁的重力
  • 基本上你想做leftWall.isDynamic = false
  • @AliBeadle 我必须使用“self.physicsBody”因为它是一个单独的类权利v
  • 没有。每个 SKNode(并且 SKScene 是一个 SKNode)最多可以有一个物理体。通过创建两个物理体并将它们应用到同一个节点(不清楚,但我假设您的代码是您的 SKScene 的一部分),那么您实际上将失去第一个。因此,除了 KnightOfDragon 对您的主要问题的解决方案(我认为他是正确的),我认为您还需要考虑将您的物理体移动到其他地方。它们的正常位置是在它们影响的节点上 - 即您的 SKSpriteNodes。

标签: swift sprite-kit skspritenode skphysicsbody


【解决方案1】:

重力正在影响你的墙壁,因此它们将永远被遗忘。

当您创建边缘循环时,您无需担心这一点,因为边缘循环始终是静态的,因为它没有体积

现在您正在使用基于体积的物体,因此您需要考虑重力和其他影响您的物体的力。

要让你的身体忽略这些力,只需设置isDynamic = false

let leftWall = SKSpriteNode(color: UIColor.brown, size: CGSize(width: 100, height: frame.height))
leftWall.position = CGPoint(x: 100, y: 100)
leftWall.physicsBody = SKPhysicsBody(rectangleOf: leftWall.size)
leftWall.physicsBody!.isDynamic = false
self.addChild(leftWall)

let rightWall = SKSpriteNode(color: UIColor.brown, size: CGSize(width: 100, height: frame.height))
rightWall.position = CGPoint(x: 200, y: 200)
rightWall.physicsBody = SKPhysicsBody(rectangleOf: rightWall.size)
rightWall.physicsBody!.isDynamic = false
self.addChild(rightWall)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 2016-04-24
    • 2013-09-05
    • 2019-02-23
    • 1970-01-01
    相关资源
    最近更新 更多