我无法让我的墙物理实体无法穿透。如果我的玩家节点物理体以较慢的“速度”与墙壁碰撞,它就会停止。但是,如果它以很快的“速度”前进,它就会穿过墙壁。我的播放器被 PanGestureRecognizer 移动。所谓速度,我的意思是如果突然“快速”滑动或者手势不是缓慢移动的平移手势,那么玩家就会穿过墙壁。这些是我的节点属性:
self.player.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.player.size];
self.player.physicsBody.categoryBitMask = SVGPlayerCategory;
self.player.physicsBody.contactTestBitMask = SVGWallCategory;
self.player.physicsBody.collisionBitMask = SVGWallCategory;
self.player.physicsBody.dynamic = YES;
self.player.physicsBody.usesPreciseCollisionDetection = YES;
self.player.physicsBody.velocity = CGVectorMake(0, 0);
self.leftWall.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.leftWall.size];
self.leftWall.physicsBody.categoryBitMask = SVGWallCategory;
self.leftWall.physicsBody.contactTestBitMask = SVGPlayerCategory;
self.leftWall.physicsBody.collisionBitMask = SVGPlayerCategory;
self.leftWall.physicsBody.dynamic = NO;
self.leftWall.physicsBody.resting = YES;
如果有帮助,这是我的移动方法:
-(void)dragPlayer: (UIPanGestureRecognizer *)gesture {
CGPoint translation = [gesture translationInView:self.view];
SKAction *move = [SKAction moveByX:translation.x y:-translation.y duration:0];
[self.player runAction:move];
[gesture setTranslation:CGPointMake(0, 0) inView:self.view];
}
我有什么遗漏吗?
Best Answer-推荐答案 strong>
通常在纯物理驱动的世界中,实现精确的碰撞检测就足够了。
但是,由于您允许用户定位 body ,因此没有什么可以阻止用户将 body 的位置设置到墙内的某个位置或完全跳过墙。然后 Box2D 的接触解析介入并将 body 移动到碰撞之外,这取决于 body 在墙内的位置将导致 body 被移动到另一侧。
在这种情况下使用操作会适得其反。如果触摸每帧生成一个新位置,则不会发生任何运动,但这会导致 body 被设置到给定位置。尝试更改代码以直接设置玩家的位置,看看是否有任何不同。
还要注意,移动 Action 完全忽略了物理世界。如果您发出从墙的一侧到另一侧的移动,那么移动 Action 将继续在每一帧更新物理体的位置,然后 body 在此过程中解决其接触,最终将“量子隧道”从墙的一侧到另一侧。
导致此问题的部分原因可能是用户快速滑动时两个触摸位置之间的距离过大。您或许应该使用物理世界的 bodyAlongRayStart:end: 方法来测试当前位置和目标位置之间是否存在阻挡体(手势转换),如果是,则取消移动。
关于ios - 让 SKPhysicsBody 无法穿透?,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/19042933/
|