プラットフォームの検出のみのためにプレーヤーの下部にヒットボックスを追加しようとしています。多くの試行錯誤の末、別の物理学者に固定された位置に子供として追加された物理学者が付いていることが分かりました。私はSKPhysicsジョイントを使う必要があります。私はこれを行い、予期せぬ結果を招いたようです。この方法でプレーヤーにヒットボックスを追加すると、プレイヤーの衝突/接触ビットマスクがわずかに変更されます。私のゲームでは固定SKPhysicsジョイントを使用してプレイヤースプライトの子としてプラットフォーム検出ヒットボックスをアタッチすると、プレーヤーの衝突および検出ビットマスクが変更されます
あなたはジャンプして画面をタップし、それはとても似ていないラグとシームレスに動作します:
しかし、私は共同で、このヒットボックスを追加するとき、私は私の指で画面を保持する必要が最終的にはプレーヤーがジャンプしますが、ほとんどの場合、入力は無視されます。ほとんどinput.InにこのGIFを読んで深刻な遅れのいくつかの並べ替えがありますかのように私は私の選手のジャンプと入力の多くをしようと常に画面をタップしていますが、無視またはブロックされている:
この機能は私のgamescene.swiftでプレイヤーをセットアップし、シーンに固定SKPhysicsJoint経由でプレーヤーにヒットボックスを追加します。
func playerSetup(){
//setups player
addChild(player)
player.addChild(playerPlatformHitbox)
let myCGPoint = player.position // sets joint position
let myJoint = SKPhysicsJointFixed.joint(withBodyA: playerPlatformHitbox.physicsBody!, bodyB: player.physicsBody!, anchor: myCGPoint)
scene?.physicsWorld.add(myJoint)
}
を、これは私だけのためのプラットフォームを検出するために作られたヒットボックスクラスですプレーヤー。あなたはそれがビットマスクからのプラットフォームを期待するすべてを無視すべきであることがわかります。
import Foundation
import SpriteKit
class PlayerPlatformHitbox: SKSpriteNode{
init() {
super.init(texture: nil, color: SKColor.blue, size: CGSize(width: playerTexture.size().width, height: 10))
physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: self.size.width, height: self.size.height))
position = CGPoint(x:0, y: (-playerTexture.size().height * 0.6))
physicsBody?.categoryBitMask = CollisionTypes.jumpHitBox.rawValue
physicsBody?.contactTestBitMask = CollisionTypes.platform.rawValue
physicsBody?.collisionBitMask = CollisionTypes.platform.rawValue
physicsBody?.restitution = 0.0
physicsBody?.friction = 0.0
zPosition = 20
physicsBody?.linearDamping = 0.0
physicsBody?.angularDamping = 0.0
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)}
}
そして、これが私のプレイヤークラス
class Player: SKSpriteNode {
init() {
super.init(texture: nil, color: SKColor.clear, size: playerTexture.size())
//starts accelerameter
motionManager = CMMotionManager()
motionManager.startAccelerometerUpdates()
physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: playerTexture.size().width,
height: playerTexture.size().height))
physicsBody?.categoryBitMask = CollisionTypes.player.rawValue
physicsBody?.contactTestBitMask = CollisionTypes.memoryModule.rawValue | CollisionTypes.spikes.rawValue | CollisionTypes.finish.rawValue | CollisionTypes.enemy.rawValue | CollisionTypes.ground.rawValue
physicsBody?.collisionBitMask = CollisionTypes.ground.rawValue | CollisionTypes.sceneEdge.rawValue
physicsBody?.affectedByGravity = true
physicsBody?.restitution = 0.0
physicsBody?.friction = 0.3
physicsBody?.isDynamic = true
//physicsBody?.friction = 0.0
physicsBody?.allowsRotation = false
setScale(0.65)
zPosition = 1
physicsBody?.linearDamping = 0.0
physicsBody?.angularDamping = 0.0
animateWalk()
}
です:いくつかの理由、このヒットボックスとプレイヤーが触れるアレントにもかかわらず、プレイヤーはそれのビットマスクとの接触を受け入れるようにできていませんこのすべての目標は、私のアップデート方法にあるこの機能のプレーヤーの代わりにヒットボックスを使用することです:
私はこれを行う必要がある唯一の理由は、プレーヤーが落ちているときに、彼が落ちてプラットホームの側面に当たったときに、衝突が戻ってプレイヤーの物理学者が正方形であるため停止してスライドするからです。
私はプラットフォーム検出ヒットボックスを使用して、プレーヤーが大型のヒットボックスではなくプラットフォームを検出できる場合は、この問題を解決します。
ありがとうございました。
EDIT:これは物理学のボディなしの関節を持つお子様の動作です:
あなたの男が2つのphysicsBodiesを必要としている場合は、2番目のボディに子ノードを追加するだけです。あなたが必要としているもののためにジョイントが乱れているようです。 – Knight0fDragon
btw、衝突前に接触が起こるので、正しく読んでいれば物理チェックをしなくても、接触点をチェックしてプラットフォームチェックを有効にするか無効にするかを決めますあなたのコリジョンマスクの上に – Knight0fDragon
@ Knight0fDragonありがとうございました。物理ノードを持たない子ノードを追加するとうまく動作し、予想通りの動作をします。しかし、物理的な身体がなければ、衝突を検出することはできません。ジョイント外で子供に物理学のボディを追加するとすぐに、プレイヤーが動き回ると子どもの位置が大幅に変化します。これはバグのように思えるかもしれませんが、物理的なボディを維持しながら野生の動きを防ぐ唯一の方法はジョイントでした。 – genericguy25