在首先解释我的问题之前,这里是我的代码:
class CollisionTestScene:SKScene, SKPhysicsContactDelegate{
var circle:SKShapeNode?
var ground:SKShapeNode?
var move = false
override func didMove(to view: SKView) {
self.physicsWorld.contactDelegate = self
ground = SKShapeNode()
let pathToDraw = CGMutablePath()
pathToDraw.move(to: CGPoint(x: 0.0, y: frame.midY - 50))
pathToDraw.addLine(to: CGPoint(x: frame.maxX, y: frame.midY))
ground?.path = pathToDraw
ground?.strokeColor = SKColor.red
ground?.physicsBody = SKPhysicsBody(edgeFrom: CGPoint(x: 0.0, y: frame.midY - 50), to: CGPoint(x: frame.maxX, y: frame.midY))
ground?.physicsBody?.affectedByGravity = false
ground?.physicsBody?.isDynamic = false
addChild(ground!)
circle = SKShapeNode(circleOfRadius: 10)
circle?.position = CGPoint(x: frame.midX, y: frame.midY);
circle?.strokeColor = SKColor.clear
circle?.fillColor = SKColor.orange
circle?.physicsBody = SKPhysicsBody(circleOfRadius: 10)
circle?.physicsBody?.isDynamic = true
circle?.physicsBody?.categoryBitMask = 1
circle?.physicsBody?.contactTestBitMask = ground!.physicsBody!.categoryBitMask
addChild(circle!)
}
func didBegin(_ contact: SKPhysicsContact) {
circle?.physicsBody?.isDynamic = false
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
move = true
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
move = false
}
override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
move = false
}
override func update(_ currentTime: TimeInterval) {
if move{
ground?.position = CGPoint(x: (ground?.position.x)! - 1, y: (ground?.position.y)!)
}
}
}
示例的机制是侧面滚动器。当玩家触摸屏幕时,在此示例中,倾斜坡度的地面将向左移动。我的播放器保持在给定位置。
现在,当最初我的玩家(在这种情况下,圆圈)由于重力而掉落时,我使我的玩家在碰撞检测处理程序上保持静止,因为默认情况下,在给定的物理世界中,它沿坡度向下倾斜。这是我对玩家永不退缩的第一个要求。地面向后移动,给人的印象是玩家向前移动,这将是长边滚动条。我可能仍在弄错spritekit的物理原理,所以做错了。
第二个问题是,当玩家触摸屏幕并且地面开始向后移动时,玩家的位置永远不会更新,而我希望玩家始终位于地面坡度的表面上。当然这是因为我的玩家圈子已成为静态实体。
这是我的困境。如果我使播放器具有动态性,那么它会滚到我不想要的坡度上。如果我将播放器设为静态,则无法弄清楚如何始终将播放器保持在倾斜的表面上。我不能对我的播放器施加冲动或任何力量,因为我不想移动播放器,而只是移动地面。
编辑2: 根据RonMyschuk的评论,我调整了重力的x值
self.physicsWorld.gravity.dx = 1.36
如果您在新行上方运行我的代码以更新重力并注释掉碰撞检测方法,该方法将播放机变成静态实体,那么当我按屏幕移动地面时,您会看到我期望的结果。 上面唯一的问题是我的地面坡度会像程序生成器一样以各种角度出现。我将需要一些公式来计算和更改不同传入地面的重力。并且可能存在一些问题,其中重力切换的速度不够快,无法避免播放器自身移动。在最后一种情况下,我可以使用固定的n种方式在地面生成器中生成各种静态斜率,并且仅对每个不同的预定斜率使用静态x重力值。
我绝对想知道是否有人可以在不移动玩家自身的情况下,使玩家保持在任何动态角度的移动坡度上。
请问有人对倾斜地面移动时如何使播放机保持在斜坡表面有了解吗?
解决方案: 根据Knight0fDragon的评论,我更改了播放器的摩擦力并关闭了角力。到目前为止,按程序生成的坡度效果很好。
circle?.physicsBody?.friction = 1.0;
circle?.physicsBody?.allowsRotation = false;