2017-12-22 12 views
1

プラットフォームの検出のみのためにプレーヤーの下部にヒットボックスを追加しようとしています。多くの試行錯誤の末、別の物理学者に固定された位置に子供として追加された物理学者が付いていることが分かりました。私はSKPhysicsジョイントを使う必要があります。私はこれを行い、予期せぬ結果を招いたようです。この方法でプレーヤーにヒットボックスを追加すると、プレイヤーの衝突/接触ビットマスクがわずかに変更されます。私のゲームでは固定SKPhysicsジョイントを使用してプレイヤースプライトの子としてプラットフォーム検出ヒットボックスをアタッチすると、プレーヤーの衝突および検出ビットマスクが変更されます

あなたはジャンプして画面をタップし、それはとても似ていないラグとシームレスに動作します:

Player jumping

しかし、私は共同で、このヒットボックスを追加するとき、私は私の指で画面を保持する必要が最終的にはプレーヤーがジャンプしますが、ほとんどの場合、入力は無視されます。ほとんどinput.InにこのGIFを読んで深刻な遅れのいくつかの並べ替えがありますかのように私は私の選手のジャンプと入力の多くをしようと常に画面をタップしていますが、無視またはブロックされている:

Player hitbox not behaving


この機能は私の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:これは物理学のボディなしの関節を持つお子様の動作です:

Odd behavior

+0

あなたの男が2つのphysicsBodiesを必要としている場合は、2番目のボディに子ノードを追加するだけです。あなたが必要としているもののためにジョイントが乱れているようです。 – Knight0fDragon

+0

btw、衝突前に接触が起こるので、正しく読んでいれば物理チェックをしなくても、接触点をチェックしてプラットフォームチェックを有効にするか無効にするかを決めますあなたのコリジョンマスクの上に – Knight0fDragon

+0

@ Knight0fDragonありがとうございました。物理ノードを持たない子ノードを追加するとうまく動作し、予想通りの動作をします。しかし、物理的な身体がなければ、衝突を検出することはできません。ジョイント外で子供に物理学のボディを追加するとすぐに、プレイヤーが動き回ると子どもの位置が大幅に変化します。これはバグのように思えるかもしれませんが、物理的なボディを維持しながら野生の動きを防ぐ唯一の方法はジョイントでした。 – genericguy25

答えて

1

私は解決策を見つけました。

固定されたジョイントでいくつかのバグがあるようですが、その答えは、代わりに "ピン"ジョイントを使用することでした。 This StackO questionは固定ジョイントの回転バグについて詳しく説明しています。気まぐれに、私は固定された関節をピンに変えることに決めました。そして今、子供はあなたが期待するように、ポジティブにはとにかく話します。

固定されたジョイントには、解決する必要があるいくつかのバグがあります。

+0

良い見つけて、ありがとう! – Confused

関連する問題