0

SKPhysicsContactDelegate 衝突検出で発生している問題を修正しようとしています。ノードAとノードBの2つのノードがあり、ノードAは画面上で静止していますが、ノードBはユーザーの指で画面上をドラッグできます。nodeA は、nodeB がオーバーラップしているかどうかを検出できる必要があります。didBeginContact メソッドと didEndContact メソッドが複数回呼び出されていますが、これは調査の結果、予想される動作であることがわかりました。この問題を回避するには、整数変数を 0 に設定し、連絡先があるたびに増分し、連絡先が終了するたびに減分します。値が 0 より大きい場合、2 つのノードはオーバーラップしており、値が 0 に等しい場合はオーバーラップしていません。これは、ユーザーが nodeB を nodeA にドラッグする速度が速すぎるまで問題なく動作します。これが発生すると、連絡方法が常に正しい回数呼び出されるとは限りません。たとえば、3 つの接触が検出されても、端部接触が 2 つしか検出されない (またはまったく存在しない) 場合があります。この場合、プログラムは、2 つの節点が重なり合っていなくても重なり合っていると見なします。プログラムが更新できるよりも速くユーザーがノードをドラッグしているため、これが発生していると想定しています。これを回避するためにできることはありますか? 基本的に、2 つのノードがいつ重なって、いつ重ならないかを正確に知る必要があるだけです。また、ノードが凸形状であることにも注意してください。以下は私の連絡方法です:プログラムが更新できるよりも速くユーザーがノードをドラッグしているため、これが発生していると想定しています。これを回避するためにできることはありますか? 基本的に、2 つのノードがいつ重なって、いつ重ならないかを正確に知る必要があるだけです。また、ノードが凸形状であることにも注意してください。以下は私の連絡方法です:プログラムが更新できるよりも速くユーザーがノードをドラッグしているため、これが発生していると想定しています。これを回避するためにできることはありますか? 基本的に、2 つのノードがいつ重なって、いつ重ならないかを正確に知る必要があるだけです。また、ノードが凸形状であることにも注意してください。以下は私の連絡方法です:

func didBeginContact(contact: SKPhysicsContact)
{
    let contactMask = contact.bodyA.categoryBitMask + contact.bodyB.categoryBitMask

    if contactMask == 3
    {
        startContact++
        timerStart = true
    }
}

func didEndContact(contact: SKPhysicsContact)
{
    let contactMask = contact.bodyA.categoryBitMask + contact.bodyB.categoryBitMask

    if contactMask == 3
    {
        startContact--
        if startContact == 0
        {
            timerStart = false
        }
    }
} 
4

1 に答える 1

1

intersectsNode:メソッドを使用して、1 つのノードが他のノードと交差しているかどうかを確認できます。このメソッドに関するドキュメントから:

このノードが指定されたノードと交差するかどうかを示すブール値を返します。

また、留意すべき重要な部分は次のとおりです。

フレームが交差する場合、2 つのノードは交差すると見なされます。このテストでは、両方のノードの子は無視されます。

import SpriteKit

class GameScene: SKScene {


    var stationaryNode :SKSpriteNode = SKSpriteNode(color: SKColor.grayColor(), size: CGSize(width: 100, height: 100))

    var moveableNode   :SKSpriteNode = SKSpriteNode(color: SKColor.purpleColor(), size: CGSize(width: 100, height: 100))

    let debugLabel     :SKLabelNode  = SKLabelNode(fontNamed: "ArialMT")

    override func didMoveToView(view: SKView) {


        setupScene()

    }

    func setupScene(){

        stationaryNode.name = "stationaryNode"
        stationaryNode.zRotation = 0.2
        stationaryNode.zPosition = 1
        stationaryNode.position = CGPoint(x: CGRectGetMidX(frame), y: CGRectGetMidY(frame))
        addChild(stationaryNode)

        moveableNode.name = "moveableNode"
        moveableNode.zRotation = 0.4
        moveableNode.zPosition = 2
        moveableNode.position = CGPoint(x: CGRectGetMidX(frame), y: CGRectGetMidY(frame)-200)
        addChild(moveableNode)

        debugLabel.fontSize = 18
        debugLabel.fontColor = SKColor.yellowColor()
        debugLabel.position = CGPoint(x: CGRectGetMidX(frame), y: CGRectGetMidY(frame)+200)
        addChild(debugLabel)
        updateDebugLabel()


    }

    func updateDebugLabel(){

        let intersectionDetected:String = stationaryNode.intersectsNode(moveableNode) ? "YES" : "NO"

        debugLabel.text = "Overlapping : " + intersectionDetected

    }

    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {


        for touch in touches {

            let location = touch.locationInNode(self)

            let previousPosition = touch.previousLocationInNode(self)

            let node: SKNode? = nodeAtPoint(location)

            if let nodeName = node?.name{

                if nodeName == "moveableNode" {

                    let translation = CGPoint(x: location.x - previousPosition.x , y: location.y - previousPosition.y )

                    node!.position = CGPoint(x: node!.position.x + translation.x, y: node!.position.y + translation.y)

                }
            }

        }
    }

    override func update(currentTime: CFTimeInterval) {
        /* Called before each frame is rendered */


        updateDebugLabel()

    }
}

このソリューションは、高速で移動するオブジェクトの接触を検出するために物理エンジンを使用する場合よりも少しうまく機能すると思います。それでも、オブジェクトを非常に速く動かすと、予測できない結果になる可能性があります。

于 2015-12-14T00:06:13.450 に答える