objective c - IOS SpriteKit Colision Detection: Resetting Position of an Object -
i'm working on collision detection hope when object1 moves down screen , hits object2 triggers didbegincontact method , in turn, resetposition on object1 bring object1 top of screen. i've used nslogs test make sure if program reaches didbegincontact method, , does. on top of that, program works through called upon method (resetposition) well. problem is, not change position of object1. tried see if call method resetposition in touchesbegan method, , works. object1's position reset. there limitations can in didbegincontact method? , if so, best way of trying achieve intended goal.
here sample of didbegincontact method:
-(void)didbegincontact: (skphyicscontacts *)contact { skphysicsbody *firstbody, *secondbody; if(contact.bodya.categorybitmask < contact.bodyb.categorybitmask){ firstbody = contact.bodya; secondbody = contact.bodyb; } else { firstbody = contact.bodyb; secondbody = contact.bodya; } if(firstbody.categorybitmask == category1 && secondbody.categorybitmask == category2){ nslog(@"collision detected!"); [object1 resetposition]; } to clarify confusion, category1 corresponds object1, category2 corresponds object2.
here sample of resetposition method inside of object1 class:
-(void)resetposition{ self.position = cgpointmake(0, 200); nslog(@"reached method!"); }
you should take @ run loop. nothing drawn before physics simulation done. guess changing position doing overwritten physics simulation.
this order of run loop:
- update called
- scene evaluate actions
- didevaluateactions called
- physics simulation goes here
- didsimulatephysics called
- scene applies constraints
- didapplyconstraints called
- didfinishupdate called
- rendering frame
i bet if move repositioning of node in didsimulatephysics instead of doing in didbegincontact work. guess happening because trying change node's position before simulation done. can try code (look @ didsimulatephysics part):
#import "gamescene.h" typedef enum uint_8{ colliderwall = 1, colliderplayer = 2, colliderbrick = 4 }collisioncategory; @interface object1 : skspritenode @end @implementation object1 -(instancetype)initwithcolor:(uicolor *)color size:(cgsize)size{ if(self = [super initwithcolor:color size:size]){ self.physicsbody = [skphysicsbody bodywithrectangleofsize:size]; self.physicsbody.categorybitmask = colliderplayer; self.physicsbody.contacttestbitmask = colliderbrick; self.physicsbody.collisionbitmask = colliderbrick | colliderwall; self.physicsbody.dynamic = yes; self.physicsbody.affectedbygravity = yes; self.physicsbody.allowsrotation = no; } return self; } @end @interface gamescene ()<skphysicscontactdelegate> @property (nonatomic, strong) object1 *player; @property (nonatomic, strong) skspritenode *brick; @property (nonatomic, assign) bool shouldmove; @end @implementation gamescene -(void)didmovetoview:(skview *)view { /* setup scene here */ _shouldmove = no; self.physicsbody = [skphysicsbody bodywithedgeloopfromrect:self.frame]; self.physicsbody.contacttestbitmask = 0; self.physicsbody.collisionbitmask = colliderplayer; self.physicsbody.categorybitmask = colliderwall; self.physicsworld.contactdelegate = self; _player = [[object1 alloc] initwithcolor:[skcolor greencolor] size:cgsizemake(50,30)]; _player.position = cgpointmake(cgrectgetmidx(self.frame),cgrectgetmaxy(self.frame)- _player.size.height-30); [self addchild:_player]; _brick = [skspritenode spritenodewithcolor:[skcolor greencolor] size:cgsizemake(330,80)]; _brick.physicsbody = [skphysicsbody bodywithrectangleofsize:_brick.size]; _brick.position = cgpointmake(cgrectgetmidx(self.frame),100); _brick.physicsbody.contacttestbitmask = colliderplayer; _brick.physicsbody.collisionbitmask = colliderplayer; _brick.physicsbody.categorybitmask = colliderbrick; _brick.physicsbody.affectedbygravity = no; _brick.physicsbody.dynamic = no; [self addchild:_brick]; } -(void)touchesbegan:(nsset *)touches withevent:(uievent *)event { /* called when touch begins */ (uitouch *touch in touches) { [self.player.physicsbody applyimpulse:cgvectormake(0,55)]; } } -(void)didbegincontact:(skphysicscontact *)contact{ nslog(@"contact"); self.shouldmove = yes; } -(void)didsimulatephysics{ if(self.shouldmove){ self.player.position = cgpointmake(cgrectgetmidx(self.frame),cgrectgetmaxy(self.frame)- _player.size.height-30); self.shouldmove = no; } } @end
Comments
Post a Comment