我一直致力于一款益智游戏,该游戏使用可自定义的网格,其中的级别是在场景进行时预设和创建的。它们由散布在网格周围的静态块和可移动的玩家控制块组成。世界的引力是可控制的,并且块在那个方向上(向上,向下,向左,向右)。我正在使用SKContactDelegate
来跟踪播放器块何时触摸一个块或网格的边缘并将其停在原位。
我遇到的问题涉及块和网格边缘的物理实体。
我使用bodyWithRectOfSize
作为块,bodyWithEdgeLoopFromRect
作为网格边框。
放置在网格中的1x1块的物理主体和玩家1x1块具有正常的物理主体(应该是它们)。但是,较大的块ex:1x5,主体在y轴上向下移动是没有理由的。同样取决于网格大小,网格边缘将被随机数偏移。注意:主体是偏移的,节点本身位于正确的位置。
这是创建块的代码;这个工作正常 (cellsize是每个网格空间的大小)
基本1x1块
-(SKShapeNode *)basic {
CGRect blockRect = CGRectMake(10, 10, self.cellSize, self.cellSize);
UIBezierPath *blockPath = [UIBezierPath bezierPathWithRoundedRect:blockRect cornerRadius:8];
SKShapeNode *blockNode = [SKShapeNode node];
blockNode.path = blockPath.CGPath;
blockNode.fillColor =[UIColor blackColor];
blockNode.lineWidth = 0;
blockNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:blockRect.size];
blockNode.physicsBody.categoryBitMask = blockCategory;
blockNode.physicsBody.dynamic = NO;
return blockNode;
}
和自定义块(在y轴上向下偏移)
-(SKShapeNode *)basicWithWidth:(int)width WithHeight:(int)height {
CGRect blockRect = CGRectMake(10, 10, self.cellSize * width, self.cellSize * height);
UIBezierPath *blockPath = [UIBezierPath bezierPathWithRoundedRect:blockRect cornerRadius:8];
SKShapeNode *blockNode = [self basic];
blockNode.path = blockPath.CGPath;
blockNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:blockRect.size];
blockNode.physicsBody.categoryBitMask = blockCategory;
blockNode.physicsBody.dynamic = NO;
return blockNode;
}
这是网格边缘
SKShapeNode *edge = [SKShapeNode node];
CGRect edgeRect = CGRectMake(10, 10, 260, 260);
UIBezierPath *edgeShape = [UIBezierPath bezierPathWithRoundedRect:edgeRect cornerRadius:8];
edge.path = edgeShape.CGPath;
edge.lineWidth = 0;
edge.fillColor = [UIColor grayColor];
edge.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:edgeRect];
edge.physicsBody.categoryBitMask = boardCategory;
[self addChild:edge];
注意:边和块是“棋盘”节点的子节点,该节点是游戏场景的子节点
感谢您阅读本文。
答案 0 :(得分:0)
当您使用SKPhysicsBody
的{{3}}时,它以其节点的原点为中心。在您的情况下,您想要做的是将它们置于定义节点的矩形的中心。为此,请改用bodyWithRectangleOfSize:
。
例如,您使用rect定义块:
CGRect blockRect = CGRectMake(10, 10, self.cellSize, self.cellSize);
所以,你希望你的physicsBody
集中在那个矩形的中心。您可以轻松获得CGRect
的中心位置:
CGPoint center = CGPointMake(CGRectGetMidX(blockRect), CGRectGetMidY(blockRect));
要创建居中的physicsBody,请使用:
blockNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:blockRect.size center:center];
注意: bodyWithRectangleOfSize:center:
仅适用于iOS 7.1及更高版本
iOS 7.0方法
对于iOS 7.0,您可以使用bodyWithPolygonFromPath:
代替,它只需要额外的一行代码:
CGPathRef blockPath = CGPathCreateWithRect(blockRect, nil);
blockNode.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath: blockPath];