ios - Node with Two Physics Bodies -
i know question has been "asked" here not helpful, nor did cover asking.
that being said, want know how achieve following:
- i need
nodehas 2 physics bodies: 1) smaller body (200x200) represents node's frame, , 2) larger body (500x500) represents outer perimeter of area act "detection" boundary. outer body not physically impact colliding objects, needs register object has encountered boundary line. below simple idea of describing:
my initial approach use skphysicsbody bodywithbodies:<nsarray> have created overlap body smaller rect.
so figured have create skspritenode smaller body (the black square), , skspritenode larger body (the blue square), , add child smaller square (or vice versa).
my problem can't seem outer boundary allow object pass through while registering interaction. closest have come getting movable node hit boundary, continually pushed , forth along line of 500x500 boundary long attempt pass through boundary. have been able make moving node unable pass through 500x500, quite opposite of need.
here code using, perhaps can see doing wrong:
/// testing // detection body - 500x500 skspritenode *dbody = [skspritenode spritenodewithimagenamed:@"object500"]; dbody.position = cgpointmake(500, 100); dbody.physicsbody = [skphysicsbody bodywithedgeloopfromrect:dbody.frame]; dbody.physicsbody.categorybitmask = detection; dbody.physicsbody.collisionbitmask = 0; dbody.physicsbody.contacttestbitmask = player; // node body - 200x200 skspritenode *testboundary = [skspritenode spritenodewithimagenamed:@"object"]; testboundary.physicsbody = [skphysicsbody bodywithedgeloopfromrect:testboundary.frame]; testboundary.physicsbody.categorybitmask = object; testboundary.physicsbody.contacttestbitmask = player; testboundary.position = dbody.position; // add boundary child main node [testboundary addchild:dbody]; // add scene [chapterscene addchild:dbody]; all of inside levelscene.m, skscene set <skphysicscontactdelegate> in header. also, have defined chapterscene such:
// set main chapter scene self.anchorpoint = cgpointmake(0.5, 0.5); //0,0 1,1 chapterscene = [sknode node]; [self addchild:chapterscene]; , chapterscene defined @ top of levelscene.
@interface levelscene () { #pragma 1 scene objects sknode *chapterscene; } if can me figure out doing wrong, or perhaps alternative approach give me looking appreciate it.
note: backup solution seemingly expensive in terms of cpu , memory, believe work nonetheless. have bool isdetected represent if moving player node within 500x500 area, in update monitor distance smaller 200x200 rect boundary of center of 500x500 node. rather use 2 skphysicsbody's sure can done , easier implement.
update: here moving character (a separate sknode class called character.m)
- (void)createcharacterwithname:(nsstring *)charname { character = [skspritenode spritenodewithimagenamed:charname]; [self addchild:character]; self.physicsbody = [skphysicsbody bodywithcircleofradius:character.frame.size.width/2.0]; self.physicsbody.dynamic = yes; self.physicsbody.allowsrotation = yes; // define physics body relationships self.physicsbody.categorybitmask = player; self.physicsbody.collisionbitmask = player; self.physicsbody.contacttestbitmask = detection; } here image of simulator (it little different, in terms of sizes, description. description ease of understanding not exact scaling of nodes) 
this working me. sorry didnt write on obj c. lot faster me in swift
import spritekit let categoryouter:uint32 = 1 << 0 let categoryinner:uint32 = 1 << 1 let categorytester:uint32 = 1 << 2 class gamescene: skscene, skphysicscontactdelegate { let outersprite = skspritenode(color: skcolor.redcolor(), size: cgsizemake(100, 100)) let innersprite = skspritenode(color: skcolor.bluecolor(), size: cgsizemake(40, 40)) let tester = skspritenode(color: skcolor.greencolor(), size: cgsizemake(10, 10)) override init(size: cgsize) { super.init(size: size) physicsworld.contactdelegate = self physicsworld.gravity = cgvectormake(0, 0) outersprite.position = cgpointmake(size.width/2, size.height/2) outersprite.physicsbody = skphysicsbody(rectangleofsize: outersprite.size) outersprite.physicsbody!.dynamic = false outersprite.physicsbody!.categorybitmask = categoryouter outersprite.physicsbody!.collisionbitmask = 0 outersprite.physicsbody!.contacttestbitmask = categorytester innersprite.physicsbody = skphysicsbody(rectangleofsize: innersprite.size) innersprite.physicsbody!.dynamic = false innersprite.physicsbody!.categorybitmask = categoryinner innersprite.physicsbody!.collisionbitmask = categorytester innersprite.physicsbody!.contacttestbitmask = categorytester outersprite.addchild(innersprite) addchild(outersprite) tester.physicsbody = skphysicsbody(rectangleofsize: tester.size) tester.physicsbody!.categorybitmask = categorytester tester.physicsbody!.collisionbitmask = categoryinner addchild(tester) } func didbegincontact(contact: skphysicscontact) { let collision:uint32 = (contact.bodya.categorybitmask | contact.bodyb.categorybitmask) if collision == (categoryouter | categorytester) { print("outer collision") } else if collision == (categoryinner | categorytester) { print("inner collision") } } override func touchesmoved(touches: set<uitouch>, withevent event: uievent?) { if let touch = touches.first { let location = touch.locationinnode(self) tester.position = location } } required init?(coder adecoder: nscoder) { fatalerror("init(coder:) has not been implemented") } } 
Comments
Post a Comment