2017-02-24 48 views
3

我已经很简单的游戏。这就像使用加速计的经典迷宫游戏,但用户也可以使用3D Touch来改变矩形的大小。改变SKPhysicsBody,同时改变SKSpriteNode的位置

玩家的节点是矩形,其移动得益于世界物理学从加速计(在这里没有什么特别的)获取数据:

motionManager.startAccelerometerUpdates(to: OperationQueue.current!) { (data, error) in 
    if let motionData = data{ 
     self.physicsWorld.gravity = CGVector(dx: motionData.acceleration.x * 7, dy: motionData.acceleration.y * 7) 
    } 
} 

和touchesMoved:

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
    if let touch = touches.first{ 
      let maxForce = touch.maximumPossibleForce 
      let force = touch.force 

      let forceValue = force/maxForce 

      player.size = CGSize(width: 26-forceValue*16, height: 26-forceValue*16) 
      player.physicsBody = SKPhysicsBody(rectangleOf: player.size) 
    } 
} 

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 
    resetSize() 
} 

func resetSize(){ 
    player.size = CGSize(width: 26, height: 26) 
} 

所以,当我正在改变玩家的大小工作得很好:节点正在屏幕上移动,基于设备的方向,同时越来越紧,越来越小。问题是physicsBody(我在GameViewController.swift中设置了view.showsPhysics = true)始终是相同的,所以我添加了player.physicsBody = SKPhysicsBody(rectangleOf: player.size),但现在当我按下屏幕时,播放器的节点调整大小,但它也停止移动。如何同时更改节点的大小和物理体积并保持运动?

回答

1

当您更改physicsBody你失去了invoved所有物理参数你以前physicsBody:您可以复制velocityangularVelocity或其他可用参数,但是这还不够,你将永远不会有连续性,因为SpriteKit框架(实际版本)没有这个选项:在游戏中动态更改physicsBody

你也可以改变你的缩放节点修改physicsBody,但你永远失去了物理变量,例如累积的速度由于重力:发生这种情况是因为SpriteKit变化自动缩放创建其他机构在physicsBody没有保留累积的属性。

所以我的建议是要创造一种“冻结时间”,当你触摸你的球,其中当球被拦你可以改变你physicsBody的。

+4

人谁downvote应该表现出一个解决方案(但真正的物理瓦尔时间真正的传播,而不是伪造..),并试图解释我的陈述,以帮助他们的OP相反的想法。 –

+0

冻结时间是什么意思?当我想要改变尺寸时,我应该停止运动吗?尺寸没问题后继续运动球吗? – codddeer123

+0

这只是一个想法,但你可以找到其他模式:你可以创造类似于它周围的“矩阵”电影场景的效果(降低音乐速度和游戏元素的所有动作只有在这种状态..) –