여기서 분명히 분명한 사실을 놓치고 있어야합니다. 내 목표 : 화면 중앙에 상자를 만들고 그 상자 안에 수신 거부 공을 둡니다. 경계 상자에 대한 가장자리 기반 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;
}
감사합니다. 좋은 지적입니다. BGTILE_SIZE를 줄이면 실제로 화면 내에 물리 상자를 넣을 수 있습니다. 하지만, 여기에, 그것은 여전히 SKSpriteNode와 관련된 빨간색 상자보다 큽니다. 스프라이트와 물리학 체의 크기를 계산할 때 같은 요소를 사용했기 때문에 크기와 크기가 일치 할 것으로 예상했습니다. 물리학 자의 상자가 스프라이트에 맞지 않는 이유는 무엇입니까? – Thunk
@Thunk 죄송합니다. 테스트 프로젝트에 코드를 복사 할 때'xScale'과'yScale'을 설정하는 줄을 놓쳤습니다. 내 대답을 업데이트하여 모든 것이 여전히 보이지 않는 이유를 설명했습니다. – godel9
고마워요, 저를 올바른 길로 인도하십시오. layerSubSpace보다는 전체 장면을 확장하면 원하는 결과를 얻을 수 있습니다. 화면에 비례하여 상자 (부분 공간)의 크기를 변경할 수 있으며 줌은 줌에 관계없이 공이 정확히 그대로 유지됩니다. – Thunk