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
Post a Comment