Also für die App, an der ich arbeite, habe ich zwei Würfel kollidieren. Ich überprüfe das auf die übliche Weise. Die App sagt mir, wenn sie in meiner "didBeginContact" -Methode kollidieren.SpriteKit - Bestimme Seite A Quadrat Zusammengefasst mit
-(void)didBeginContact:(SKPhysicsContact *)contact {
if (contact.bodyA.categoryBitMask == WALL_CATEGORY && contact.bodyB.categoryBitMask == CHARACTER_CATEGORY) {
CGPoint point = contact.contactPoint;
}
}
So weiß ich, wo die Kollision stattfindet, sondern weil es zwei Quadrate ist, kann es an der Seite, einschließlich der Ecken an jedem Punkt sein. Also wie würde ich prüfen, ob die Kollision ausschließlich links/rechts/oben/unten stattfindet?
Bearbeiten: Richtige Antwort: Vielleicht nicht der sauberste Weg, es zu tun, aber es funktioniert. Hoffentlich hilft es jemandem in der Zukunft.
m_lNode = [SKNode node];
m_lNode.position = CGPointMake(-(CHARACTER_SIZE/2), 0);
m_lNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(1, m_character.size.height)];
m_lNode.physicsBody.allowsRotation = NO;
m_lNode.physicsBody.usesPreciseCollisionDetection = YES;
m_lNode.physicsBody.categoryBitMask = CHARACTER_L_CATEGORY;
m_rNode = [SKNode node];
m_rNode.position = CGPointMake((CHARACTER_SIZE/2), 0);
m_rNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(1, m_character.size.height)];
m_rNode.physicsBody.allowsRotation = NO;
m_rNode.physicsBody.usesPreciseCollisionDetection = YES;
m_rNode.physicsBody.categoryBitMask = CHARACTER_R_CATEGORY;
m_tNode = [SKNode node];
m_tNode.position = CGPointMake(0, (CHARACTER_SIZE/2));
m_tNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(m_character.size.width , 1)];
m_tNode.physicsBody.allowsRotation = NO;
m_tNode.physicsBody.usesPreciseCollisionDetection = YES;
m_tNode.physicsBody.categoryBitMask = CHARACTER_T_CATEGORY;
m_bNode = [SKNode node];
m_bNode.position = CGPointMake(0, -(CHARACTER_SIZE/2));
m_bNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(m_character.size.width, 1)];
m_bNode.physicsBody.allowsRotation = NO;
m_bNode.physicsBody.usesPreciseCollisionDetection = YES;
m_bNode.physicsBody.categoryBitMask = CHARACTER_B_CATEGORY;
[m_character addChild:m_tNode];
[m_character addChild:m_bNode];
[m_character addChild:m_lNode];
[m_character addChild:m_rNode];
-(void)didBeginContact:(SKPhysicsContact *)contact {
if (contact.bodyA.categoryBitMask == WALL_CATEGORY) {
switch (contact.bodyB.categoryBitMask) {
case CHARACTER_T_CATEGORY:
NSLog(@"Top");
m_isHitTop = true;
break;
case CHARACTER_B_CATEGORY:
NSLog(@"Bottom");
m_isHitBottom = true;
break;
case CHARACTER_L_CATEGORY:
NSLog(@"Left");
m_isHitLeft = true;
break;
case CHARACTER_R_CATEGORY:
NSLog(@"Right");
m_isHitRight = true;
break;
}
}
}
Zusätzlichen relevanten Code hinzugefügt. Es ist mein Code, also gibt es Variablen unter anderem, aber Sie sollten in der Lage sein, es herauszufinden.
Ihre erste Methode funktioniert wirklich gut, ich weiß nicht, warum ich nicht daran gedacht habe. Vielen Dank! – CMilby
stört es Sie als die richtige Antwort zu markieren, wenn es Ihnen geholfen hat? – hamobi