Detect touch inside Sprite texture, not the entire iOS Swift SpriteKit frame?

I am working with SpriteKit right now, and I ran into a problem that seems simple, but I could not find anything on the Internet. I have three buttons that take the form of parallelograms stacked on top of each other, and it looks like this: Screenshot of buttons

let button = SKSpriteNode(imageNamed: "playbutton")
let leaderButton = SKSpriteNode(imageNamed: "leaderbutton")
let homeButton = SKSpriteNode(imageNamed: "homebutton")

    button.position = CGPoint(x: size.width/2, y: size.height/2)
    addChild(button)

    leaderButton.position = CGPoint(x: size.width/2, y: size.height/2 - button.size.height/2)
    addChild(leaderButton)

    homeButton.position = CGPoint(x: size.width/2, y: size.height/2 - button.size.height)
    addChild(homeButton)

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    for touch: AnyObject in touches {

        let location = touch.locationInNode(self)

        if button.containsPoint(location) {
            button.runAction(SKAction.scaleTo(0.8, duration: 0.1))
        }
        else if leaderButton.containsPoint(location) {
            leaderButton.runAction(SKAction.scaleTo(0.8, duration: 0.1))
        }
        else if homeButton.containsPoint(location) {
            homeButton.runAction(SKAction.scaleTo(0.8, duration: 0.1))
        }
    }
}

This is how I detect touch. The problem is that they overlap because the sprite is actually a rectangle, so when I try to click on the top left of the second button, the top button detects it. I was wondering if there is a way to detect touch only in a texture, for example, how you can adjust the physical body to a texture. Thanks for any help you can give me!

Now the connection is working.

, :

    button.position = CGPoint(x: size.width/2, y: size.height/2)
    button.physicsBody = SKPhysicsBody(texture: SKTexture(imageNamed: "playbutton"), size: button.size)
    button.physicsBody?.dynamic = false
    addChild(button)

    leaderButton.position = CGPoint(x: size.width/2, y: size.height/2 - button.size.height/2)
    leaderButton.physicsBody = SKPhysicsBody(texture: SKTexture(imageNamed: "leaderbutton"), size: leaderButton.size)
    leaderButton.physicsBody?.dynamic = false
    addChild(leaderButton)

    homeButton.position = CGPoint(x: size.width/2, y: size.height/2 - button.size.height)
    homeButton.physicsBody = SKPhysicsBody(texture: SKTexture(imageNamed: "homebutton"), size: homeButton.size)
    homeButton.physicsBody?.dynamic = false
    addChild(homeButton)

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    for touch: AnyObject in touches {

        let location = touch.locationInNode(self)

        if physicsWorld.bodyAtPoint(location)?.node == button {
            button.runAction(SKAction.scaleTo(0.8, duration: 0.1))
            print("play")
        }
        if physicsWorld.bodyAtPoint(location)?.node == leaderButton {
            leaderButton.runAction(SKAction.scaleTo(0.8, duration: 0.1))
            print("leader")
        }
        if physicsWorld.bodyAtPoint(location)?.node == homeButton {
            homeButton.runAction(SKAction.scaleTo(0.8, duration: 0.1))
        }
    }
}

- , . . , .

+4
2

, , .

( , - SKSpriteNode), SKPhysicsBody(texture:size:) SKPhysicsBody(texture:alphaThreshold:size:), CGPath, , SKPhysicsBody(polygonFromPath:). physicsBody. , , , dynamic false.

physicsWorld.bodyAtPoint(_:), , ( physicsWorld SKScene). body node, node. , bodyAtPoint .

physicsWorld.enumerateBodiesAtPoint(_:usingBlock:), , .

, CGPath, , SKScene.convertPointFromView(_:), SKNode.convertPoint(_:fromNode:_) , CGPathContainsPoint (a ), , , .

+7

( imgur, , , .)

, - SKTexture, , , " ",? , - .

, - CGPoint, , .

, . "" , "" , , , :

  • , . , .

  • , , "" - "" . , .

  • . , , , , , . , - "y = mx + b" , m - , b - , , ( "" ). y /, m * ( x) + b, , .

, .

0

Source: https://habr.com/ru/post/1610687/


All Articles