确定 SpriteNode 何时落在矩形 SpriteNode 上

Determine When SpriteNode Is Landed On A Rectangle SpriteNode

我正在制作一个有云在移动的游戏,我想要这样当角色降落在云上时云就会消失。但是,当我放置代码时,如果角色绕过它并在它仍在下落时撞到云的底部或侧面,它就会消失。这是我用于检测角色和云何时命中的代码。

有没有办法确定角色何时降落在云层之上,这样如果它在下落时从底部或侧面撞击它,云层不会消失?

这里是声明对象的代码:

    Person.physicsBody?.usesPreciseCollisionDetection = true
    Person.size = CGSizeMake(self.frame.size.width / 25, self.frame.size.height / 16.25)
    Person.physicsBody = SKPhysicsBody(rectangleOfSize: Person.size)
    Person.physicsBody?.restitution = 0
    Person.physicsBody?.friction = 0
    Person.physicsBody?.allowsRotation = false
    Person.physicsBody?.affectedByGravity = true
    Person.physicsBody?.dynamic = true
    Person.physicsBody?.linearDamping = 0
    Person.zPosition = 5
    Person.physicsBody?.categoryBitMask = BodyType.PersonCategory.rawValue
    Person.physicsBody?.contactTestBitMask = BodyType.CloudCategory.rawValue
    Person.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame) * 1.7)
    self.addChild(Person)


    Cloud = SKSpriteNode(texture: NormalCloudTexture)
    Cloud.zPosition = 7
    Cloud.physicsBody?.usesPreciseCollisionDetection = true
    Cloud.physicsBody?.affectedByGravity = false
    Cloud.physicsBody?.allowsRotation = false
    Cloud.size = CGSizeMake(self.frame.size.width / 8.05, self.frame.size.height / 40)
    Cloud.physicsBody = SKPhysicsBody(rectangleOfSize: Cloud.size)
    Cloud.physicsBody?.friction = 0
    Cloud.physicsBody?.restitution = 0
    Cloud.physicsBody?.dynamic = false
    Cloud.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame) / 7.60)
    addChild(Cloud)

这是对象命中时的代码:

func didBeginContact(contact: SKPhysicsContact)
{


    let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask

    switch(contactMask)
    {
    case BodyType.PersonCategory.rawValue | BodyType.CloudCategory.rawValue:
        JumpContact = true
        let CheckDelay = delay(0.055)
            {

                    //cloud fades away here

        }

我没有做过,但我有一个想法。 :)

我认为你应该这样做: 使用 contactPoint 属性 跟踪接触位置,然后检查它是否没有触及云的 x 位置,低于距离顶部的几个点.

希望对你有所帮助。 :)

感谢您的推荐!我决定开玩笑了,这就是你们的所作所为!

//put like a few millisecond delay here, forgot it

 if (Person.physicsBody?.velocity.dy == 0){//this means the person has stopped moving since it landed
                    //cloud fades away
                }