2

我无法让我的墙物理体无法穿透。如果我的玩家节点物理体以较慢的“速度”与墙壁碰撞,它就会停止。但是,如果它以很快的“速度”前进,它就会穿过墙壁。我的播放器被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];
    }

有什么我想念的吗?

4

1 回答 1

4

通常在纯物理驱动的世界中,实现精确的碰撞检测就足够了。

但是,由于您允许用户定位身体,因此没有什么可以阻止用户将身体的位置设置到墙内的某个位置或完全跳过墙。然后 Box2D 的接触解析介入并将身体移动到碰撞之外,这取决于身体在墙内的放置位置,这将导致身体移动到另一侧。

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

另请注意,移动动作完全忽略了物理世界。如果您发出从墙的一侧到另一侧的移动,那么移动动作将继续在每一帧更新物理体的位置,然后身体在此过程中解决其接触,最终将“量子隧道”从墙的一侧到另一侧。

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

于 2013-09-27T08:09:22.753 回答