спрайт не обнаруживает столкновения - PullRequest
0 голосов
/ 12 января 2020

Я новичок в наборе спрайтов и работаю в Swift. Попытка обнаружить столкновение, когда герой сталкивается с правой стеной. Я могу обнаружить столкновение, когда герой сталкивается со всем остальным, но по какой-то причине он не обнаружит правую стену.

Снова герой обнаружит столкновение с левой стеной, но ничего не происходит с правой стеной. я в замешательстве ...

в моей игровой сцене это то, как я все настраиваю

    class GameScene: SKScene, SKPhysicsContactDelegate {

    enum contactType: UInt32 {
            case heroCategory = 1
            case fireCategory = 2
            case rightTrapCategory = 4
            case leftTrapCategory = 8
            case leftWallCategory = 16
            case rightWallCategory = 32
        }


        let leftTrap = SKSpriteNode()
        let rightTrap = SKSpriteNode()
        let fire = SKSpriteNode()
        let hero = SKSpriteNode()
        let leftWall = SKSpriteNode()
        let rightWall = SKSpriteNode()

  override func didMove(to view: SKView) {

        physicsWorld.contactDelegate = self


        addLeftWall()
        addRightWall()
        addFire()
        addHero()
        addLeftTrap()
        addrightTrap()

}

Здесь я обнаруживаю, сортирую и воздействую на эти столкновения.

func collision(between Hero: SKNode, object: SKNode) {



    switch object.name {
    case "fire":
        addHighscore()
        destroy(hero: Hero)
        gameOver()
    case "rightTrap":
        jumpCounter = 0
        hero.color = .cyan
        print("right trap")
    case "leftTrap":
        jumpCounter = 0
        hero.color = .cyan
        print("left Trap")
    case "leftWall":
        hero.color = .red
        print("left wall")
    case "rightWall":
        hero.color = .red
        print("right wall")
    default:
        print("something went wrong")
    }




}

func didBegin(_ contact: SKPhysicsContact) {
    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {

        collision(between: contact.bodyA.node!, object:contact.bodyB.node!)

    }else if contact.bodyB.categoryBitMask < contact.bodyA.categoryBitMask{

        collision(between: contact.bodyB.node!, object: contact.bodyA.node!)

    }


}

Как настроить спрайты

func addHero(){

        hero.name = "hero"
        hero.zPosition = 1
        hero.color = .cyan
        hero.size = CGSize(width: 25, height: 50)
        hero.position = CGPoint(x: frame.midX, y: (frame.midY + 100))



        hero.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: 25, height: 50))
        hero.physicsBody?.restitution = 0.1
        hero.physicsBody?.allowsRotation = false

        hero.physicsBody?.categoryBitMask = contactType.heroCategory.rawValue


        hero.physicsBody?.contactTestBitMask = contactType.fireCategory.rawValue

        hero.physicsBody?.contactTestBitMask = contactType.leftTrapCategory.rawValue
        hero.physicsBody?.contactTestBitMask = contactType.rightTrapCategory.rawValue

        hero.physicsBody?.contactTestBitMask = contactType.rightWallCategory.rawValue
        hero.physicsBody?.contactTestBitMask = contactType.leftWallCategory.rawValue


        addChild(hero)


    }


 func addRightWall(){

        rightWall.name = "rightWall"
        rightWall.color = .red
        rightWall.size = CGSize(width: 25, height: (frame.maxX / 2) + 25 )
        rightWall.position = CGPoint(x: frame.maxX, y: (frame.midX + 200))
        rightWall.anchorPoint = CGPoint(x: 1, y: 0.5)


        let centerPoint = CGPoint(x: rightWall.size.width / 2 - (rightWall.size.width * rightWall.anchorPoint.x), y: rightWall.size.height / 2 - (rightWall.size.height * rightWall.anchorPoint.y))


        rightWall.physicsBody = SKPhysicsBody(rectangleOf: rightWall.size, center: centerPoint)

        rightWall.physicsBody?.isDynamic = false
        rightWall.physicsBody?.categoryBitMask = contactType.rightWallCategory.rawValue



        addChild(rightWall)


    }

и, чтобы вы могли видеть, спрайт левой стены.

снова столкновение работает с левой стеной, но не с правой.

func addLeftWall(){

        leftWall.name = "leftWall"
        leftWall.color = .red
        leftWall.size = CGSize(width: 25, height: (frame.maxX / 2) + 25 )
        leftWall.position = CGPoint(x: frame.minX, y: (frame.midX + 200))
        leftWall.anchorPoint = CGPoint(x: 0, y: 0.5)


        let centerPoint = CGPoint(x: leftWall.size.width / 2 - (leftWall.size.width * leftWall.anchorPoint.x), y: leftWall.size.height / 2 - (leftWall.size.height * leftWall.anchorPoint.y))


        leftWall.physicsBody = SKPhysicsBody(rectangleOf: leftWall.size, center: centerPoint)




        leftWall.physicsBody?.isDynamic = false
        leftWall.physicsBody?.categoryBitMask = contactType.leftWallCategory.rawValue



        addChild(leftWall)



    }

1 Ответ

0 голосов
/ 12 января 2020

edit

Я не осознавал, что не должен был написать это как ...

hero.physicsBody? .ContactTestBitMask = contactType.fireCategory.rawValue

    hero.physicsBody?.contactTestBitMask = contactType.leftTrapCategory.rawValue
    hero.physicsBody?.contactTestBitMask = contactType.rightTrapCategory.rawValue

    hero.physicsBody?.contactTestBitMask = contactType.rightWallCategory.rawValue
    hero.physicsBody?.contactTestBitMask = contactType.leftWallCategory.rawValue

Но вместо этого необходимо отделить каждого с помощью |

hero.physicsBody?.contactTestBitMask = contactType.fireCategory.rawValue | contactType.leftTrapCategory.rawValue | contactType.rightTrapCategory.rawValue |  contactType.rightWallCategory.rawValue | contactType.leftWallCategory.rawValue
...