ios - 在 Swift 中确定 SKPhysicsBody 的宽度

标签 ios swift sprite-kit

我有以下代码来设置新的PhysicsBody:

let size = CGSize(width: 100, height: 10)

let player = SKShapeNode(rectOf: size)
player.lineWidth = 1

player.physicsBody = SKPhysicsBody(rectangleOf: size)

player.physicsBody?.affectedByGravity = false
player.physicsBody?.isDynamic = true

当用户触摸屏幕时,我试图确定他们是否触摸了对象内部、左侧或右侧:

func touchDown(atPoint pos : CGPoint) {
    if (pos.x <= (player?.position.x)!) {
        // left
    } else if (pos.x >= (player?.position.x)! + (player?.frame.width)!) {
        // right
    } else {

        print(player?.position.x)
        print ((player?.position.x)! + (player?.frame.width)!)
        print(pos.x)
        // middle
    }
}

调试语句和我的实验告诉我,player?.frame.width 没有返回对象的正确宽度。但是,更重要的是,即使物体偏离得很远,我似乎也能返回一个中心。该对象正在移动,因此我怀疑问题在于它返回了之前的位置。

所以,我有一个由两部分组成的问题:frame.width 是确定宽度的正确方法吗?在使用touchesBegan 事件时是否有什么因素可能导致这种明显的信息滞后?

最佳答案

位置取决于 anchor ,通常是 (0.5,0.5) 或 Sprite 的中心。

位置也是相对于父级的,因此您需要确保使用正确的坐标系,最好的选择是 touch.location(in:player) 来获取触摸玩家的坐标系。

完成此操作后,当 x 为负数时,您知道它是左边的,当 x 为正数时,您知道它是右边的。另外,当 -width/2 < x < width/2 时,您知道您位于节点内部,其中 0 表示您到达了死点。

关于ios - 在 Swift 中确定 SKPhysicsBody 的宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47196543/

相关文章:

ios - 不同时间重复通知

ios - 覆盖扩展方法的替代方法

multithreading - SpriteKit中的多线程

ios - 使用 SKAction 更改 SKShapeNode 的位置

ios - AVCaptureDevice 的 hasFlash 和 hasTorch 属性有什么区别?

android - 为 "put on homescreen"功能定义 URL

ios - 如何制作一个确认某个协议(protocol)并具有不同父类的对象数组?

Swift NSUserDefaults 第一次为零

ios - SpriteKit Physicsbody 和 .allContactedBodies() 的时间

ios - 如何从 iOS 中的文档目录获取文件的创建日期?