ios - SpriteKit 物理不匹配图像

标签 ios swift sprite-kit

在我的 Pong 游戏中,球弹跳不正常。因此,在 View Controller 中,我将 View 的 showPhysics 设置为 true,这是我得到的图像:

enter image description here

这些桨已经在我的代码中调整了大小:

override func didMove(to view: SKView) {

    // Create sprites
    ball = self.childNode(withName: "ball") as! SKSpriteNode
    enemy = self.childNode(withName: "enemy") as! SKSpriteNode
    player = self.childNode(withName: "player") as! SKSpriteNode

    // Get labels
    enemyLabel = self.childNode(withName: "enemyScore") as! SKLabelNode
    playerLabel = self.childNode(withName: "playerScore") as! SKLabelNode

    // Set constraints
    setConstraints()

    // Screen border
    let border = SKPhysicsBody(edgeLoopFrom: CGRect(x: frame.minX, y: frame.minY - ball.frame.height * 2, width: frame.width, height: frame.height + ball.frame.height * 4))
    border.friction = 0
    border.restitution = 0
    self.physicsBody = border

    // Reset game
    reset()

}

和我的setConstraints 函数:

func setConstraints() {

    let enemyPositionY = SKConstraint.positionY(SKRange(constantValue: frame.maxY - 15))
    enemy.constraints = [enemyPositionY]
    enemy.size.width = frame.width / 4

    let playerPositionY = SKConstraint.positionY(SKRange(constantValue: frame.minY + 15))
    player.constraints = [playerPositionY]
    player.size.width = frame.width / 4

}

因此,我可以看出,当我调整 Sprite 大小时,物理边界不会改变。我该如何解决这个问题?

这是奇怪的行为,但感谢您的帮助!

编辑

物理定义(全部在属性检查器中完成):

enter image description here

.

== 编辑(解决方案)==

谢谢。现在,我创建了一个函数来重置 physicsBody:

import Foundation
import SpriteKit

// Create new default physics body
func createPhysicsBody(for body: inout SKSpriteNode) {

    // Create new physics body
    body.physicsBody = SKPhysicsBody(rectangleOf: body.frame.size)
    body.physicsBody?.isDynamic = false
    body.physicsBody?.allowsRotation = false
    body.physicsBody?.pinned = false
    body.physicsBody?.affectedByGravity = false
    body.physicsBody?.friction = 0
    body.physicsBody?.restitution = 0
    body.physicsBody?.linearDamping = 0
    body.physicsBody?.angularDamping = 0

}

要调用它,您可以使用:

createPhysicsBody(for: &player)

编辑

我现在转到了 this这是一种更简单的屏幕布局方式。

最佳答案

PhysicsBodies 不是动态的。当您更改 SKSpriteNode 时,它​​们不会更改。您将需要重新考虑如何创建您的物理实体。您要么必须在编辑器中提出正确的尺寸并坚持使用,要么必须在代码中调整播放器尺寸后调整 physicsBody 矩形。

player.physicsBody = SKPhysicsBody(rectangleOf: player.frame.size)

关于ios - SpriteKit 物理不匹配图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49887478/

相关文章:

ios - 未将普通 UIView 添加到 UIStackView

ios - 在 Swift 中调用函数

swift - 如何选择第一个出现的场景 spritekit/swift?

swift - 初学者 swift Sprite 工具包 - 节点碰撞检测帮助(SKPhysicsContact)

ios - native 移动应用程序的 Cookies 和 JWT 之间的显着差异

ios - 如何制作包含特定值的 Swift 字典?

ios - 无法将字典数组写入 Plist 文件

sprite-kit - 来自 SKTextureAtlas 的 SKTexture 是否支持 mipmap 功能?

ios - Swift - 减少 UICollectionViewCell 之间的间隙

ios - 调配私有(private)框架 iOS API 的方法