gpt4 book ai didi

swift - 让 Sprite 以速度移动

转载 作者:行者123 更新时间:2023-11-30 10:57:39 25 4
gpt4 key购买 nike

我正在尝试使用速度让 Sprite 跟随我的手指,这样它就不会逐步穿过其他 Sprite 节点,或插入它们。我只想让 Sprite 节点(又名球)简单地击中另一个 Sprite 节点,然后弹开,或者只是击中它并坐在那里,直到它再次移动。

目前我正在使用基于位置的移动:

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches {
let location = touch.location(in: self)
ball.position.x = location.x
ball.position.y = location.y
print("x: \(ball.position.x), y: \(ball.position.y)")
}
}

我怎样才能使它不会在其他 Sprite 节点周围移动并且实际上与categoryBitMask元素发生 react ?

我对这整件事都很陌生。希望你能理解:)

我的其余代码:

import SpriteKit
import GameplayKit

class GameScene: SKScene {

var ball = SKSpriteNode()
var danger1 = SKSpriteNode()
var danger2 = SKSpriteNode()
var goal = SKSpriteNode()


override func didMove(to view: SKView) {

ball = self.childNode(withName: "ball") as! SKSpriteNode
danger1 = self.childNode(withName: "danger1") as! SKSpriteNode
danger2 = self.childNode(withName: "danger2") as! SKSpriteNode
goal = self.childNode(withName: "goal") as! SKSpriteNode

let border = SKPhysicsBody(edgeLoopFrom: self.frame)
border.friction = 0
border.restitution = 0

danger1.physicsBody = SKPhysicsBody()
danger1.physicsBody?.categoryBitMask = PhysicsCategories.dangerCategory
danger2.physicsBody = SKPhysicsBody()
danger2.physicsBody?.categoryBitMask = PhysicsCategories.dangerCategory

ball.physicsBody = SKPhysicsBody()
ball.physicsBody?.categoryBitMask = PhysicsCategories.ballCategory
ball.physicsBody?.contactTestBitMask = PhysicsCategories.dangerCategory
ball.physicsBody?.collisionBitMask = PhysicsCategories.none

goal.physicsBody = SKPhysicsBody(circleOfRadius: goal.size.width/2)
goal.physicsBody?.categoryBitMask = PhysicsCategories.goalCategory

danger1.physicsBody?.isDynamic = true
ball.physicsBody?.isDynamic = true
goal.physicsBody?.isDynamic = true
danger2.physicsBody?.isDynamic = true
danger2.physicsBody!.affectedByGravity = false
danger1.physicsBody!.affectedByGravity = false
goal.physicsBody!.affectedByGravity = false
ball.physicsBody!.affectedByGravity = false
setupPhysics()

}
func setupPhysics() {
physicsWorld.gravity = CGVector(dx: 0.0, dy: 0.0)
physicsWorld.contactDelegate = self
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches {
}
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches {
let location = touch.location(in: self)
ball.position.x = location.x
ball.position.y = location.y
print("x: \(ball.position.x), y: \(ball.position.y)")
}
}

override func update(_ currentTime: TimeInterval) {
// Called before each frame is rendered
}
}

extension GameScene: SKPhysicsContactDelegate {



func didBegin(_ contact: SKPhysicsContact) {
let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask

if contactMask == PhysicsCategories.ballCategory | PhysicsCategories.dangerCategory {
ball.position = CGPoint(x: 0, y: 550)
} else if contactMask == PhysicsCategories.ballCategory | PhysicsCategories.goalCategory {
print("Goal!")
}
}

}

最佳答案

尝试注释掉这一行:

ball.physicsBody?.collisionBitMask = PhysicsCategories.none

防止球与任何物体碰撞,即它不受与任何物体碰撞的影响。注意 - 这并不意味着其他物体不会受到与球碰撞的影响。碰撞是双向的 - 给定 2 个节点 A 和 B,您必须定义 A 是否与 B 碰撞 以及 B 是否与 A 碰撞。这对于接触来说不是必需的 - 定义 A 就足够了如果实际上是 b 移动到 A 中,则仍会调用 didBegin() 。您不必也定义 B 联系人 A。

您似乎还没有在任何其他物理体上设置collisionBitMask,这意味着它们将与所有物体发生碰撞。

这解释了为什么球会穿过墙壁 - 因为它不会与墙壁碰撞,尽管其他所有物体都应该被球插入。

尝试输入:

print("Contact") 

作为 didBegin() 的第一行,以查看是否正在注册任何联系人。

如果你想用手指拖动 Sprite ,那么让它们弹开(与其他 Sprite 碰撞)可能会很棘手,因为拖动意味着你想要手动设置它们的位置,而弹起意味着你想要移动 Sprite 由 Sprite-Kit 引擎开发,两者并不真正兼容。

可能值得指出的是,“碰撞”是 Sprite 相互反弹,并由 SK 引擎处理。 collisionBitMask 控制哪些对象相互反弹。

“联系人”只是当两个对象接触时收到通知的一种方式。它们由 contactTestBitMask 控制。

接触和碰撞都依赖于categoryBitMAsk

我的碰撞和接触分步指南: https://stackoverflow.com/a/51041474/1430420

以及碰撞和接触测试位掩码指南: https://stackoverflow.com/a/40596890/1430420

操纵位掩码来关闭和打开单独的碰撞和接触。 https://stackoverflow.com/a/46495864/1430420

关于swift - 让 Sprite 以速度移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53763999/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com