2013-12-11 3 views
4

SKSpriteNode를 서브 클래 싱하는 동안 문제가 발생했습니다. SKSpriteNode를 서브 클래 싱 할 때 물리학 문제가 발생합니까?

@implementation SSSquirrel 
- (id) init { 
    if (self = [super init]) { 

     // Create Squirrel and physics body 
     SKSpriteNode *squirrel = [SKSpriteNode spriteNodeWithImageNamed:@"squirrelNormal"]; 
     squirrel.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:squirrel.size.width/2 - 10]; 
     squirrel.physicsBody.dynamic = NO; 
     squirrel.physicsBody.affectedByGravity = NO; 
     squirrel.physicsBody.restitution = 0.8; 
     squirrel.physicsBody.friction = 0.1; 
     squirrel.zPosition = 1.0; 

     [self addChild:squirrel]; 

    } 
    return self; 
} 

@end 

그럼 내가 그렇게 나의 주요 게임 장면에서 다람쥐를 만드는 오전 : 여기에 서브 클래스의 내 구현입니다

SSSquirrel *squirrel1 = [[SSSquirrel alloc] init]; 
    squirrel1.position = CGPointMake(offset, self.frame.size.height - offset); 
    [self addChild:squirrel1]; 

모든 것이 잘 생성됩니다. 그러나 게임 플레이 중에 터치가 시작되면 다람쥐 물리학 자 본문을 "일시 중단"한 다음 터치가 끝나면 다시 활성화합니다 (tempSquirrelBody는 장면의 SKPhysicsBody 인스턴스 변수 임). 기본적으로 나는 사용자가 화면을 터치하는 동안 다람쥐가 사용자쪽으로 그리고 다른 물건 위로 움직이고 있다는 환상을주기 위해 노력하고 있습니다.

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
/* Called when a touch begins */ 

for (UITouch *touch in touches) { 

    tempSquirrelBody = squirrel1.physicsBody; 
    squirrel1.physicsBody = nil; 

    CGPoint newPosition = squirrel1.position; 
    newPosition.x -= 60; 
    newPosition.y += 60; 

    squirrel1.position = newPosition; 
    squirrel1.texture = [SKTexture textureWithImageNamed:@"squirrelUp"]; 

} 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
/* Called when a touch ends */ 

for (UITouch *touch in touches) { 

    CGPoint newPosition = squirrel1.position; 
    newPosition.x += 60; 
    newPosition.y -= 60; 
    squirrel1.position = newPosition; 
    squirrel1.texture = [SKTexture textureWithImageNamed:@"squirrelNormal"]; 

    squirrel1.physicsBody = tempSquirrelBody; 

} 

} 

이것은 불행히도 작동하지 않습니다. 물리학자가 보류되지 않고 다람쥐가 물리학자가 제로로 설정되어야 할 때 다른 객체와 충돌합니다. SSSquirrel 클래스에서 게임 장면으로 코드를 옮길 때 작동합니다. 내가 뭘 잘못하고 있니?

감사합니다. 단지 0collisionBitMask을 설정하는 대신 nil에 전체 physicsBody을 설정하는

+0

마침내 내가 잘못한 것을 깨달았습니다. 내 SSSquirrel 클래스에서 필자는 물리 본문을 자기보다는 SKSpriteNode에 할당하여 클래스 외부의 나를 액세스 할 수 없도록했습니다. – jnicks

답변

1

은 쉽게하지 않을까요?

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
/* Called when a touch begins */ 

for (UITouch *touch in touches) { 

    squirrel1.physicsBody.collisionBitMask = 0; 

    CGPoint newPosition = squirrel1.position; 
    newPosition.x -= 60; 
    newPosition.y += 60; 

    squirrel1.position = newPosition; 
    squirrel1.texture = [SKTexture textureWithImageNamed:@"squirrelUp"]; 

} 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
/* Called when a touch ends */ 

for (UITouch *touch in touches) { 

    CGPoint newPosition = squirrel1.position; 
    newPosition.x += 60; 
    newPosition.y -= 60; 
    squirrel1.position = newPosition; 
    squirrel1.texture = [SKTexture textureWithImageNamed:@"squirrelNormal"]; 

    squirrel1.physicsBody.collisionBitMask = 0xFFFFFFFF; 

} 

} 
+0

그래, 충돌을 막는 훨씬 더 좋은 방법이지만, 내 방식은 여전히 ​​올바르게 작동합니다. 내가 물리 구조체를 자기보다는 SKSpriteNode에 할당했기 때문에 클래스 외부의 나를 액세스 할 수 없게되었습니다. – jnicks