ios - 让 SKPhysicsBody 变得坚不可摧?

标签 ios objective-c collision sprite-kit

我无法让我的物理墙变得坚不可摧。如果我的玩家节点物理体以缓慢的“速度”与墙壁碰撞,它就会停止。然而,如果它以很快的“速度”移动,它就会穿过墙壁。我的播放器由 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];
    }

我有什么遗漏的吗?

最佳答案

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

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

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

另请注意,移动 Action 完全忽略物理世界。如果您发出从墙的一侧到另一侧的移动,那么移动 Action 将继续每帧更新物理主体的位置,然后主体沿途解决其接触,最终将成为“量子隧道”从墙的一侧到另一侧。

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

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

相关文章:

ios - 如何将新项目添加到当前正在播放旧项目的 AVQueuePlayer

ios - 使用 FirebaseApp.configure 时无法找到配置文件 GoogleService-Info.plist(选项 :)

java - 当检测到碰撞时如何移除 Sprite? Libgdx

android - 积分快速变化

Java - 二维数组 map 中的移动和墙壁碰撞

ios - 我的 iOS 委托(delegate)方法是否应该始终在主线程上返回?

ios - 如何灵活地将 UIbuttons 定位在表格中?

objective-c - 目标/C : Sorting an array on a custom order

objective-c - 使用 Objective C 的正确方法

ios - 在 Xcode 10 中添加自定义 UITableViewController header