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

Popular posts from this blog

node.js - Using Node without global install -

How to access a php class file from PHPFox framework into javascript code written in simple HTML file? -

java - Null response to php query in android, even though php works properly -