我无法使我的墙壁物理身体坚不可摧。如果我的播放器节点物理物体以缓慢的“速度”与墙碰撞,则它将停止。但是,如果它以快速的“速度”前进,它将穿过墙壁。我的播放器被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;

如果有帮助,这是我的move方法:
-(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];
    }

我有什么想念的吗?

最佳答案

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

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

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

还要注意,移动动作完全忽略了物理世界。如果您执行从墙的一侧到另一侧的移动,那么该移动动作将继续在每一帧中更新物理物体的位置,然后物体沿路径解析其接触,最终将“量子隧道”从墙的一侧到另一侧。

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

关于ios - 使SKPhysicsBody坚不可摧?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19042933/

10-09 01:48