【问题标题】:SpriteKit physics not matching imageSpriteKit 物理与图像不匹配
【发布时间】:2018-09-27 23:22:26
【问题描述】:

在我的乒乓球比赛中,球没有正确弹跳。所以,在View Controller 中,我将View 的showPhysics 设置为true,这就是我得到的图像:

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

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 的大小时,物理边界不会改变。我该如何解决这个问题?

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

编辑

Physics Definition(全部在属性检查器中完成):

.

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

谢谢。现在,我创建了一个函数来重置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,这是一种更简单的屏幕布局方式。

【问题讨论】:

  • 把你应用physicsBody的代码放到你的问题中
  • @RonMyschuk 我已将其添加到我的问题中 :)

标签: ios swift sprite-kit


【解决方案1】:

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

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

【讨论】:

  • 谢谢!我会务实地这样做,因为我需要约束
  • 是的,很遗憾
  • 我不太介意,一开始真的让我很困惑?
  • 有没有办法只改变 Body 而不是创建一个新对象?否则我必须重置每个参数(例如摩擦、旋转等所有参数)
  • 我很确定我的答案中的代码只是改变了physicsBody而不是创建一个新的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-18
相关资源
最近更新 更多