2014-11-18 3 views
0

내 didBeginContact 메서드는 공이 충돌 할 때 내 벽돌 스프라이트를 제거해야합니다. 그러나 그것은 그 일을하지 않습니다. 내가 그것을 실행할 때, 패들을 치고 벽돌을 때릴 때 NSLog "패들 (paddle)"을 얻습니다. 코드를 여러 번 살펴 봤는데 누군가가 여기에 참여하는 걸 말해 줄 수 있습니까?didBeginContact 메서드가 작동하지 않습니다.

@interface GameScene() 

@property (nonatomic) SKSpriteNode *paddle; 

@end 


static const uint32_t ballCategory = 1;  //00000000000000000000000000000001 
static const uint32_t brickCategory = 2;  //00000000000000000000000000000010 
static const uint32_t paddleCategory = 4;  //00000000000000000000000000000100 
static const uint32_t edgeCategory = 8;  //00000000000000000000000000001000 
static const uint32_t bottomEdgeCategory = 16; //00000000000000000000000000010000 


@implementation GameScene 

-(void)didBeginContact:(SKPhysicsContact *)contact { 

    //create placeholder for the "non ball" object 
    SKPhysicsBody *notTheBall; 



    if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask) { 
     notTheBall = contact.bodyB; 
    } else { 
     notTheBall = contact.bodyB; 
    } 
    if (notTheBall.categoryBitMask == brickCategory) { 
     NSLog(@"brick"); 
     [notTheBall.node removeFromParent]; 
    } else { 
     NSLog(@"paddle"); 
    } 


} 

- (void) addBall:(CGSize)size { 
    //create sprite with image 
    SKSpriteNode *ball = [SKSpriteNode spriteNodeWithImageNamed:@"ball"]; 
    //resize sprite 
    ball.size = CGSizeMake(33, 33); 
    //position it 
    ball.position = CGPointMake(size.width/2, size.height/2); 
    //give physics to ball 
    ball.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:ball.frame.size.width/2]; 
    ball.physicsBody.friction = 0; 
    ball.physicsBody.linearDamping = 0; 
    ball.physicsBody.restitution = 1.0f; 
    ball.physicsBody.categoryBitMask = ballCategory; 
    ball.physicsBody.contactTestBitMask = brickCategory | paddleCategory; 


    //add sprite to scene 
    [self addChild:ball]; 

    //create vector 
    CGVector myVector = CGVectorMake(20, 20); 
    //apply vector to ballphysics body 
    [ball.physicsBody applyImpulse:myVector]; 

} 

- (void) addBricks:(CGSize)size { 
    for (int i = 0; i < 5; i++) { 
     //create brick sprite from image 
     SKSpriteNode *brick = [SKSpriteNode spriteNodeWithImageNamed:@"brick"]; 
     //resize bricks 
     brick.size = CGSizeMake(60, 30); 
     //psoition bricks 
     int xPos = size.width/5 * (i+.5); 
     int yPos = size.height - 25; 
     brick.position = CGPointMake(xPos, yPos); 
     brick.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:brick.frame.size]; 
     brick.physicsBody.dynamic = NO; 
     brick.physicsBody.categoryBitMask = brickCategory; 


     //add bricks to scene 
     [self addChild:brick]; 



    } 
} 

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ 
    for (UITouch *touch in touches) { 
     CGPoint location = [touch locationInNode:self]; 
     CGPoint newPosition = CGPointMake(location.x, 100); 


     //stop the paddle from going too far 
     if (newPosition.x < self.paddle.size.width/ 2) { 
      newPosition.x = self.paddle.size.width/ 2; 

     } 
     if (newPosition.x > self.size.width - (self.paddle.size.width/ 2)) { 
      newPosition.x = self.size.width - (self.paddle.size.width/ 2); 

     } 
     self.paddle.position = newPosition; 
    } 


} 


-(void) addPlayer:(CGSize)size { 

    //create player paddle 
    self.paddle = [SKSpriteNode spriteNodeWithImageNamed:@"paddle"]; 
    //resize paddle 
    self.paddle.size = CGSizeMake(125, 31.25); 
    //position it 
    self.paddle.position = CGPointMake(size.width/2, 100); 
    //add a physics body 
    self.paddle.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.paddle.frame.size]; 
    //make it static 
    self.paddle.physicsBody.dynamic = NO; 
    self.paddle.physicsBody.categoryBitMask = paddleCategory; 

    //add sprite paddle 
    [self addChild:self.paddle]; 
} 




-(instancetype)initWithSize:(CGSize)size { 
    if (self = [super initWithSize:size]){ 
     self.backgroundColor = [SKColor colorWithRed:(29.0f/255) green:(29.0f/255) blue:(29.0f/255) alpha:1.0]; 

     //change gravity 
     self.physicsWorld.gravity = CGVectorMake(0, 0); 
     self.physicsWorld.contactDelegate = self; 

     //add physics body to scene 
     self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame]; 
     self.physicsBody.categoryBitMask = edgeCategory; 


     [self addPlayer:size]; 
     [self addBricks:size]; 
     [self addBall:size]; 

    } 
    return self; 
} 

@end 
+0

'notTheBall'가 contact.bodyA' '로 설정되어야 할 때'조건 if' 거짓입니다. – 0x141E

+0

그래, 그걸 알아 냈고 답을 올렸습니다. 감사합니다 @ 0x141E –

답변

1

나는 무슨 일이 일어나고 있는지 알아 냈습니다. bodyA.categoryBitMask가 bodyB.categoryBitMask보다 높은 경우 bodyA를 볼이 아닌 객체로 만들 필요가있을 때 실수로 비 공 객체가 첫 번째 코드 스 니펫에서 bodyB로 선언되었음을 실수로 나타냅니다.

아래 코드는 문제가있는 곳입니다.

-(void)didBeginContact:(SKPhysicsContact *)contact { 
 

 
    //create placeholder for the "non ball" object 
 
    SKPhysicsBody *notTheBall; 
 
    
 

 
    
 
    if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask) { 
 
     notTheBall = contact.bodyB; 
 
    } else { 
 
     notTheBall = contact.bodyB; 
 
    } 
 
    if (notTheBall.categoryBitMask == brickCategory) { 
 
     NSLog(@"brick"); 
 
     [notTheBall.node removeFromParent]; 
 
    } else { 
 
     NSLog(@"paddle"); 
 
    } 
 
    
 

 
}

이 코드 고정 문제 가지고

-(void)didBeginContact:(SKPhysicsContact *)contact { 
 

 
    //create placeholder for the "non ball" object 
 
    SKPhysicsBody *notTheBall; 
 
    
 

 
    
 
    if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask) { 
 
     notTheBall = contact.bodyB; 
 
    } else { 
 
     notTheBall = contact.bodyA; 
 
    } 
 
    if (notTheBall.categoryBitMask == brickCategory) { 
 
     NSLog(@"brick"); 
 
     [notTheBall.node removeFromParent]; 
 
    } else { 
 
     NSLog(@"paddle"); 
 
    } 
 
    
 

 
}

관련 문제