По какой-то причине в коде ниже вражеские бактерии перемещают пищу (горох), когда они касаются друг друга. Я не закодировал их, чтобы проверить контакт друг с другом. Любая помощь? Я пытаюсь сделать невозможным столкновение двух типов спрайтов.

import SpriteKit
var apple=SKSpriteNode()

class GameScene: SKScene, SKPhysicsContactDelegate {
    var bg=SKSpriteNode()
    var peas=SKSpriteNode()
    var bacteria=SKSpriteNode()
    var bactys_Y=[SKSpriteNode]()
    var bactys_X=[SKSpriteNode]()
    var border=CGRect()
   // var gandolf=SKSpriteNode()
    enum ColliderType:UInt32{
        case Bug=1
        case Food=2
        case Enemy=4
        case Gandolf=8
    }

    override func didMoveToView(view: SKView) {
        border=CGRect(x: 0, y: self.frame.height, width: self.frame.width, height: self.frame.height-200)
        //gandolf.physicsBody=SKPhysicsBody(edgeLoopFromRect: border)
        let bactPic=SKTexture(imageNamed: "bacteria.png")
        /* Setup your scene here */
        //bg info
        self.physicsWorld.contactDelegate=self
        let bg_texture=SKTexture(imageNamed: "wood-texture-pattern.jpg")
        bg=SKSpriteNode(texture: bg_texture)
        bg.position=CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame))
        bg.size.height=self.frame.height
        bg.size.width=self.frame.width
       // self.addChild(bg)
        //bug info
        let applePic=SKTexture(imageNamed:"bug.png")
        apple=SKSpriteNode(texture:applePic)
        apple.position=CGPointMake(CGRectGetMidX(self.frame),CGRectGetMidY(self.frame))

        print(self.frame.width)
       // let bactPic=SKTexture(imageNamed: "bacteria.png")
        //peas info
        let peas_texture=SKTexture(imageNamed: "peas.png")
        peas=SKSpriteNode(texture: peas_texture)
       // peas.position=CGPointMake(200,300)
        peas.physicsBody=SKPhysicsBody(circleOfRadius: peas_texture.size().width/4)
        apple.physicsBody=SKPhysicsBody(circleOfRadius:applePic.size().width/2)
        peas.physicsBody?.affectedByGravity=false
        apple.physicsBody?.affectedByGravity=false
        bg.zPosition=1
        apple.zPosition=2
        peas.zPosition=3
        apple.physicsBody!.categoryBitMask=ColliderType.Bug.rawValue
        apple.physicsBody!.contactTestBitMask=ColliderType.Food.rawValue
        peas.physicsBody!.categoryBitMask=ColliderType.Food.rawValue
        peas.physicsBody!.contactTestBitMask=ColliderType.Bug.rawValue
        bacteria.physicsBody=SKPhysicsBody(circleOfRadius: bactPic.size().width*0.06/2)
        bacteria.physicsBody!.categoryBitMask=ColliderType.Enemy.rawValue
        bacteria.physicsBody!.contactTestBitMask=ColliderType.Bug.rawValue
     //   gandolf.physicsBody?.categoryBitMask=ColliderType.Gandolf.rawValue
    //    gandolf.physicsBody?.categoryBitMask=ColliderType.Enemy.rawValue
        peas.setScale(0.4)
        apple.setScale(0.5)
        // bacteria info
      //  gandolf.color=UIColor.blackColor()
      //  self.addChild(gandolf)


        self.addChild(apple)
      //  self.addChild(peas)
        _=NSTimer.scheduledTimerWithTimeInterval(10, target: self, selector: Selector("spawnBacteria"), userInfo: nil, repeats: true)
        spawnBacteria()
        spawnFood()


    }
    func didBeginContact(contact: SKPhysicsContact) {
      //  peas.removeFromParent()
      //  spawnFood()
        let first=contact.bodyA
        let second=contact.bodyB
        if first.categoryBitMask==ColliderType.Bug.rawValue || second.categoryBitMask==ColliderType.Bug.rawValue{
            if first.categoryBitMask==ColliderType.Food.rawValue || second.categoryBitMask==ColliderType.Food.rawValue{
                peas.removeFromParent()
                spawnFood()
            }
        }
        if first.categoryBitMask==ColliderType.Bug.rawValue || second.categoryBitMask==ColliderType.Bug.rawValue{
            if first.categoryBitMask==ColliderType.Enemy.rawValue || second.categoryBitMask==ColliderType.Enemy.rawValue{
                print("DEATH")
            }
        }

    }
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
       /* Called when a touch begins */


    }

    override func update(currentTime: CFTimeInterval) {
        /* Called before each frame is rendered */
       // print("x: "+String(apple.position.x))
       // print("y: "+String(apple.position.y))
        for node:SKSpriteNode in bactys_X{
            if node.position.x<=0{
                print("collide")
                node.physicsBody?.velocity=CGVector(dx:0, dy:0)
                node.physicsBody?.applyImpulse(CGVector(dx:6, dy:0))
            }else if node.position.x>=self.frame.size.width-3{
                node.physicsBody?.velocity=CGVector(dx:0,dy:0)
                node.physicsBody?.applyImpulse(CGVector(dx:-6,dy:0))
            }
        }
        for node:SKSpriteNode in bactys_Y{
            if node.position.y>=self.frame.size.height-3{
                node.physicsBody?.velocity=CGVector(dx:0,dy:0)
                node.physicsBody?.applyImpulse(CGVector(dx:0,dy:-6))
            }else if node.position.y<=200{
                node.physicsBody?.velocity=CGVector(dx:0,dy:0)
                node.physicsBody?.applyImpulse(CGVector(dx:0,dy:6))
            }
        }
    }
    func spawnFood(){
        let peas_texture=SKTexture(imageNamed: "peas.png")
        peas=SKSpriteNode(texture: peas_texture)
        peas.physicsBody=SKPhysicsBody(circleOfRadius: peas_texture.size().width/4)
        peas.zPosition=3
        peas.physicsBody?.affectedByGravity=false
        peas.physicsBody?.categoryBitMask=ColliderType.Food.rawValue
        peas.physicsBody?.contactTestBitMask=ColliderType.Bug.rawValue
        let x=CGFloat(arc4random_uniform(UInt32(self.frame.size.width-40)+20))
        let y=CGFloat(arc4random_uniform(UInt32(self.frame.size.height-20-200))+200)
        //print(self.frame.size.width)
        print("height: "+String(self.frame.size.height))
        print("x: "+String(x))
        print("y: "+String(y))
        peas.position=CGPointMake(x,y)
        peas.setScale(0.4)
        self.addChild(peas)
    }
    func spawnBacteria(){
        let bactPic=SKTexture(imageNamed: "bacteria.png")
        bacteria=SKSpriteNode(texture: bactPic)
        bacteria.physicsBody=SKPhysicsBody(circleOfRadius: bactPic.size().width*0.06/2)
        bacteria.physicsBody?.affectedByGravity=false
        bacteria.physicsBody?.categoryBitMask=ColliderType.Enemy.rawValue
        bacteria.physicsBody?.contactTestBitMask=ColliderType.Bug.rawValue
       // bacteria.physicsBody?.contactTestBitMask=ColliderType.Gandolf.rawValue
        bacteria.zPosition=4
        let x=CGFloat(arc4random_uniform(UInt32(self.frame.size.width-40)+20))
        let y=CGFloat(arc4random_uniform(UInt32(self.frame.size.height-20-200))+200)
        bacteria.position=CGPointMake(x,y)
        bacteria.setScale(0.06)
        let decide=Int(arc4random_uniform(3))

        self.addChild(bacteria)
        if decide==0{
            //move left
           //  let move=SKAction.moveByX(-6, y: 0, duration: 0.1)
            // let start=SKAction.repeatActionForever(move)
             //bacteria.runAction(start)
            bacteria.physicsBody?.applyImpulse(CGVector(dx: -6,dy: 0))
            bactys_X.append(bacteria)

        }else if decide==1{
            //move right
          //  let move=SKAction.moveByX(6, y: 0, duration: 0.1)
            // let start=SKAction.repeatActionForever(move)
            // bacteria.runAction(start)
            bacteria.physicsBody?.applyImpulse(CGVector(dx: 6, dy: 0))
            bactys_X.append(bacteria)
        }else if decide==2{
            //move up
          //  let move=SKAction.moveByX(0, y: 6, duration: 0.1)
            // let start=SKAction.repeatActionForever(move)
            //  bacteria.runAction(start)
            bacteria.physicsBody?.applyImpulse(CGVector(dx: 0, dy: 6))
            bactys_Y.append(bacteria)
        }else{
            //move down
           //  let move=SKAction.moveByX(0, y: -6, duration: 0.1)
            // let start=SKAction.repeatActionForever(move)
          //  bacteria.runAction(start)
            bacteria.physicsBody?.applyImpulse(CGVector(dx: 0,dy: -6))
            bactys_Y.append(bacteria)
        }


    }
}
0
Rohan Singh 26 Фев 2016 в 02:09

1 ответ

Лучший ответ

По умолчанию битовая маска столкновения физического тела установлена ​​на 0xFFFFFFFF (взаимодействовать со всеми объектами), а его динамическое свойство установлено на true. Глядя на ваш код, кажется, что вы не установили их, поэтому он использует значения по умолчанию.

Вам нужно будет установить эти свойства, чтобы достичь желаемого результата.

...physicsBody.dynamic = false
...physicsBody.collisionBitMask = //set to something
0
crashoverride777 26 Фев 2016 в 05:30
С удовольствием, удачного кодирования
 – 
crashoverride777
27 Фев 2016 в 04:19