ios - SpriteKit & Swift, make Platforms nil if a condition is true wont work -


hi im making simple 2d sidescroller game in spritekit swift , im facing problem cant solve. have function called (createplatforms) spawn platforms (each 1 above other) , platforms going form right left. added bool variable called isjumping, want if variable isjumping true platforms physicsbody's gets nil player can jump above , land on it. kinda managed that. works on first platform not on others. player jumps above first platform , lands on cant jump above second or third platform. 10% of time works on platforms , can jump above , land on them of time doesnt work.

thank in advance.

my jump method:

func jump() {      isjumping = true      let jumpblock = skaction.runblock({         () in         self.dragon.physicsbody?.velocity = cgvectormake(0, 0)         self.dragon.physicsbody?.applyimpulse(cgvectormake(0, 140))  // jump impulse     })      self.runaction(jumpblock)      runafterdelay(0.3) { /* 0.3 seconds */          self.isjumping = false      } }  //delay function  func runafterdelay(delay: nstimeinterval, block: dispatch_block_t) {     let time = dispatch_time(dispatch_time_now, int64(delay * double(nsec_per_sec)))     dispatch_after(time, dispatch_get_main_queue(), block) } 

}

method spawning platforms:

 func createplatforms() {      platform1 = skspritenode(imagenamed:"platform")     platform2 = skspritenode(imagenamed:"platform")     platform3 = skspritenode(imagenamed:"platform-small")      platform1.size = cgsize(width: frame.width / 3, height: frame.height / 25)     platform2.size = cgsize(width: frame.width / 3, height: frame.height / 25)     platform3.size = cgsize(width: frame.width / 6, height: frame.height / 25)     platform1.position = cgpoint(x: self.frame.width + 330, y: self.frame.height - 285)     platform2.position = cgpoint(x: self.frame.width + 500, y: self.frame.height - 210)     platform3.position = cgpoint(x: self.frame.width + 570, y: self.frame.height - 135)      platform1.physicsbody = skphysicsbody(rectangleofsize: platform1.size)     platform1.zposition = 6     platform1.physicsbody?.categorybitmask = physicscatagory.platform1     platform1.physicsbody?.contacttestbitmask = physicscatagory.dragon     platform1.physicsbody?.collisionbitmask = physicscatagory.dragon     platform1.physicsbody?.dynamic = false      platform2.physicsbody = skphysicsbody(rectangleofsize: platform2.size)     platform2.zposition = 7     platform2.physicsbody?.categorybitmask = physicscatagory.platform2     platform2.physicsbody?.contacttestbitmask = physicscatagory.dragon     platform2.physicsbody?.collisionbitmask = physicscatagory.dragon     platform2.physicsbody?.dynamic = false      platform3.physicsbody = skphysicsbody(rectangleofsize: platform3.size)     platform3.zposition = 8     platform3.physicsbody?.categorybitmask = physicscatagory.platform3     platform3.physicsbody?.contacttestbitmask = physicscatagory.dragon     platform3.physicsbody?.collisionbitmask = physicscatagory.dragon     platform3.physicsbody?.dynamic = false      platform1.runaction(moveandremove)     platform2.runaction(moveandremove)     platform3.runaction(moveandremove)      self.addchild(platform1)     self.addchild(platform2)     self.addchild(platform3)      let distance = cgfloat(self.frame.width + 1000)     let movegroundobjects = skaction.movebyx(-distance * 1.3, y: 0, duration: nstimeinterval(0.011 * distance))     let removegroundobjects = skaction.removefromparent()     moveandremove = skaction.sequence([movegroundobjects, removegroundobjects])       runafterdelay(7) {         self.createplatforms()     } } 

method make platforms's physicbody's nil:

func makeplatformsnil() {      if isjumping == true {          platform1.physicsbody = nil         platform2.physicsbody = nil         platform3.physicsbody = nil      }  else if isjumping == false {          platform1.physicsbody = skphysicsbody(rectangleofsize:  platform1.size)         platform1.physicsbody?.categorybitmask = physicscatagory.platform1         platform1.physicsbody?.collisionbitmask = physicscatagory.dragon         platform1.physicsbody?.contacttestbitmask = physicscatagory.dragon         platform1.physicsbody?.dynamic = false         platform1.physicsbody?.allowsrotation = false          platform2.physicsbody = skphysicsbody(rectangleofsize: platform2.size)         platform2.physicsbody?.categorybitmask = physicscatagory.platform2         platform2.physicsbody?.collisionbitmask = physicscatagory.dragon         platform2.physicsbody?.contacttestbitmask = physicscatagory.dragon         platform2.physicsbody?.dynamic = false         platform2.physicsbody?.affectedbygravity = false          platform3.physicsbody = skphysicsbody(rectangleofsize: platform3.size)         platform3.physicsbody?.categorybitmask = physicscatagory.platform3         platform3.physicsbody?.collisionbitmask = physicscatagory.dragon         platform3.physicsbody?.contacttestbitmask = physicscatagory.dragon         platform3.physicsbody?.dynamic = false         platform3.physicsbody?.affectedbygravity = false     } } 

please can me? im stuck since 3 weaks , im frustrated right :-/ im sure problem can solved more experience coding me

here lot less code, cleaner , easier manage. (all platforms should share same category, , dragon category needs less platform)

note: not tested validation on xcode

func didbegincontact(contact: skphysicscontact) {     let (firstbody,secondbody) = (contact.bodya.categorybitmask <= contact.bodyb.categorybitmask) ? (contact.bodya,contact.bodyb) : (contact.bodyb,contact.bodya)       // check if on platform      if (firstbody.categorybitmask == physicscatagory.dragon && secondbody.categorybitmask == physicscatagory.platform)  {          if firstbody.velocity.dy < -0.0 {              secondbody.collisionbitmask |= physicscatagory.dragon         }      }    }  func didendcontact(contact: skphysicscontact) {     let (firstbody,secondbody) = (contact.bodya.categorybitmask <= contact.bodyb.categorybitmask) ? (contact.bodya,contact.bodyb) : (contact.bodyb,contact.bodya)       // check if on platform      if (firstbody.categorybitmask == physicscatagory.dragon && secondbody.categorybitmask == physicscatagory.platform)  {         //no matter way dragon moving, if off platform,  let's turn off collision              secondbody.collisionbitmask &= ~(physicscatagory.dragon)       }  } 

Comments