私はかなり単純なゲームを持っています。それはaccelereometerを使用する古典的なLabyrinthゲームのようですが、ユーザーは3D Touchを使用して矩形のサイズを変更することもできます。SKSpriteNodeの位置を変更しているときにSKPhysicsBodyを変更する
プレイヤーのノードは、加速度計(ここでは何も特別な)からデータを取得し、世界の物理学のおかげで移動し、長方形である:
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)
を追加しましたが、今度は画面を押すとプレーヤーのノードのサイズが変更されますが、移動も停止します。ノードのサイズと物理を同時に変更して動かす方法
downvoteは解決策を示す必要があります(実際の物理量は実際の伝播時間であり、偽装されたものではありません)。OPを助けるために私の声明について反対の考え方を説明しようとします。 –
凍結時間とはどういう意味ですか?私はサイズを変更したいときに私は動きを止めるべきです、そして、サイズが大丈夫の後で、ボールの動きを続けますか? – codddeer123
これは唯一のアイデアですが、他のモードもあります。「Matrix」ムービーシーンのようなエフェクトを作成することができます(この状態の音楽の速度とゲーム要素のすべての動きを減らします)。 –