2013-12-08 2 views
0

여기서 분명히 분명한 사실을 놓치고 있어야합니다. 내 목표 : 화면 중앙에 상자를 만들고 그 상자 안에 수신 거부 공을 둡니다. 경계 상자에 대한 가장자리 기반 SKSpriteNode 및 내부 공에 대한 볼륨 기반 SKShapeNode를 만들려고합니다. 공이 상자 중앙에 나타 내고 상자를 빠져 나와 화면에서 떨어지며 화면 맨 아래에 무언가를 내밀고 마침내 사라지기 전에 바닥 가장자리 위로 몇 번 튀어 오릅니다. 그 동안, didBeginContact는 결코 발생하지 않습니다.SKShapeNode를 SKSpriteNode 범위 내로 유지

질문 1 : 왜 내 공이 보이는 상자를 통해 떨어지지 만 화면 가장자리 아래에 뭔가 접촉하고 있습니까? 내 물리학 자들이 실제 요정에서 어긋나지?

질문 2 : didBeginContact가 실행되지 않는 이유는 무엇입니까? [편집, 좋아, 이거 간단했다. physicsworld.delegate 설정하지 않음]

고마워!

Scene.h

#define MAX_WORLD_CELLS_X 10 
#define MAX_WORLD_CELLS_Y 10 
#define BGTILE_SIZE 100 

typedef enum : uint32_t { 
    TYPE_SUBSPACE  = 1, 
    TYPE_WORLD   = 2, 
    TYPE_CHILD   = 4 
} ColliderTypes; 

@interface helloScene : SKScene 
       <SKPhysicsContactDelegate> 
{ 
    SKSpriteNode *layerSubSpace,*layerWorld; 
} 
@end 

Scene.m, didBeginContact

-(void) didBeginContact:(SKPhysicsContact *)contact 
{ 
    NSLog(@"Function: GameScene.m:didBeginContact"); 
} 

Scene.m, initWithSize

-(id)initWithSize:(CGSize)size 
{ 
    if (self = [super initWithSize:size]) 
    { 
     self.backgroundColor = [SKColor colorWithRed:0.15 green:0.15 blue:0.3 alpha:1.0]; 
     CGSize layerSize = CGSizeMake(MAX_WORLD_CELLS_X * BGTILE_SIZE *2, MAX_WORLD_CELLS_Y * BGTILE_SIZE *2); 
     layerSubSpace = [SKSpriteNode spriteNodeWithColor:[UIColor redColor] size:layerSize]; 

     //center subSpace on the screen's center 
     layerSubSpace.position = CGPointMake(CGRectGetMidX(self.frame),   
             CGRectGetMidY(self.frame));   

     CGRect subspaceRect = CGRectMake(-layerSubSpace.size.width/2, -layerSubSpace.size.height/2, layerSubSpace.size.width, layerSubSpace.size.height); 
     layerSubSpace.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:subspaceRect]; 
     layerSubSpace.physicsBody.affectedByGravity = NO; 
     layerSubSpace.physicsBody.categoryBitMask = TYPE_SUBSPACE; 
     layerSubSpace.physicsBody.contactTestBitMask = TYPE_WORLD; 
     layerSubSpace.physicsBody.collisionBitMask = TYPE_WORLD; 
     [self addChild:layerSubSpace]; 

     SKShapeNode *ball = [[SKShapeNode alloc] init]; 
     CGMutablePathRef myPath = CGPathCreateMutable(); 
     CGPathAddArc(myPath, NULL, 0,0, 60, 0, M_PI*2, YES); 
     ball.path = myPath; 
     ball.lineWidth = 1.0; 
     ball.fillColor = [SKColor blueColor]; 

     ball.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:60]; 
     ball.physicsBody.restitution = 1; 
     ball.physicsBody.categoryBitMask = TYPE_WORLD; 
     ball.physicsBody.collisionBitMask = TYPE_SUBSPACE; 
     ball.physicsBody.contactTestBitMask = TYPE_SUBSPACE; 
     [layerSubSpace addChild:ball]; 
    } 

    layerSubSpace.xScale = 0.25; 
    layerSubSpace.yScale = 0.25; 

    return self; 
} 

답변

1

1) 물리 시뮬레이션이 일렬로 늘어서되지 않는 이유 시각적 표현을 사용하면 x/yScale 속성을으로 설정 한 것입니다.에서 0.25. 이러한 속성은 스프라이트의 시각적 표현에는 영향을 미치지 만 기본 물리 모델에는 영향을주지 않습니다. 기본 문제는 각 크기에서 볼과 상자의 크기가 4 배 줄어들지 만 공이 떨어지는 거리는 전혀 줄어들지 않는다는 것입니다.

나는 x/yScale 속성에 의존하기보다는 단순히 모든 요소의 크기를 명시 적으로 4 배로 줄이는 것이 해결책이라고 생각합니다. BGTILE_SIZE을 25로, 원의 반지름을 CGPathAddArcbodyWithCircleOfRadius:으로 15로 줄이면 공이 iPad 시뮬레이터의 상자 하단에 놓입니다.

2) 말씀 드린대로 self.physicsWorld.contactDelegate = self;

+0

감사합니다. 좋은 지적입니다. BGTILE_SIZE를 줄이면 실제로 화면 내에 물리 상자를 넣을 수 있습니다. 하지만, 여기에, 그것은 여전히 ​​SKSpriteNode와 관련된 빨간색 상자보다 큽니다. 스프라이트와 물리학 체의 크기를 계산할 때 같은 요소를 사용했기 때문에 크기와 크기가 일치 할 것으로 예상했습니다. 물리학 자의 상자가 스프라이트에 맞지 않는 이유는 무엇입니까? – Thunk

+0

@Thunk 죄송합니다. 테스트 프로젝트에 코드를 복사 할 때'xScale'과'yScale'을 설정하는 줄을 놓쳤습니다. 내 대답을 업데이트하여 모든 것이 여전히 보이지 않는 이유를 설명했습니다. – godel9

+0

고마워요, 저를 올바른 길로 인도하십시오. layerSubSpace보다는 전체 장면을 확장하면 원하는 결과를 얻을 수 있습니다. 화면에 비례하여 상자 (부분 공간)의 크기를 변경할 수 있으며 줌은 줌에 관계없이 공이 정확히 그대로 유지됩니다. – Thunk

관련 문제