为啥当我将 SKSpriteNode 与图像一起使用时它不会反弹,但当我使用 SKShapeNode 时它确实有效?

Posted

技术标签:

【中文标题】为啥当我将 SKSpriteNode 与图像一起使用时它不会反弹,但当我使用 SKShapeNode 时它确实有效?【英文标题】:Why when I use SKSpriteNode with an image it doesn't bounce but when I use SKShapeNode it does work?为什么当我将 SKSpriteNode 与图像一起使用时它不会反弹,但当我使用 SKShapeNode 时它确实有效? 【发布时间】:2016-07-13 16:37:02 【问题描述】:

我对 Swift 很陌生,我正在尝试创建一个可以上下弹跳的球。当我使用时:

import Foundation
import SpriteKit

class Ball 
    let movingObject: SKShapeNode

    init() 
        movingObject = SKShapeNode(circleOfRadius: 25)
        movingObject.physicsBody = SKPhysicsBody(circleOfRadius: 25)
        movingObject.physicsBody?.affectedByGravity = true
        movingObject.physicsBody?.restitution = 1
        movingObject.physicsBody?.linearDamping = 0

    

它工作正常。但是,当我尝试使用图像时,它不会反弹。

class Ball 
    let movingObject: SKSpriteNode
    let picture: String

    init(picture: String) 
        self.picture = picture
        movingObject = SKSpriteNode(imageNamed: picture)
        movingObject.physicsBody = SKPhysicsBody(circleOfRadius: movingObject.size.width * 0.5)
        movingObject.physicsBody?.affectedByGravity = true
        movingObject.physicsBody?.restitution = 1
        movingObject.physicsBody?.linearDamping = 0

    

【问题讨论】:

请edit你的问题标题更有意义。它应该描述您提出的实际问题或问题(此代码不起作用不是有用的问题描述)。您的标题应该足够清晰,以便对在搜索结果中看到它的未来读者有意义。 (想象一下,搜索一个问题并找到 100 个标题都是 此代码不起作用 的变体的问题;这对您是否有用,而无需通读所有 100 个帖子以查看是否适用于您?) 另外请显示“有效”的代码和“无效”的代码。清楚问题是什么。 调试,看看movingObject.size.width 是什么... 【参考方案1】:

两个物理体之间的唯一区别是半径。因此,这一定是问题所在。

尝试将半径设置为25,就像您对形状节点所做的那样进行确认,然后尝试推理为什么movingObject.size.width * 0.5 没有达到合理的值。您可以设置断点并使用调试器到print movingObject.size 来帮助。

【讨论】:

【参考方案2】:

关于SKSpriteNode 来源:

/**
     Initialize a sprite with an image from your app bundle (An SKTexture is created for the image and set on the sprite. Its size is set to the SKTexture's pixel width/height)
     The position of the sprite is (0, 0) and the texture anchored at (0.5, 0.5), so that it is offset by half the width and half the height.
     Thus the sprite has the texture centered about the position. If you wish to have the texture anchored at a different offset set the anchorPoint to another pair of values in the interval from 0.0 up to and including 1.0.
     @param name the name or path of the image to load.
     */
    public convenience init(imageNamed name: String)

在第一种情况下,您使用 25 作为半径,在下一种情况下,您必须检查movingObject.size.width` * 0.5 是否是一个有效的度量。

当您处于调试阶段时,请尝试通过打开 showsPhysics 属性来帮助自己:

示例代码

override func viewDidLoad() 
        super.viewDidLoad()

        if let scene = GameScene(fileNamed:"GameScene") 
            // Configure the view.
            let skView = self.view as! SKView
            skView.showsPhysics = true
            ...
        

您可以轻松查看对象的 physicBody 边界,如果出现问题,您可以立即注意到它。

【讨论】:

以上是关于为啥当我将 SKSpriteNode 与图像一起使用时它不会反弹,但当我使用 SKShapeNode 时它确实有效?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 SKSpriteNode 没有以图像的默认分辨率显示?

当我将 event.preventDefault() 与 fetch api、express 和 node.js 一起使用时,为啥 req.body 返回 null? [复制]

为啥自定义光标图像显示不正确?

我创建了 lib.a 文件并添加了一些类、资源和图像。当我将此 lib 文件与头文件一起使用时,它会给出异常

为啥当我将 GridSearchCV 与 roc_auc 评分一起使用时,grid_search.score(X,y) 和 roc_auc_score(y, y_predict) 的分数不同?

SKSpriteNode 没有正确缩放