2013-09-27 39 views
2

我无法让我的墙体物理机构难以穿透。如果我的播放器节点物理主体以缓慢的“速度”与墙壁相撞,则停止。但是,如果它以“快速”的速度进行,它会穿过墙壁。我的球员被PanGestureRecognizer移动。通过速度,我基本上是指如果突然出现“快速”滑动,或者手势不是缓慢移动的平移手势,那么玩家会穿过墙壁。这是我的节点属性:让SKPhysicsBody难以穿透?

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]; 
    } 

有什么我失踪?

回答

4

通常情况下,在一个纯物理驱动的世界,使精确的碰撞检测就足够了。

但是,由于您允许用户定位身体,因此没有什么能够阻止用户将身体位置设置到墙内某处或完全跳过墙壁。然后Box2D的接触分辨率进入并将碰撞体外的身体移动,这取决于身体放置在墙内的位置将导致身体移动到另一侧。

在这种情况下使用动作会适得其反。如果触摸每帧产生一个新的位置,则没有任何运动正在进行,但是这导致身体被设置到给定位置。尝试改变代码直接设置玩家的位置,看看是否有任何区别。

另请注意,移动操作完全忽略了物理世界。如果你发出一个从墙的一侧移动到另一侧的移动,那么移动动作将继续在每一帧中更新物理体的位置,随后身体将沿着它的方向解析它的接触,并最终将“量子隧道”从墙的一侧到另一侧。

这个问题的部分原因可能是用户在快速滑动时两个触摸位置之间的距离很大。您应该使用物理世界的bodyAlongRayStart:end:方法来测试当前位置和目标位置之间是否存在阻塞物体(手势转换),如果是,则取消移动。